Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 38fdd1d2
由
sunke
编写于
2021-07-14 09:25:57 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
架构调整
1 个父辈
78b0f051
隐藏空白字符变更
内嵌
并排
正在显示
30 个修改的文件
包含
1435 行增加
和
456 行删除
src/main/java/com/neotel/smfcore/common/base/IBaseDao.java
src/main/java/com/neotel/smfcore/common/utils/StorageConstants.java
src/main/java/com/neotel/smfcore/core/barcode/bean/BarcodeRule.java
src/main/java/com/neotel/smfcore/core/barcode/bean/CodeBean.java
src/main/java/com/neotel/smfcore/core/service/data/PlateSizeBean.java → src/main/java/com/neotel/smfcore/core/barcode/bean/PlateSizeBean.java
src/main/java/com/neotel/smfcore/core/barcode/enums/CODE_TYPE.java
src/main/java/com/neotel/smfcore/core/barcode/enums/COMPONENT_TYPE.java
src/main/java/com/neotel/smfcore/core/barcode/service/dao/impl/BarcodeDaoImpl.java
src/main/java/com/neotel/smfcore/core/barcode/service/dao/impl/ComponentDaoImpl.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IBarcodeManager.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IComponentManager.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/BarcodeManagerImpl.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/ComponentManagerImpl.java
src/main/java/com/neotel/smfcore/core/barcode/service/po/Barcode.java
src/main/java/com/neotel/smfcore/core/barcode/service/po/Component.java
src/main/java/com/neotel/smfcore/core/barcode/utils/CodeResolve.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/service/manager/IStoragePosManager.java
src/main/java/com/neotel/smfcore/core/service/data/UsageItem.java → src/main/java/com/neotel/smfcore/core/storage/bean/UsageItem.java
src/main/java/com/neotel/smfcore/core/service/dao/IStorageDao.java → src/main/java/com/neotel/smfcore/core/storage/service/dao/IStorageDao.java
src/main/java/com/neotel/smfcore/core/service/dao/IStoragePosDao.java → src/main/java/com/neotel/smfcore/core/storage/service/dao/IStoragePosDao.java
src/main/java/com/neotel/smfcore/core/service/dao/impl/StorageDaoImpl.java → src/main/java/com/neotel/smfcore/core/storage/service/dao/impl/StorageDaoImpl.java
src/main/java/com/neotel/smfcore/core/storage/service/dao/impl/StoragePosDaoImpl.java
src/main/java/com/neotel/smfcore/core/service/manager/IStorageManager.java → src/main/java/com/neotel/smfcore/core/storage/service/manager/IStorageManager.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
src/main/java/com/neotel/smfcore/core/service/manager/impl/StorageManagerImpl.java → src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StorageManagerImpl.java
src/main/java/com/neotel/smfcore/core/service/manager/impl/StoragePosManagerImpl.java → src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/core/service/po/Storage.java → src/main/java/com/neotel/smfcore/core/storage/service/po/Storage.java
src/main/java/com/neotel/smfcore/core/service/po/StoragePos.java → src/main/java/com/neotel/smfcore/core/storage/service/po/StoragePos.java
src/main/java/com/neotel/smfcore/common/base/IBaseDao.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
common
.
base
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.MongoTemplate
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.data.mongodb.core.query.Update
;
...
...
@@ -54,5 +55,7 @@ public interface IBaseDao {
void
updateFirst
(
Query
query
,
Update
update
);
MongoTemplate
getMongoTemplate
();
}
src/main/java/com/neotel/smfcore/common/utils/StorageConstants.java
查看文件 @
38fdd1d
...
...
@@ -209,56 +209,6 @@ public class StorageConstants {
EFFICIENCY
,
FIFO
,
USED_FIRST
,
EXPIRE_FIRST
,
PRODUCE_DATE
;
}
/**
* 物料类型
*/
public
static
class
COMPONENT_TYPE
{
public
static
final
int
COMPONENT
=
0
;
/** 锡膏 */
public
static
final
int
SOLDERPASTE
=
1
;
/** PCB板 */
public
static
final
int
PCB
=
2
;
/** 其他物料*/
public
static
final
int
OTHERS
=
3
;
/** 夹具 */
public
static
final
int
FIXTURE
=
4
;
}
/**
* 二维码类型,用于在界面上展示对应的图片
*/
public
static
enum
CODE_TYPE
{
COMPONENT
,
PCB
,
OTHERS
,
PCB_FIXTURE
,
SOLDER_FIXTURE
,
FIXTURE
,
/**
* 管装锡膏
*/
TUBE_SOLDER
,
/**
* 罐装锡膏
*/
CAN_SOLDER
;
public
static
CODE_TYPE
fromComponentType
(
int
type
){
switch
(
type
){
case
COMPONENT_TYPE
.
COMPONENT
:
return
COMPONENT
;
case
COMPONENT_TYPE
.
FIXTURE
:
return
FIXTURE
;
case
COMPONENT_TYPE
.
OTHERS
:
return
OTHERS
;
case
COMPONENT_TYPE
.
PCB
:
return
PCB
;
}
return
null
;
}
}
/**
* 图表展示方式
*/
...
...
src/main/java/com/neotel/smfcore/core/barcode/bean/BarcodeRule.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
bean
;
import
com.google.common.base.Strings
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
java.util.Calendar
;
import
java.util.Date
;
/**
*
* 条码规则,可用字段有:
* PN为物料编号即 PartNumber
* RI 为唯一码即ReelId,[RI]为所有字符串作为一个唯一码
* QTY 为数量
* PRODATE为生产日期xxPRODATEyyyyMMdd
* EXPDATE为过期日期xxxEXPDATEyyyyMMdd
* SP 为供应商,
* BATCH 为批次
* MSL 为MSL等级
* MEMO 备注信息
*
*
*
*条码规则,可用字段有:
* PN为物料编号即 PartNumber
* RI 为唯一码即ReelId,[RI]为所有字符串作为一个唯一码
* QTY 为数量
* PRODATE为生产日期xxPRODATEyyyyMMdd
* EXPDATE为过期日期xxxEXPDATEyyyyMMdd
* SP 为供应商,
* BATCH 为批次
* MSL 为MSL等级
* 其中必须含有PN和 RI, QTY为空时使用产品档案的封装数量
*
* 前面一位数字大于0表示去除前面第n位, -1表示不去除,并且对字段长数不做限制, 等于0表示不去除,但对字段长度做限制
* 中间一位数字0表示为变长,正值表示从前面截取,负值表示从后面开始截取,前缀和后缀及长度都有效时,需要验证字串总长度
* 后面一位数字大于0表示去除后面第n位, -1表示不去除,并且对字段长数不做限制, 等于0表示不去除,但对字段长度做限制
*
* 例一: QTY[-1:5:-1]取前5位作为数量
* 例二: QTY[-1:-5:-1]取后5位作为数量
* 例三: QTY[1:5:-1]去除前面第1位后,取前5位作为数量
* 例四: QTY[-1:-5:1]去除后面第1位后,取后5位作为数量
* 例五: QTY[1:0:-1]去除前面1位后,剩余的作为数量
* 例六: QTY[0:5:3]去除前面0位和后面3位,剩余的5位作为数量,也就是说只能为8位
*
* 示例:
* 规则为: [RI]_PN_PRODATEyyMMdd_QTY[0:5:4]
* 条码: 4500065747_CS000069_180101_030000041
* 解析后: RI=4500065747_CS000069_180101_030000041
* PN=CS000069
* 生产日期为: 2018年1月1日
* 数量为:去掉前面0位,去掉后面4位,剩下03000正好为5位,所以数量是3000,
* 如果条码变为4500065747_CS000069_180101_0300000410则会提示不合规则,因为去掉前面0位,去掉后面4位,剩下的030004是6位,不是5位
*
* 示例:
* 规则为: BATCH;PRODATEyyyyMMdd[1:8:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI
* 条码为: L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356
* 解析后: PN=8C.R2003.V81
* RI=R506072019102200356
* QTY=3000
* BATCH=L00002019090199951797
* PRODATE=2019年9月1日
* 供应商=50607
*
*
*
* 1@2@3@PN@5@6@7@8@9@10@11@12@13@14@15@16@RI@18@19@20@21@22@23@24
* [)>@06@12S0002@P5292001000@1P1690215@31P1690215@12V527973628@10VCHN-YANTAI@2P@20P@6D20170626@14D20171223@30PY@ZN@K0@16K0@V815@3SB370000000EZZ@Q500GRM000@20T1@1TMT72543954@2T@1Z@@
*
* [@xx@xx@partNO.@xx@xx@xx@xx@xx@生产日期@过期日期@xx@xx@xx@xx@xx@psckid唯一码@重量@xx@xx@xx@xc@@'
*
* 零包
* [)>@06@12S0002@P8638516895@1P08EFP2285A@31P8638516895@12V315754465@10VCHN-KUNSHAN@2P@20P1-K-PR77-XD7179#QX0#@6D20180216@14D20180816@30PY@ZN@K0@16K0@V97219759@3SS000200062918@Q20NAR000@20T1@1T8021___0718@2T@1Z08EFP2285A@@
* 整包
* [)>@06@12S0002@P8638516895@1P08EFP2285A@31P8638516895@12V315754465@10VCHN-KUNSHAN@2P@20P1-K-PR77-XD7179#QX0#@6D20180216@14D20180816@30PY@ZN@K0@16K0@V97219759@3SS000200062909@Q15NAR000@20T1@1T@2T@1Z08EFP2285A@@
*
* Created by sunke on 2017/3/25.
*/
public
class
BarcodeRule
{
protected
final
static
Logger
log
=
LogManager
.
getLogger
(
BarcodeRule
.
class
);
private
BarcodeRule
()
{
}
public
static
BarcodeRule
newRule
(
String
ruleStr
){
BarcodeRule
newRule
=
new
BarcodeRule
();
newRule
.
ruleStr
=
ruleStr
;
log
.
info
(
"开始解析二维码规则:"
+
ruleStr
);
if
(!
Strings
.
isNullOrEmpty
(
ruleStr
)){
//先去除[prefix,length,suffix]这样的配置字段
String
canSplitStr
=
ruleStr
.
replaceAll
(
"DATE.*?\\]"
,
""
);
canSplitStr
=
canSplitStr
.
replaceAll
(
"\\[[^\\]]*?\\]"
,
""
);
//先找分割符,分割出来数组数量最多的放第一个
String
trySeparator
=
""
;
//找最多的字符
String
[]
tempArr
=
new
String
[]{};
for
(
int
i
=
0
;
i
<
canSplitStr
.
length
();
i
++)
{
char
c
=
canSplitStr
.
charAt
(
i
);
if
(!
Character
.
isLetterOrDigit
(
c
)){
//不是字母和数字才可以作为分割符
String
separator
=
toRegexStr
(
c
+
""
);
if
(
trySeparator
.
indexOf
(
c
)
==
-
1
){
String
[]
ss
=
ruleStr
.
split
(
separator
,-
1
);
if
(
ss
.
length
>
tempArr
.
length
){
trySeparator
=
c
+
trySeparator
;
newRule
.
separator
=
separator
;
tempArr
=
ss
;
}
else
{
trySeparator
=
trySeparator
+
c
;
}
};
}
}
log
.
info
(
"分割符为:"
+
newRule
.
separator
+
"长度为:"
+
tempArr
.
length
);
if
(
tempArr
.
length
==
0
){
tempArr
=
new
String
[]{
ruleStr
};
}
for
(
int
i
=
0
;
i
<
tempArr
.
length
;
i
++)
{
String
fieldValue
=
tempArr
[
i
];
if
(!
newRule
.
partNumber_item
.
hasThisField
()){
if
(
newRule
.
partNumber_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"partNumber: 为"
+
newRule
.
partNumber_item
.
toString
());
}
}
if
(!
newRule
.
whole_reelId_item
.
hasThisField
()
&&
!
newRule
.
reelId_item
.
hasThisField
()){
if
(
newRule
.
whole_reelId_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"whole reelId: 为"
+
newRule
.
whole_reelId_item
.
toString
());
}
else
if
(
newRule
.
reelId_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"reelId: 为"
+
newRule
.
reelId_item
.
toString
());
}
}
if
(!
newRule
.
batch_item
.
hasThisField
()){
if
(
newRule
.
batch_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"batch: 为"
+
newRule
.
batch_item
.
toString
());
}
}
if
(!
newRule
.
quantity_item
.
hasThisField
()){
if
(
newRule
.
quantity_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"quantity: 为"
+
newRule
.
quantity_item
.
toString
());
}
}
if
(!
newRule
.
supplier_item
.
hasThisField
()){
if
(
newRule
.
supplier_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"supplier: 为"
+
newRule
.
supplier_item
.
toString
());
}
}
if
(!
newRule
.
msl_item
.
hasThisField
()){
if
(
newRule
.
msl_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"MSL: 为"
+
newRule
.
msl_item
.
toString
());
}
}
if
(!
newRule
.
memo_item
.
hasThisField
()){
if
(
newRule
.
memo_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"MEMO: 为"
+
newRule
.
memo_item
.
toString
());
}
}
if
(!
newRule
.
produceDate_item
.
hasThisField
()){
if
(
newRule
.
produceDate_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"produceDate: 为"
+
newRule
.
produceDate_item
.
toString
());
}
}
if
(!
newRule
.
expireDate_item
.
matchRule
(
fieldValue
,
i
)){
if
(
newRule
.
expireDate_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"expireDate: 为"
+
newRule
.
expireDate_item
.
toString
());
}
}
if
(!
newRule
.
expireYear_item
.
hasThisField
()
&&
!
newRule
.
expireMonth_item
.
hasThisField
()
&&
!
newRule
.
expireDay_item
.
hasThisField
()){
if
(
newRule
.
expireYear_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"expireYear: 为"
+
newRule
.
expireYear_item
.
toString
());
}
else
if
(
newRule
.
expireMonth_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"expireMonth: 为"
+
newRule
.
expireMonth_item
.
toString
());
}
else
if
(
newRule
.
expireDay_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"expireDay: 为"
+
newRule
.
expireDay_item
.
toString
());
}
}
}
boolean
validRule
=
false
;
if
(
newRule
.
partNumber_item
.
hasThisField
()){
if
(
newRule
.
reelId_item
.
hasThisField
()
||
newRule
.
whole_reelId_item
.
hasThisField
()){
validRule
=
true
;
}
}
if
(
validRule
){
newRule
.
length
=
tempArr
.
length
;
}
else
{
log
.
warn
(
"编码规则中必须包含 RI 和 PN"
);
}
}
return
newRule
;
}
private
String
ruleStr
;
private
String
separator
;
private
int
length
=
0
;
//private String[] ruleArr = new String[]{};
private
RuleItem
partNumber_item
=
new
RuleItem
(
"PN"
);
private
RuleItem
reelId_item
=
new
RuleItem
(
"RI"
);
private
RuleItem
whole_reelId_item
=
new
RuleItem
(
"[RI]"
);
private
RuleItem
quantity_item
=
new
RuleItem
(
"QTY"
);
private
RuleItem
produceDate_item
=
new
RuleItem
(
"PRODATE"
);
private
RuleItem
expireDate_item
=
new
RuleItem
(
"EXPDATE"
);
private
RuleItem
expireYear_item
=
new
RuleItem
(
"EXPYEAR"
);
private
RuleItem
expireMonth_item
=
new
RuleItem
(
"EXPMONTH"
);
private
RuleItem
expireDay_item
=
new
RuleItem
(
"EXPDAY"
);
private
RuleItem
supplier_item
=
new
RuleItem
(
"SP"
);
private
RuleItem
batch_item
=
new
RuleItem
(
"BATCH"
);
private
RuleItem
msl_item
=
new
RuleItem
(
"MSL"
);
private
RuleItem
memo_item
=
new
RuleItem
(
"MEMO"
);
private
class
RuleItem
{
private
RuleItem
(
String
ruleName
)
{
this
.
name
=
ruleName
;
}
//名称
private
String
name
;
//位置
private
int
index
=
-
1
;
//前缀(-1时表示没有前缀)如果要验证总长度,可设置为0
private
int
prefix
=
-
1
;
private
int
length
=
0
;
//后缀(-1时表示没有前缀)如果要验证总长度,可设置为0
private
int
suffix
=
-
1
;
//日期格式
private
String
formatStr
=
""
;
@Override
public
String
toString
()
{
return
"{"
+
"name='"
+
name
+
'\''
+
", index="
+
index
+
", prefix='"
+
prefix
+
'\''
+
", length='"
+
length
+
'\''
+
", suffix='"
+
suffix
+
'\''
+
'}'
;
}
/**
* 解析规则中是否包含本字段
*/
private
boolean
hasThisField
(){
return
index
!=
-
1
;
}
private
boolean
matchRule
(
String
ruleValue
,
int
ruleIndex
){
int
nameIndex
=
ruleValue
.
indexOf
(
name
);
if
(
nameIndex
>=
0
){
int
startIndex
=
ruleValue
.
indexOf
(
"["
,
nameIndex
+
1
);
if
(
startIndex
>
0
){
int
endIndex
=
ruleValue
.
indexOf
(
"]"
,
nameIndex
);
if
(
endIndex
>
startIndex
){
index
=
ruleIndex
;
String
limitStr
=
ruleValue
.
substring
(
startIndex
+
1
,
endIndex
);
String
[]
limitInfo
=
limitStr
.
split
(
":"
);
prefix
=
Integer
.
valueOf
(
limitInfo
[
0
]);
length
=
Integer
.
valueOf
(
limitInfo
[
1
]);
suffix
=
Integer
.
valueOf
(
limitInfo
[
2
]);
if
(
isDateField
()){
//取日期格式
formatStr
=
ruleValue
.
substring
(
nameIndex
+
name
.
length
(),
startIndex
);
}
}
}
else
{
prefix
=
ruleValue
.
substring
(
0
,
nameIndex
).
length
();
if
(
isDateField
()){
suffix
=
0
;
formatStr
=
ruleValue
.
substring
(
nameIndex
+
name
.
length
());
}
else
{
suffix
=
ruleValue
.
substring
(
nameIndex
+
name
.
length
()).
length
();
}
if
(
prefix
==
0
){
prefix
=
-
1
;
}
if
(
suffix
==
0
){
suffix
=
-
1
;
}
index
=
ruleIndex
;
}
return
true
;
}
return
false
;
}
private
boolean
isDateField
(){
return
name
.
contains
(
"DATE"
);
}
private
String
getStrValue
(
String
[]
codeArr
){
try
{
if
(
index
!=
-
1
){
String
codeValue
=
codeArr
[
index
];
if
(
codeValue
.
length
()
<
prefix
+
suffix
){
return
null
;
}
//如果有前缀和后缀
if
(
prefix
>
0
){
codeValue
=
codeValue
.
substring
(
prefix
);
}
if
(
suffix
>
0
){
codeValue
=
codeValue
.
substring
(
0
,
codeValue
.
length
()
-
suffix
);
}
if
(
length
>
0
){
if
(
prefix
>=
0
&&
suffix
>=
0
){
if
(
codeValue
.
length
()
!=
length
){
log
.
info
(
codeValue
+
"的长度不是"
+
length
);
return
null
;
}
}
//从前面取length位
if
(
codeValue
.
length
()
>=
length
){
return
codeValue
.
substring
(
0
,
length
);
}
}
else
if
(
length
<
0
){
return
codeValue
.
substring
(
codeValue
.
length
()+
length
,
codeValue
.
length
());
}
//是否是日期
// if(!isDateField()){
// if(codeValue.length() < suffix){
// return null;
// }
// codeValue = codeValue.substring(0,codeValue.length() - suffix);
// }
return
codeValue
;
}
}
catch
(
Exception
e
){
log
.
error
(
"解析出错:"
,
e
);
}
return
null
;
}
private
int
getIntValue
(
String
[]
codeArr
){
String
value
=
getStrValue
(
codeArr
);
if
(!
Strings
.
isNullOrEmpty
(
value
)){
try
{
return
Float
.
valueOf
(
value
).
intValue
();
}
catch
(
Exception
ex
){
log
.
warn
(
value
+
" is not a validate int"
);
}
}
return
-
1
;
}
private
Date
getDateValue
(
String
[]
codeArr
){
String
value
=
getStrValue
(
codeArr
);
if
(!
Strings
.
isNullOrEmpty
(
value
)){
try
{
//阳光电源有可能是年周,需要转换一下
if
(
value
.
endsWith
(
"00"
)){
log
.
info
(
"转换日期"
);
Date
time
=
DateUtil
.
toDate
(
value
.
substring
(
0
,
2
),
"yy"
);
Calendar
c
=
Calendar
.
getInstance
();
c
.
setTime
(
time
);
int
weekOfYear
=
Integer
.
valueOf
(
value
.
substring
(
2
,
4
));
c
.
set
(
Calendar
.
WEEK_OF_YEAR
,
weekOfYear
);
return
c
.
getTime
();
}
return
DateUtil
.
toDate
(
value
,
formatStr
);
}
catch
(
Exception
ex
){
log
.
warn
(
value
+
" is not a validate date"
);
}
}
return
null
;
}
}
public
CodeBean
toCodeBean
(
String
codeStr
){
log
.
info
(
"开始解析条码["
+
codeStr
+
"]"
);
CodeBean
codeBean
=
new
CodeBean
();
codeBean
.
setCodeStr
(
codeStr
);
//是否带有位置信息
float
locationX
=
-
1
f
;
float
locationY
=
-
1
f
;
int
reelWidth
=
-
1
;
int
reelHeight
=
-
1
;
//=摄像头编号+条码X坐标x条码Y坐标-料盘尺寸=CODE
//=1+123.4x100.5-7x12=CODE或者7x12=CODE
if
(
codeStr
.
startsWith
(
"="
)
&&
codeStr
.
contains
(
"x"
)){
codeStr
=
codeStr
.
substring
(
1
);
String
[]
arr
=
codeStr
.
split
(
"="
,
2
);
String
sizeStr
=
arr
[
0
];
if
(
sizeStr
.
contains
(
"+"
)
&&
sizeStr
.
contains
(
"-"
)){
String
[]
locationSizeArr
=
sizeStr
.
split
(
"-"
,
2
);
//尺寸信息
sizeStr
=
locationSizeArr
[
1
];
String
[]
locationInfoArr
=
locationSizeArr
[
0
].
split
(
"\\+"
);
String
cameraIndexStr
=
locationInfoArr
[
0
];
//摄像头编号信息
int
cameraIndex
=
Integer
.
valueOf
(
cameraIndexStr
);
codeBean
.
setCameraIndex
(
cameraIndex
);
String
locationStr
=
locationInfoArr
[
1
];
//带有位置信息
String
[]
locationArr
=
locationStr
.
split
(
"x"
);
locationX
=
Float
.
valueOf
(
locationArr
[
0
].
trim
());
locationY
=
Float
.
valueOf
(
locationArr
[
1
].
trim
());
}
//带有料盘宽高信息
if
(!
Strings
.
isNullOrEmpty
(
sizeStr
)){
String
[]
sizeInfoArr
=
sizeStr
.
split
(
"x"
,
2
);
reelWidth
=
Integer
.
parseInt
(
sizeInfoArr
[
0
].
trim
());
reelHeight
=
Integer
.
parseInt
(
sizeInfoArr
[
1
].
trim
());
}
codeBean
.
setLocationX
(
locationX
);
codeBean
.
setLocationY
(
locationY
);
codeBean
.
setReelWidth
(
reelWidth
);
codeBean
.
setReelHeight
(
reelHeight
);
codeStr
=
arr
[
1
];
}
codeBean
.
setCodeStr
(
codeStr
);
if
(!
isValidRule
()){
codeBean
.
setError
(
"error.barcode.noRule"
,
"解析规则未定义"
);
return
codeBean
;
}
String
[]
codeArr
=
new
String
[]{
codeStr
};
if
(!
Strings
.
isNullOrEmpty
(
separator
)){
codeArr
=
codeStr
.
split
(
separator
,-
1
);
//条码与规则长度对应不上
if
(
codeArr
.
length
!=
length
){
log
.
info
(
"条码["
+
codeStr
+
"]与规则【"
+
ruleStr
+
"】长度不同"
);
codeBean
.
setError
(
"error.barcode.wrongLength"
,
new
String
[]{},
"条码["
+
codeStr
+
"]长度错误"
);
return
codeBean
;
}
else
{
codeArr
=
codeStr
.
split
(
separator
,
length
);
}
}
Barcode
b
=
new
Barcode
();
String
reelId
=
""
;
if
(
whole_reelId_item
.
hasThisField
()){
reelId
=
codeStr
;
}
else
{
reelId
=
reelId_item
.
getStrValue
(
codeArr
);
}
if
(
Strings
.
isNullOrEmpty
(
reelId
)){
log
.
info
(
"条码解析失败,未找到RI字段"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"RI"
},
"条码解析失败,未找到RI字段"
);
return
codeBean
;
}
String
partNumber
=
partNumber_item
.
getStrValue
(
codeArr
);
if
(
Strings
.
isNullOrEmpty
(
partNumber
)){
log
.
info
(
"条码解析失败,未找到PN字段"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"PN"
},
"条码解析失败,未找到PN字段"
);
return
codeBean
;
}
if
(
batch_item
.
hasThisField
()){
String
batch
=
batch_item
.
getStrValue
(
codeArr
);
b
.
setBatch
(
batch
);
}
int
quantity
=
1
;
if
(
quantity_item
.
hasThisField
()){
quantity
=
quantity_item
.
getIntValue
(
codeArr
);
if
(
quantity
==
-
1
){
log
.
info
(
"条码解析失败,未找到QTY 字段"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"QTY"
},
"条码解析失败,未找到QTY 字段"
);
return
codeBean
;
}
}
Date
produceDate
=
produceDate_item
.
getDateValue
(
codeArr
);
if
(
produceDate_item
.
hasThisField
()
&&
produceDate
==
null
){
log
.
info
(
"条码解析失败,PRODATE字段不合规则"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"PRODATE"
},
"条码解析失败,未找到PRODATE字段"
);
return
codeBean
;
}
Date
expireDate
=
expireDate_item
.
getDateValue
(
codeArr
);
if
(
produceDate
!=
null
&&
expireDate
==
null
){
Calendar
c
=
Calendar
.
getInstance
();
c
.
setTime
(
produceDate
);
int
expYear
=
expireYear_item
.
getIntValue
(
codeArr
);
int
expMonth
=
expireMonth_item
.
getIntValue
(
codeArr
);
int
expDay
=
expireDay_item
.
getIntValue
(
codeArr
);
boolean
hasExpire
=
false
;
if
(
expYear
!=
-
1
){
c
.
add
(
Calendar
.
YEAR
,
expYear
);
hasExpire
=
true
;
}
else
if
(
expMonth
!=
-
1
){
c
.
add
(
Calendar
.
MONTH
,
expMonth
);
hasExpire
=
true
;
}
else
if
(
expDay
!=
-
1
){
c
.
add
(
Calendar
.
DAY_OF_YEAR
,
expDay
);
hasExpire
=
true
;
}
if
(
hasExpire
){
expireDate
=
c
.
getTime
();
}
}
String
supplier
=
supplier_item
.
getStrValue
(
codeArr
);
String
msl
=
msl_item
.
getStrValue
(
codeArr
);
if
(
memo_item
.
hasThisField
()){
String
memo
=
memo_item
.
getStrValue
(
codeArr
);
b
.
setMemo
(
memo
);
}
b
.
setBarcode
(
reelId
);
codeBean
.
setCodeStr
(
reelId
);
b
.
setPartNumber
(
partNumber
);
b
.
setAmount
(
quantity
);
b
.
setProduceDate
(
produceDate
);
b
.
setExpireDate
(
expireDate
);
b
.
setProvider
(
supplier
);
b
.
setPlateSize
(
reelWidth
);
b
.
setHeight
(
reelHeight
);
b
.
setMsl
(
msl
);
codeBean
.
setBarcode
(
b
);
return
codeBean
;
}
/**
* 转义正则特殊字符 ($()*+.[]?\^{}
* @return
*/
private
static
String
toRegexStr
(
String
separator
){
//转义正则特殊字符 ($()*+.[]?\^{}
return
separator
.
replace
(
"\\"
,
"\\\\"
).
replace
(
"*"
,
"\\*"
)
.
replace
(
"+"
,
"\\+"
).
replace
(
"|"
,
"\\|"
)
.
replace
(
"{"
,
"\\{"
).
replace
(
"}"
,
"\\}"
)
.
replace
(
"("
,
"\\("
).
replace
(
")"
,
"\\)"
)
.
replace
(
"^"
,
"\\^"
).
replace
(
"$"
,
"\\$"
)
.
replace
(
"["
,
"\\["
).
replace
(
"]"
,
"\\]"
)
.
replace
(
"?"
,
"\\?"
).
replace
(
","
,
"\\,"
)
.
replace
(
"."
,
"\\."
).
replace
(
"&"
,
"\\&"
);
}
/**
* 是否是有效的规则
*/
public
boolean
isValidRule
(){
return
length
>
0
;
}
public
static
void
main
(
String
args
[])
throws
Exception
{
//[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@
//1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23@@
String
rule
=
"1@2@3@PN@5@6@7@8@9@10@xxPRODATEyyyyMMdd@xxxEXPDATEyyyyMMdd@13@14@15@16@17@RI@xQTYxxxxxx@20@21@22@23"
;
rule
=
"1@2@3@PPN@5@6@7@8@9@10@xxPRODATEyyyyMMdd@xxxEXPDATEyyyyMMdd@13@14@15@16@17@RI@xQTYxxxxxx@20@21@22@23"
;
rule
=
"1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23"
;
rule
=
"1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@xxRI@xxQTYxxxxxx@19@20@21@22@23@@"
;
rule
=
"1;2;3;PN;QTY;6"
;
rule
=
"PN|RI|3|4|5|6|7|8|9|10|11|12|13|14|15|QTYxxx|17"
;
rule
=
"1@2@3@PPN@5@6@7@8@9@10@xxPRODATEyyMMdd@xxxEXPDATEyyMMdd@13@14@15@16@VSP@3S[RI]@xQTYxxxxxx@20@21@22@23"
;
//String codeStr = "[)>@06@12S0002@P5292001000@1P1690215@31P1690215@12V527973628@10VCHN-YANTAI@2P@20P@6D20170626@14D20171223@30PY@ZN@K0@16K0@V815@3SB370000000EZZ@Q500GRM000@20T1@1TMT72543954@2T@1Z@@";
String
codeStr
=
"[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@\n"
+
"\n"
+
"1@2@3@PPN@5@6@7@8@9@10@11@12@13@14@15@16@17@xxRI@xQTYxxxxxx@20@21@22@23@@"
;
//codeStr = "[)>@06@12S0002@P8638516894@1PB025008SS5107-04@31P8638516894@12V865379333@10VCHN-WUXI@2PV01@20P#QX0#PROBIMER77MA-1@6D20180214@14D20180805@30PY@ZN@K55158066@16K0@V97198306@3SS500000570451@Q20NAR000@20T1@1T35H-0618@2T@1ZTRIPOD@@";
codeStr
=
"[)>@06@12S001@P8909000244@1P@31P@10V@2P@20P@6D@14D@30PY@Z @K@16K@V000000@3SA20180913-01554@Q03000NAR000@20T1@1TH000000000B172621166@Q03000@2T@1Z@@"
;
codeStr
=
")》@06@120S002@P8908018028@1PBLM18PG121SH1D@31PBLM18PG121SH1D@12V690588124@10VJPN-AM@2P@20P@6D192400@14D210205@30PY@Z1@K0@16K0@V97294419@3SS191908055X1Z@Q4000NAR000@20T1@1TAM961458E@2T@1Z@@"
;
// codeStr = "=1+0x0-0x0=A0002";
//阳光电源
rule
=
"[RI]_PN_3_QTYxxxx"
;
rule
=
"[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]"
;
codeStr
=
"4500065747_CS000069_180101_030000041"
;
codeStr
=
"4500089600_DC000045_190528_003000006"
;
//博郎 QR = [VEE PN] + [Quantity] + [UID] + [Expire date] + [MSD level] + [Light class] + [Color class] + [Forward voltage] + [00000000]
// codeStr = "001967370080049250852020112000010P130BT200MH00000000";
//
// rule = "PN[0:8:-1]QTY[8:5:-1]RI[13:7:-1]EXPDATEyyyyMMdd[20:8:-1]MSL[28:4:-1]BATCH[32:4:-1]SP[36:4:-1]";
// //佳世达
rule
=
"BATCH;PRODATEyyyy-MM-dd[1:10:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI"
;
codeStr
=
"L00002019090199951797;E2019-09-01 0365;B8C.R2003.V81506072019090103000;R506072019102200356"
;
//rule = "1;PN;BATCH;PRODATEyyyyMMdd;EXPDATEyyyyMMdd;QTY;RI";
//codeStr = ";RMK1608-K-B-10300;7B16081217B0;20200506;20250203;5000;000";
//rule = "1;2;PN;BATCH[2:0:-1];5;6;EXPDATEyyyy/MM/dd[2:0:8];QTY[2:0:-1];8;9;10;RI[2:0:-1]";
//codeStr = "锘緿M;IN13浠跺\uE69C缁勮灪涓濇壒09913涓栬揪;BM;PH11A-ZZG02;DDDDMO180525;GG624-71;SX2019/8/25 0:00:00;SL2;HG;DL;ZP;QT90CECB112D1448DA91F485D0AA984B08";
codeStr
=
"??M8431CZ8133ZHMJQ21EJ3545-2016;IN?????BM6005K01;PH20012005;SC;CJ;LH;DDMO20072200041;CB;SX2023-2-27 0:00:00;SL1;JL;KG;HG;DL;ZP;QT;XT1001AS10000000517DT2;"
;
rule
=
"1;2;PN[-1:0:-1];BATCH[-1:0:-1];5;6;7;8;9;EXPDATEyyyy-MM-dd[2:0:8];QTY[2:0:-1];12;13;14;15;16;17;RI[-1:0:-1]"
;
//rule = "1>PN[-1:0:6]>3>RI[-1:0:6]";
//codeStr = "<ckdh>CC200612000194</ckdh><jybh>ADK20-\n" +"JY19060012~/jybh>";
//rule = "1;2;PN[-1:0:-1];BATCH[-1:0:-1];5;6;7;8;9;EXPDATEyyyy-MM-dd[2:0:8];QTY[2:0:-1];12;13;14;15;16;17;RI[-1:0:-1]";
//codeStr = "DM8431CZ8133ZHMJQ21EJ3545-2016;IN;BM6005K01;PH20012005;SC;CJ;LH;DDMO20072200041;CB;SX2023-2-27 00:10:00;SL1;JL;KG;HG;DL;ZP;QT;XT1001AS10000000517DT2;";
//803
//rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI";
//codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002";
codeStr
=
"IAC;6013A0073981;20200810;R2032E1128;10000;MI020A600568;"
;
//codeStr = "IAC;B23D45;20200204;DCRFFD;45;WER23;";
rule
=
"SP;PN;PRODATEyyw[0:4:0];BATCH;QTY;RI;"
;
//rule = "SP;PN;PRODATEyyyyMMdd[0:8:0];BATCH;QTY;RI;";
codeStr
=
"IAC;6014A0489701;HI1206T161R-10;2047;AC20NKA0448KA;2000;VBG204768056"
;
rule
=
"SP;PN;3;PRODATEyyw;BATCH;QTY;RI"
;
codeStr
=
"=7x8=140032005 18B030918B 200.000 614A 0001045024 0001 20200414-141329"
;
rule
=
"PN BATCH QTY[-1:0:1] RI "
;
BarcodeRule
br
=
BarcodeRule
.
newRule
(
rule
);
Barcode
b
=
br
.
toCodeBean
(
codeStr
).
getBarcode
();
if
(
b
!=
null
){
System
.
out
.
println
(
"PN:"
+
b
.
getPartNumber
());
System
.
out
.
println
(
"RI:"
+
b
.
getBarcode
());
System
.
out
.
println
(
"Amount:"
+
b
.
getAmount
());
System
.
out
.
println
(
"BATCH:"
+
b
.
getBatch
());
System
.
out
.
println
(
"MSL:"
+
b
.
getMsl
());
System
.
out
.
println
(
"PRODATE:"
+
b
.
getProduceDate
());
System
.
out
.
println
(
"EXPDATE:"
+
b
.
getExpireDate
());
System
.
out
.
println
(
"Supllier:"
+
b
.
getProvider
());
System
.
out
.
println
(
"Memo:"
+
b
.
getMemo
());
}
else
{
log
.
info
(
"解析失败"
);
}
// URI uri = new URI("smb://materialtower:Flextronics1@10.222.42.48/materialtower/re20190822161258_result.txt");
// String smbFileName = uri.getScheme() + "://" + uri.getHost() + "" + uri.getPath() + "abc.txt";
// System.out.println(smbFileName);
//System.out.println("host : "+SmbUtil.getDomainFromUrl("\\\\192.168.1.100\\materialtower\\"));
}
}
src/main/java/com/neotel/smfcore/core/barcode/bean/CodeBean.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
bean
;
import
com.neotel.smfcore.core.barcode.enums.CODE_TYPE
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
/**
* 用于解析条码
* Created by sunke on 2017/10/10.
*/
public
class
CodeBean
{
/**
* 码类型
*/
private
CODE_TYPE
codeType
;
/**
* 摄像头位置信息
*/
private
int
cameraIndex
=
0
;
//扫描到的二维码的位置信息
private
float
locationX
=
-
1.0f
;
private
float
locationY
=
-
1.0f
;
/**
* 用于显示的照片信息
*/
private
String
showImg
=
""
;
/**
* 料盘宽度
*/
private
int
reelWidth
=
-
1
;
/**
* 料盘高度
*/
private
int
reelHeight
=
-
1
;
private
String
codeStr
=
""
;
/**
* 错误消息,正常时为空
*/
private
String
error
;
private
String
errorCode
;
private
String
[]
params
;
private
Barcode
barcode
;
public
String
getError
()
{
return
error
;
}
public
void
setError
(
String
errorCode
,
String
[]
params
,
String
error
)
{
this
.
error
=
error
;
this
.
errorCode
=
errorCode
;
this
.
params
=
params
;
}
public
void
setError
(
String
errorCode
,
String
error
)
{
this
.
error
=
error
;
this
.
errorCode
=
errorCode
;
this
.
params
=
null
;
}
public
Barcode
getBarcode
()
{
return
barcode
;
}
public
void
setBarcode
(
Barcode
barcode
)
{
this
.
barcode
=
barcode
;
}
public
boolean
isValid
(){
return
error
==
null
&&
barcode
!=
null
;
}
/**
* 是否是夹具条码
*/
public
boolean
isFixtureCode
(){
if
(
isValid
()){
return
COMPONENT_TYPE
.
FIXTURE
==
barcode
.
getType
();
}
return
false
;
}
public
float
getLocationX
()
{
return
locationX
;
}
public
void
setLocationX
(
float
locationX
)
{
this
.
locationX
=
locationX
;
}
public
float
getLocationY
()
{
return
locationY
;
}
public
void
setLocationY
(
float
locationY
)
{
this
.
locationY
=
locationY
;
}
public
CODE_TYPE
getCodeType
()
{
return
codeType
;
}
public
void
setCodeType
(
CODE_TYPE
codeType
)
{
this
.
codeType
=
codeType
;
}
public
String
getCodeStr
()
{
return
codeStr
;
}
public
void
setCodeStr
(
String
codeStr
)
{
this
.
codeStr
=
codeStr
;
}
public
int
getCameraIndex
()
{
return
cameraIndex
;
}
public
void
setCameraIndex
(
int
cameraIndex
)
{
this
.
cameraIndex
=
cameraIndex
;
}
public
int
getReelWidth
()
{
return
reelWidth
;
}
public
void
setReelWidth
(
int
reelWidth
)
{
this
.
reelWidth
=
reelWidth
;
}
public
int
getReelHeight
()
{
return
reelHeight
;
}
public
void
setReelHeight
(
int
reelHeight
)
{
this
.
reelHeight
=
reelHeight
;
}
public
boolean
hasReelSizeInfo
()
{
return
reelWidth
>
0
&&
reelHeight
>
0
;
}
public
String
getShowImg
()
{
return
showImg
;
}
public
void
setShowImg
(
String
showImg
)
{
this
.
showImg
=
showImg
;
}
public
void
setError
(
String
error
)
{
this
.
error
=
error
;
}
public
String
getErrorCode
()
{
return
errorCode
;
}
public
void
setErrorCode
(
String
errorCode
)
{
this
.
errorCode
=
errorCode
;
}
public
String
[]
getParams
()
{
return
params
;
}
public
void
setParams
(
String
[]
params
)
{
this
.
params
=
params
;
}
}
src/main/java/com/neotel/smfcore/core/
service/data
/PlateSizeBean.java
→
src/main/java/com/neotel/smfcore/core/
barcode/bean
/PlateSizeBean.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
data
;
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
bean
;
import
com.neotel.smfcore.common.utils.PLATE_SIZE
;
import
lombok.Getter
;
...
...
src/main/java/com/neotel/smfcore/core/barcode/enums/CODE_TYPE.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
enums
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
/**
* 二维码类型,用于在界面上展示对应的图片
* Created by sunke on 2021/7/13.
*/
public
enum
CODE_TYPE
{
COMPONENT
,
PCB
,
OTHERS
,
PCB_FIXTURE
,
SOLDER_FIXTURE
,
FIXTURE
,
/**
* 管装锡膏
*/
TUBE_SOLDER
,
/**
* 罐装锡膏
*/
CAN_SOLDER
;
public
static
CODE_TYPE
fromComponentType
(
int
type
){
switch
(
type
){
case
COMPONENT_TYPE
.
COMPONENT
:
return
COMPONENT
;
case
COMPONENT_TYPE
.
FIXTURE
:
return
FIXTURE
;
case
COMPONENT_TYPE
.
OTHERS
:
return
OTHERS
;
case
COMPONENT_TYPE
.
PCB
:
return
PCB
;
}
return
null
;
}
}
src/main/java/com/neotel/smfcore/core/barcode/enums/COMPONENT_TYPE.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
enums
;
/**
* 物料类型
* Created by sunke on 2021/7/13.
*/
public
class
COMPONENT_TYPE
{
public
static
final
int
COMPONENT
=
0
;
/** 锡膏 */
public
static
final
int
SOLDERPASTE
=
1
;
/** PCB板 */
public
static
final
int
PCB
=
2
;
/** 其他物料*/
public
static
final
int
OTHERS
=
3
;
/** 夹具 */
public
static
final
int
FIXTURE
=
4
;
}
src/main/java/com/neotel/smfcore/core/barcode/service/dao/impl/BarcodeDaoImpl.java
查看文件 @
38fdd1d
...
...
@@ -3,7 +3,9 @@ package com.neotel.smfcore.core.barcode.service.dao.impl;
import
com.neotel.smfcore.common.base.AbstractBaseDao
;
import
com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
org.springframework.stereotype.Service
;
@Service
public
class
BarcodeDaoImpl
extends
AbstractBaseDao
implements
IBarcodeDao
{
@Override
public
Class
getEntityClass
()
{
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/dao/impl/ComponentDaoImpl.java
查看文件 @
38fdd1d
...
...
@@ -5,9 +5,11 @@ import com.neotel.smfcore.core.barcode.service.dao.IComponentDao;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Service
public
class
ComponentDaoImpl
extends
AbstractBaseDao
implements
IComponentDao
{
@Override
public
Class
getEntityClass
()
{
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IBarcodeManager.java
查看文件 @
38fdd1d
...
...
@@ -4,4 +4,7 @@ import com.neotel.smfcore.common.base.IBaseManager;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
public
interface
IBarcodeManager
extends
IBaseManager
<
Barcode
>
{
Barcode
findByBarcode
(
String
reelId
);
}
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IComponentManager.java
查看文件 @
38fdd1d
...
...
@@ -4,4 +4,5 @@ import com.neotel.smfcore.common.base.IBaseManager;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
public
interface
IComponentManager
extends
IBaseManager
<
Component
>
{
Component
findByPartNumberAndProvider
(
String
partNumber
,
String
provider
);
}
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/BarcodeManagerImpl.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
service
.
manager
.
impl
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao
;
import
com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
java.util.List
;
@Service
public
class
BarcodeManagerImpl
implements
IBarcodeManager
{
@Autowired
private
IBarcodeDao
barcodeDao
;
@Override
public
Barcode
get
(
String
id
)
{
return
null
;
...
...
@@ -33,4 +42,9 @@ public class BarcodeManagerImpl implements IBarcodeManager {
public
List
<
Barcode
>
findByQuery
(
Query
query
)
{
return
null
;
}
@Override
public
Barcode
findByBarcode
(
String
reelId
)
{
return
barcodeDao
.
findOneByCondition
(
new
String
[]{
"barcode"
},
new
String
[]{
reelId
});
}
}
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/ComponentManagerImpl.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
service
.
manager
.
impl
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.barcode.service.dao.IComponentDao
;
import
com.neotel.smfcore.core.barcode.service.manager.IComponentManager
;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Service
public
class
ComponentManagerImpl
implements
IComponentManager
{
@Autowired
private
IComponentDao
componentDao
;
@Override
public
Component
get
(
String
id
)
{
return
null
;
return
componentDao
.
findOneById
(
id
)
;
}
@Override
public
Component
save
(
Component
object
)
throws
ValidateException
{
return
null
;
return
componentDao
.
save
(
object
)
;
}
@Override
...
...
@@ -26,11 +35,28 @@ public class ComponentManagerImpl implements IComponentManager {
@Override
public
List
<
Component
>
findByPage
(
Query
query
,
Pageable
pageable
)
{
return
null
;
return
componentDao
.
findByQuery
(
query
,
pageable
)
;
}
@Override
public
List
<
Component
>
findByQuery
(
Query
query
)
{
return
null
;
return
componentDao
.
findOne
(
query
);
}
@Override
public
Component
findByPartNumberAndProvider
(
String
partNumber
,
String
provider
)
{
if
(
StringUtils
.
isEmpty
(
partNumber
))
return
null
;
else
{
Component
component
=
componentDao
.
findOneByCondition
(
new
String
[]
{
"partNumber"
,
"provider"
},
new
String
[]
{
partNumber
,
provider
});
if
(
component
==
null
){
component
=
componentDao
.
findOneByCondition
(
new
String
[]
{
"partNumber"
,
"provider"
},
new
String
[]
{
partNumber
,
null
});
if
(
component
!=
null
){
component
.
setProvider
(
provider
);
component
=
componentDao
.
save
(
component
);
}
}
return
component
;
}
}
}
src/main/java/com/neotel/smfcore/core/barcode/service/po/Barcode.java
查看文件 @
38fdd1d
...
...
@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
import
com.neotel.smfcore.common.base.BasePo
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
lombok.Data
;
import
org.springframework.data.annotation.Transient
;
import
org.springframework.data.mongodb.core.mapping.Document
;
...
...
@@ -19,7 +20,7 @@ public class Barcode extends BasePo implements Serializable {
/**
* 物料类型:PCB,锡膏,或其他
*/
private
int
type
=
StorageConstants
.
COMPONENT_TYPE
.
COMPONENT
;
private
int
type
=
COMPONENT_TYPE
.
COMPONENT
;
//锡膏回温时间,小于回温时间不可出库
private
int
warmTime
=
0
;
...
...
@@ -140,7 +141,7 @@ public class Barcode extends BasePo implements Serializable {
* 是否是锡膏
*/
public
boolean
isSolder
(){
return
type
==
StorageConstants
.
COMPONENT_TYPE
.
SOLDERPASTE
;
return
type
==
COMPONENT_TYPE
.
SOLDERPASTE
;
}
public
List
<
String
>
getRelationCodes
()
{
if
(
relationCodes
==
null
)
{
...
...
@@ -227,7 +228,7 @@ public class Barcode extends BasePo implements Serializable {
*/
public
long
getReachWarmTime
(){
long
reachWarmTime
=
System
.
currentTimeMillis
();
if
(
StorageConstants
.
COMPONENT_TYPE
.
SOLDERPASTE
==
type
&&
putInTime
!=
-
1
){
if
(
COMPONENT_TYPE
.
SOLDERPASTE
==
type
&&
putInTime
!=
-
1
){
reachWarmTime
=
putInTime
+
warmTime
*
60
*
60
*
1000
;
}
return
reachWarmTime
;
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/po/Component.java
查看文件 @
38fdd1d
...
...
@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.barcode.service.po;
import
com.neotel.smfcore.common.base.BasePo
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
com.sun.istack.internal.NotNull
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
...
...
@@ -16,7 +17,7 @@ public class Component extends BasePo implements Serializable {
/**
* 产品类型:0元器件,1锡膏2PCB3其他4夹具
*/
private
int
type
=
StorageConstants
.
COMPONENT_TYPE
.
COMPONENT
;
private
int
type
=
COMPONENT_TYPE
.
COMPONENT
;
/**
* 产品型号
...
...
@@ -142,7 +143,7 @@ public class Component extends BasePo implements Serializable {
if
(
plateSize
==
0
||
height
==
0
){
return
""
;
}
if
(
type
==
StorageConstants
.
COMPONENT_TYPE
.
FIXTURE
){
if
(
type
==
COMPONENT_TYPE
.
FIXTURE
){
return
plateSize
+
"x"
+
height
+
"x"
+
partNumber
;
}
...
...
@@ -160,6 +161,6 @@ public class Component extends BasePo implements Serializable {
* 是否是锡膏
*/
public
boolean
isSolder
(){
return
type
==
StorageConstants
.
COMPONENT_TYPE
.
SOLDERPASTE
;
return
type
==
COMPONENT_TYPE
.
SOLDERPASTE
;
}
}
src/main/java/com/neotel/smfcore/core/barcode/utils/CodeResolve.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
barcode
.
utils
;
import
com.google.common.base.Strings
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.core.barcode.bean.BarcodeRule
;
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
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Collection
;
import
java.util.Date
;
import
java.util.List
;
/**
* Created by sunke on 2021/7/13.
*/
@Slf4j
@Service
public
class
CodeResolve
{
@Autowired
private
IBarcodeManager
barcodeManager
;
@Autowired
private
IComponentManager
componentManager
;
private
List
<
BarcodeRule
>
barcodeRuleList
;
public
void
updateBarcodeRuleList
(
List
<
String
>
ruleList
){
barcodeRuleList
=
Lists
.
newArrayList
();
for
(
String
codeRule
:
ruleList
){
if
(!
Strings
.
isNullOrEmpty
(
codeRule
)){
barcodeRuleList
.
add
(
BarcodeRule
.
newRule
(
codeRule
));
}
}
}
/**
* 解析条码为单个 Barcode
*/
public
CodeBean
resolveSingleCode
(
String
barcodeItemStr
){
if
(
barcodeRuleList
==
null
||
barcodeRuleList
.
isEmpty
()){
CodeBean
codeBean
=
new
CodeBean
();
codeBean
.
setBarcode
(
null
);
codeBean
.
setError
(
"error.barcode.noRules"
,
"解析规则未定义"
);
codeBean
.
setCodeStr
(
barcodeItemStr
);
return
codeBean
;
}
CodeBean
codeBeanFromRule
=
null
;
Barcode
barcode
=
null
;
if
(
barcodeRuleList
.
isEmpty
()){
//没有配置规则的话,直接从数据库中查询
barcode
=
barcodeManager
.
findByBarcode
(
barcodeItemStr
);
if
(
barcode
!=
null
)
{
codeBeanFromRule
=
new
CodeBean
();
codeBeanFromRule
.
setError
(
null
,
null
);
codeBeanFromRule
.
setCodeStr
(
barcode
.
getBarcode
());
codeBeanFromRule
.
setBarcode
(
barcode
);
// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
// codeBeanFromRule.setShowImg(component.getShowImg());
return
codeBeanFromRule
;
}
}
//每个规则尝试解析一次
for
(
BarcodeRule
codeRule
:
barcodeRuleList
){
codeBeanFromRule
=
codeRule
.
toCodeBean
(
barcodeItemStr
);
//查看数据库中是否已存在
String
codeStr
=
codeBeanFromRule
.
getCodeStr
();
barcode
=
barcodeManager
.
findByBarcode
(
codeStr
);
if
(
barcode
!=
null
)
{
//数据库中已存在
if
(
codeBeanFromRule
.
hasReelSizeInfo
()){
//如果客户端传入的有尺寸,但尺寸不一致,使用上传上来的尺寸
if
(
barcode
.
getHeight
()
!=
codeBeanFromRule
.
getReelHeight
()
||
barcode
.
getPlateSize
()
!=
codeBeanFromRule
.
getReelWidth
()){
try
{
log
.
warn
(
"重新设置尺寸["
+
barcode
.
getPlateSize
()+
"x"
+
barcode
.
getHeight
()+
"]为["
+
codeBeanFromRule
.
getReelWidth
()+
"x"
+
codeBeanFromRule
.
getReelHeight
()+
"]"
);
barcode
.
setPlateSize
(
codeBeanFromRule
.
getReelWidth
());
barcode
.
setHeight
(
codeBeanFromRule
.
getReelHeight
());
barcode
=
barcodeManager
.
save
(
barcode
);
}
catch
(
Exception
ve
){
log
.
error
(
"重设尺寸出错"
,
ve
);
}
}
}
Component
component
=
componentManager
.
findByPartNumberAndProvider
(
barcode
.
getPartNumber
(),
barcode
.
getProvider
());
int
validDay
=
0
;
if
(
component
!=
null
){
validDay
=
component
.
getValidDay
();
codeBeanFromRule
.
setShowImg
(
component
.
getShowImg
());
}
Barcode
barcodeFromRule
=
codeBeanFromRule
.
getBarcode
();
if
(
barcodeFromRule
!=
null
){
boolean
needUpdate
=
false
;
int
lastLabelAmount
=
barcode
.
getLabelAmount
();
int
currentLabelAmount
=
barcodeFromRule
.
getAmount
();
if
(
currentLabelAmount
!=
lastLabelAmount
){
//本次解析出来的数量与上次条码解析出来的数量不一样,重新设置数量
log
.
info
(
"重新设置"
+
codeBeanFromRule
.
getCodeStr
()+
"数量为:"
+
currentLabelAmount
);
barcode
.
setAmount
(
currentLabelAmount
);
barcode
.
setLabelAmount
(
currentLabelAmount
);
needUpdate
=
true
;
}
// Date produceDate = barcodeFromRule.getProduceDate();
// if(produceDate != null){
// //抓取到了生产日期,未抓取到过期日期,重新设置过期日期
// if(barcode.getExpireDate() == null){
// if(validDay > 0){
// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
// Date expireDate = DateUtil.addDays(produceDate, validDay);
// barcode.setExpireDate(expireDate);
// barcode.setProduceDate(produceDate);
// needUpdate = true;
// }
// }
// }
if
(
needUpdate
){
try
{
barcodeManager
.
save
(
barcode
);
}
catch
(
Exception
e
){
log
.
error
(
""
,
e
);
}
}
}
codeBeanFromRule
.
setError
(
null
,
null
);
codeBeanFromRule
.
setCodeStr
(
barcode
.
getBarcode
());
codeBeanFromRule
.
setBarcode
(
barcode
);
return
codeBeanFromRule
;
}
else
if
(
codeBeanFromRule
.
isValid
()){
//数据库中不存在,但解析成功
Barcode
barcodeFromRule
=
codeBeanFromRule
.
getBarcode
();
try
{
//如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
if
(
codeBeanFromRule
.
hasReelSizeInfo
()){
//log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
Component
component
=
componentManager
.
findByPartNumberAndProvider
(
barcodeFromRule
.
getPartNumber
(),
barcodeFromRule
.
getProvider
());
if
(
component
==
null
){
log
.
info
(
"自动添加["
+
barcodeFromRule
.
getPartNumber
()+
"]["
+
barcodeFromRule
.
getProvider
()+
"]的档案信息["
+
codeBeanFromRule
.
getReelWidth
()+
"x"
+
codeBeanFromRule
.
getReelHeight
()+
"]"
);
component
=
new
Component
();
component
.
setPartNumber
(
barcodeFromRule
.
getPartNumber
());
component
.
setAmount
(
barcodeFromRule
.
getAmount
());
component
.
setPlateSize
(
barcodeFromRule
.
getPlateSize
());
component
.
setHeight
(
barcodeFromRule
.
getHeight
());
component
.
setName
(
barcodeFromRule
.
getPartNumber
());
component
.
setProvider
(
barcodeFromRule
.
getProvider
());
componentManager
.
save
(
component
);
}
else
{
//如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
if
(
codeBeanFromRule
.
getReelHeight
()
>
component
.
getHeight
()
||
codeBeanFromRule
.
getReelWidth
()
>
component
.
getPlateSize
()){
log
.
info
(
"更新物料["
+
component
.
getPartNumber
()+
"]档案尺寸["
+
component
.
getPlateSize
()+
"x"
+
component
.
getHeight
()+
"]为["
+
codeBeanFromRule
.
getReelWidth
()+
"x"
+
codeBeanFromRule
.
getReelHeight
()+
"]"
);
component
.
setPlateSize
(
barcodeFromRule
.
getPlateSize
());
component
.
setHeight
(
barcodeFromRule
.
getHeight
());
componentManager
.
save
(
component
);
}
codeBeanFromRule
.
setShowImg
(
component
.
getShowImg
());
}
}
boolean
needAddNew
=
true
;
if
(
needAddNew
){
log
.
info
(
"自动添加条码"
+
barcodeItemStr
+
"到数据库中"
);
Component
component
=
componentManager
.
findByPartNumberAndProvider
(
barcodeFromRule
.
getPartNumber
(),
barcodeFromRule
.
getProvider
());
if
(
component
==
null
){
log
.
info
(
"档案["
+
barcodeFromRule
.
getPartNumber
()+
"]不存在"
);
throw
new
ValidateException
(
"component.error.notExist"
,
new
String
[]{
barcodeFromRule
.
getPartNumber
()});
}
codeBeanFromRule
.
setShowImg
(
component
.
getShowImg
());
Date
produceDate
=
barcodeFromRule
.
getProduceDate
();
if
(
produceDate
!=
null
&&
barcodeFromRule
.
getExpireDate
()
==
null
){
int
validDay
=
component
.
getValidDay
();
if
(
validDay
>
0
){
log
.
info
(
"设置"
+
barcodeFromRule
.
getBarcode
()+
"的过期时间"
);
Date
expireDate
=
DateUtil
.
addDays
(
produceDate
,
validDay
);
barcodeFromRule
.
setExpireDate
(
expireDate
);
barcodeManager
.
save
(
barcodeFromRule
);
}
}
barcode
=
barcodeManager
.
save
(
barcodeFromRule
);
codeBeanFromRule
.
setCodeStr
(
barcode
.
getBarcode
());
codeBeanFromRule
.
setBarcode
(
barcode
);
codeBeanFromRule
.
setError
(
null
,
null
);
}
}
catch
(
ValidateException
ve
){
//档案不存在
codeBeanFromRule
.
setError
(
"error.barcode.pnNotExist"
,
new
String
[]{
barcodeFromRule
.
getPartNumber
()},
"x档案 "
+
barcodeFromRule
.
getPartNumber
()+
" 不存在"
);
log
.
warn
(
"x档案"
+
barcodeFromRule
.
getPartNumber
()+
"不存在"
);
}
//解析成功了,直接返回
return
codeBeanFromRule
;
}
else
{
//在数据库中不存在,且未解析成功,用其他规则再解析
codeBeanFromRule
.
setError
(
"error.barcode.invalid"
,
new
String
[]{
barcodeItemStr
},
barcodeItemStr
+
"不是有效的条码"
);
}
}
if
(
codeBeanFromRule
==
null
){
codeBeanFromRule
=
new
CodeBean
();
codeBeanFromRule
.
setBarcode
(
null
);
codeBeanFromRule
.
setError
(
"error.barcode.invalid"
,
new
String
[]{
barcodeItemStr
},
barcodeItemStr
+
"不是有效的条码"
);
codeBeanFromRule
.
setCodeStr
(
barcodeItemStr
);
return
codeBeanFromRule
;
}
return
codeBeanFromRule
;
}
public
Collection
<
CodeBean
>
resolveCodeStr
(
String
codeStr
){
List
<
CodeBean
>
codeBeans
=
Lists
.
newArrayList
();
//Map<String, CodeBean> codeBeanMap = Maps.newHashMap();
if
(!
Strings
.
isNullOrEmpty
(
codeStr
)){
//双##号分割多个二维码
String
[]
barcodeItemStrs
=
codeStr
.
split
(
"##"
);
//需要检查partNumber 是否一致
//Multiset<String> partNumberMultiset = HashMultiset.create();
//含有最多的 partNumber
//String mostPartNumber = "";
for
(
String
barcodeItemStr
:
barcodeItemStrs
){
CodeBean
codeBean
=
resolveSingleCode
(
barcodeItemStr
);
if
(
codeBean
==
null
){
continue
;
}
boolean
hasSameCode
=
false
;
if
(
codeBean
.
isValid
()){
//过滤唯一码重复的,防止即扫到二维码也扫到一维码会有多个条码的问题
for
(
CodeBean
bean
:
codeBeans
)
{
if
(
bean
.
isValid
()){
String
reelId
=
codeBean
.
getBarcode
().
getBarcode
();
if
(
reelId
.
equals
(
bean
.
getBarcode
().
getBarcode
())){
hasSameCode
=
true
;
log
.
info
(
reelId
+
"与已有效条码一样,忽略"
);
break
;
}
}
}
}
if
(!
hasSameCode
){
codeBeans
.
add
(
codeBean
);
}
//统计非夹具的 partNubmer
// if(codeBean.isValid() && !codeBean.isFixtureCode()){
// String partNumber = codeBean.getBarcode().getPartNumber();
// partNumberMultiset.add(partNumber);
// if(partNumberMultiset.count(partNumber) > partNumberMultiset.count(mostPartNumber) ){
// mostPartNumber = partNumber;
// }
// }
}
// for (CodeBean codeBean : codeBeans) {
// if(codeBean.isValid() && !codeBean.isFixtureCode()){
// //非夹具的 partNumber 不一致
// if(!mostPartNumber.equals(codeBean.getBarcode().getPartNumber())){
// codeBean.setError("error.barcode.wrongPn", "PartNumber不一致");
// }
// }
// codeBeanMap.put(codeBean.getCodeStr(), codeBean);
// }
}
//return codeBeanMap.values();
return
codeBeans
;
}
/**
* 从条码信息中解析出一个有效条码
* @param codeStr
* @return
*/
public
Barcode
resolveOneValideBarcode
(
String
codeStr
)
throws
ValidateException
{
if
(
org
.
apache
.
logging
.
log4j
.
util
.
Strings
.
isBlank
(
codeStr
)){
throw
new
ValidateException
(
"error.barcode.empty"
,
"未扫到条码"
);
}
Collection
<
CodeBean
>
codeBeans
=
resolveCodeStr
(
codeStr
);
Barcode
barcode
=
null
;
String
errorMsg
=
""
;
for
(
CodeBean
codeBean
:
codeBeans
)
{
if
(
codeBean
.
isValid
()){
Barcode
barcodeFromRule
=
codeBean
.
getBarcode
();
if
(
barcode
==
null
){
barcode
=
barcodeFromRule
;
}
else
{
throw
new
ValidateException
(
"error.barcode.many"
,
new
String
[]{
codeStr
},
"找到多个有效的条码"
);
}
}
else
{
errorMsg
=
codeBean
.
getError
();
}
}
if
(
barcode
==
null
){
throw
new
ValidateException
(
"error.barcode.noValidCode"
,
new
String
[]{
codeBeans
.
size
()+
""
,
codeStr
},
"无效的条码"
);
}
return
barcode
;
}
}
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
查看文件 @
38fdd1d
...
...
@@ -6,7 +6,7 @@ import com.neotel.smfcore.common.enums.DeviceType;
import
com.neotel.smfcore.core.device.handler.IDeviceHandler
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.service.po.Storage
;
import
com.neotel.smfcore.core.s
torage.s
ervice.po.Storage
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
device
.
util
;
import
com.google.common.base.Strings
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.service.manager.IComponentManager
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.service.dao.ISettingsDao
;
import
com.neotel.smfcore.core.barcode.bean.PlateSizeBean
;
import
com.neotel.smfcore.core.service.manager.IDataLogManager
;
import
com.neotel.smfcore.core.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.s
torage.s
ervice.manager.IStorageManager
;
import
com.neotel.smfcore.core.s
torage.s
ervice.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.service.po.Settings
;
import
com.neotel.smfcore.core.service.po.Storage
;
import
com.neotel.smfcore.core.s
torage.s
ervice.po.Storage
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Repository
;
import
javax.annotation.PostConstruct
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
...
...
@@ -36,8 +37,11 @@ public class DataCache {
@Autowired
private
IDataLogManager
dataLogManager
;
// @Autowired
// private ISettingsDao settingsDao;
@Autowired
private
ISettingsDao
settingsDao
;
@Autowired
private
CodeResolve
codeResolve
;
//
// @Autowired
// private IBarcodeManager barcodeManager;
...
...
@@ -50,10 +54,16 @@ public class DataCache {
// */
// public static Map<String, Boolean> needUpdateHumidityMap = new ConcurrentHashMap<>();
//
// /**
// * 出库方式
// */
// private static Settings settings;
/**
* 出库方式
*/
private
static
Settings
settings
;
@PostConstruct
public
void
initialize
()
{
settings
=
getSettings
();
}
//
// private static List<BarcodeRule> barcodeRuleList;
//
...
...
@@ -70,309 +80,23 @@ public class DataCache {
// }
//
//
// public Settings getSettings(){
// if(settings == null){
// List<Settings> allSettings = settingsDao.findAll();
// if(allSettings == null || allSettings.isEmpty()){
// settings = new Settings();
// settings.setOutType(StorageConstants.CHECKOUT_TYPE.EFFICIENCY.name());
// settings = settingsDao.save(settings);
// }else{
// settings = allSettings.get(0);
// }
//
// barcodeRuleList = Lists.newArrayList();
// List<String> ruleList = settings.getCodeRuleList();
// String oldCodeRule = settings.getCodeRule();
// if(!Strings.isNullOrEmpty(oldCodeRule)){
// ruleList.add(oldCodeRule);
// settings.setCodeRule("");
// settings.setCodeRuleList(ruleList);
// updateSettings(settings);
// }
//
// for(String codeRule : ruleList){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
// }
// return settings;
// }
//
// /**
// * 解析条码为单个 Barcode
// */
// public CodeBean resolveSingleCode(String barcodeItemStr){
// //防止规则未初始化
// if(barcodeRuleList == null){
// getSettings();
// }
//
// CodeBean codeBeanFromRule = null;
// Barcode barcode = null;
// if(barcodeRuleList.isEmpty()){
// //没有配置规则的话,直接从数据库中查询
// barcode = barcodeManager.findByBarcode(barcodeItemStr);
// if(barcode != null) {
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
//// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
//// codeBeanFromRule.setShowImg(component.getShowImg());
//
// return codeBeanFromRule;
// }
// }
//
// //每个规则尝试解析一次
// for (BarcodeRule codeRule : barcodeRuleList){
// codeBeanFromRule = codeRule.toCodeBean(barcodeItemStr);
// //查看数据库中是否已存在
// String codeStr = codeBeanFromRule.getCodeStr();
// barcode = barcodeManager.findByBarcode(codeStr);
// if(barcode != null) {//数据库中已存在
// if(codeBeanFromRule.hasReelSizeInfo()){
// //如果客户端传入的有尺寸,但尺寸不一致,使用上传上来的尺寸
// if(barcode.getHeight() != codeBeanFromRule.getReelHeight() || barcode.getPlateSize() != codeBeanFromRule.getReelWidth()){
// try{
// log.warn("重新设置尺寸["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
//
// barcode.setPlateSize(codeBeanFromRule.getReelWidth());
// barcode.setHeight(codeBeanFromRule.getReelHeight());
// barcode = barcodeManager.save(barcode);
// }catch (Exception ve){
// log.error("重设尺寸出错",ve);
// }
// }
// }
// Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
// int validDay = 0;
// if(component != null){
// validDay = component.getValidDay();
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// if(barcodeFromRule != null){
// boolean needUpdate = false;
// int lastLabelAmount = barcode.getLabelAmount();
// int currentLabelAmount = barcodeFromRule.getAmount();
// if(currentLabelAmount != lastLabelAmount){
// //本次解析出来的数量与上次条码解析出来的数量不一样,重新设置数量
// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"数量为:"+currentLabelAmount);
// barcode.setAmount(currentLabelAmount);
// barcode.setLabelAmount(currentLabelAmount);
// needUpdate = true;
// }
//// Date produceDate = barcodeFromRule.getProduceDate();
//// if(produceDate != null){
//// //抓取到了生产日期,未抓取到过期日期,重新设置过期日期
//// if(barcode.getExpireDate() == null){
//// if(validDay > 0){
//// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
//// Date expireDate = DateUtil.addDays(produceDate, validDay);
//// barcode.setExpireDate(expireDate);
//// barcode.setProduceDate(produceDate);
//// needUpdate = true;
//// }
//// }
//// }
//
// if(needUpdate){
// try {
// barcodeManager.save(barcode);
// }catch (Exception e){
// log.error(e);
// }
// }
// }
//
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// return codeBeanFromRule;
// }else if(codeBeanFromRule.isValid()){//数据库中不存在,但解析成功
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// try{
// //如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
// if(codeBeanFromRule.hasReelSizeInfo()){
// //log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
//
// if(component == null){
// log.info("自动添加["+barcodeFromRule.getPartNumber()+"]["+barcodeFromRule.getProvider()+"]的档案信息["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component = new Component();
// component.setPartNumber(barcodeFromRule.getPartNumber());
// component.setAmount(barcodeFromRule.getAmount());
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// component.setName(barcodeFromRule.getPartNumber());
// component.setProvider(barcodeFromRule.getProvider());
// componentManager.save(component);
// }else{
// //如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
// if(codeBeanFromRule.getReelHeight() > component.getHeight() || codeBeanFromRule.getReelWidth() > component.getPlateSize()){
// log.info("更新物料["+component.getPartNumber()+"]档案尺寸["+component.getPlateSize()+"x"+component.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// componentManager.save(component);
// }
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// }
//
// boolean needAddNew = true;
// if(isProductionFor(CUSTOMER.LIAN_DIAN)){
// //联电的唯一码中必须带有-,否则无效
// if(!barcodeFromRule.getBarcode().contains("-")){
// needAddNew = false;
// log.info("唯一码["+barcodeFromRule.getBarcode()+"]中不带符号-,忽略");
// return null;
// }
// }
// if(needAddNew){
// log.info("自动添加条码"+barcodeItemStr+"到数据库中");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
// if(component == null){
// log.info("档案["+barcodeFromRule.getPartNumber()+"]不存在");
// throw new ValidateException("component.error.notExist",new String[]{barcodeFromRule.getPartNumber()});
// }
//
// codeBeanFromRule.setShowImg(component.getShowImg());
// Date produceDate = barcodeFromRule.getProduceDate();
// if(produceDate != null && barcodeFromRule.getExpireDate() == null){
// int validDay = component.getValidDay();
// if( validDay > 0){
// log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
// Date expireDate = DateUtil.addDays(produceDate, validDay);
// barcodeFromRule.setExpireDate(expireDate);
// barcodeManager.save(barcodeFromRule);
// }
// }
//
// barcode = barcodeManager.save(barcodeFromRule);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// codeBeanFromRule.setError(null,null);
// }
// }catch (ValidateException ve){
// //档案不存在
// codeBeanFromRule.setError("error.barcode.pnNotExist",new String[]{barcodeFromRule.getPartNumber()},"x档案 "+barcodeFromRule.getPartNumber()+" 不存在");
// log.warn("x档案"+barcodeFromRule.getPartNumber()+"不存在");
// }
// //解析成功了,直接返回
// return codeBeanFromRule;
// }else{
// //在数据库中不存在,且未解析成功,用其他规则再解析
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// }
// }
//
// if(codeBeanFromRule == null){
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setBarcode(null);
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// codeBeanFromRule.setCodeStr(barcodeItemStr);
// return codeBeanFromRule;
// }
// return codeBeanFromRule;
// }
//
// public Collection<CodeBean> resolveCodeStr(String codeStr){
// List<CodeBean> codeBeans = Lists.newArrayList();
// //Map<String, CodeBean> codeBeanMap = Maps.newHashMap();
// if(!Strings.isNullOrEmpty(codeStr)){
// //双##号分割多个二维码
// String[] barcodeItemStrs = codeStr.split("##");
//
// //需要检查partNumber 是否一致
// //Multiset<String> partNumberMultiset = HashMultiset.create();
// //含有最多的 partNumber
// //String mostPartNumber = "";
//
//
// for (String barcodeItemStr : barcodeItemStrs){
// CodeBean codeBean = resolveSingleCode(barcodeItemStr);
// if(codeBean == null){
// continue;
// }
// boolean hasSameCode = false;
// if(codeBean.isValid()){
// //过滤唯一码重复的,防止即扫到二维码也扫到一维码会有多个条码的问题
// for (CodeBean bean : codeBeans) {
// if(bean.isValid()){
// String reelId = codeBean.getBarcode().getBarcode();
// if(reelId.equals(bean.getBarcode().getBarcode())){
// hasSameCode = true;
// log.info(reelId + "与已有效条码一样,忽略");
// break;
// }
// }
// }
// }
//
// if(!hasSameCode){
// codeBeans.add(codeBean);
// }
//
// //统计非夹具的 partNubmer
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// String partNumber = codeBean.getBarcode().getPartNumber();
//// partNumberMultiset.add(partNumber);
//// if(partNumberMultiset.count(partNumber) > partNumberMultiset.count(mostPartNumber) ){
//// mostPartNumber = partNumber;
//// }
//// }
// }
//
//
//// for (CodeBean codeBean : codeBeans) {
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// //非夹具的 partNumber 不一致
//// if(!mostPartNumber.equals(codeBean.getBarcode().getPartNumber())){
//// codeBean.setError("error.barcode.wrongPn", "PartNumber不一致");
//// }
//// }
//// codeBeanMap.put(codeBean.getCodeStr(), codeBean);
//// }
// }
// //return codeBeanMap.values();
// return codeBeans;
// }
//
// /**
// * 从条码信息中解析出一个有效条码
// * @param codeStr
// * @return
// */
// public Barcode resolveOneValideBarcode(String codeStr) throws ValidateException{
// if(org.apache.logging.log4j.util.Strings.isBlank(codeStr)){
// throw new ValidateException("error.barcode.empty","未扫到条码");
// }
// Collection<CodeBean> codeBeans = resolveCodeStr(codeStr);
// Barcode barcode = null;
// String errorMsg = "";
// for (CodeBean codeBean : codeBeans) {
// if(codeBean.isValid()){
// Barcode barcodeFromRule = codeBean.getBarcode();
// if(barcode == null){
// barcode = barcodeFromRule;
// }else{
// throw new ValidateException("error.barcode.many",new String[]{codeStr},"找到多个有效的条码");
// }
// }else{
// errorMsg = codeBean.getError();
// }
// }
//
// if(barcode == null){
// throw new ValidateException("error.barcode.noValidCode",new String[]{codeBeans.size()+"",codeStr}, "无效的条码");
// }
// return barcode;
// }
public
Settings
getSettings
(){
if
(
settings
==
null
){
List
<
Settings
>
allSettings
=
settingsDao
.
findAll
();
if
(
allSettings
==
null
||
allSettings
.
isEmpty
()){
settings
=
new
Settings
();
settings
.
setOutType
(
StorageConstants
.
CHECKOUT_TYPE
.
EFFICIENCY
.
name
());
settings
=
settingsDao
.
save
(
settings
);
}
else
{
settings
=
allSettings
.
get
(
0
);
}
List
<
String
>
ruleList
=
settings
.
getCodeRuleList
();
codeResolve
.
updateBarcodeRuleList
(
ruleList
);
}
return
settings
;
}
//
// /**
// * 出库方式
...
...
@@ -382,18 +106,13 @@ public class DataCache {
// return StorageConstants.CHECKOUT_TYPE.valueOf(outType);
// }
//
// public Settings updateSettings(Settings newSetting){
// settings = settingsDao.save(newSetting);
// List<String> ruleItems = settings.getCodeRuleList();
// barcodeRuleList = Lists.newArrayList();
// for(String codeRule : ruleItems){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
public
Settings
updateSettings
(
Settings
newSetting
){
settings
=
settingsDao
.
save
(
newSetting
);
List
<
String
>
ruleItems
=
settings
.
getCodeRuleList
();
codeResolve
.
updateBarcodeRuleList
(
ruleItems
);
// needUpdateHumidityMap = new ConcurrentHashMap<>();
//
return settings;
//
}
return
settings
;
}
// public List<String> getCids(){
// List<String> cids = new ArrayList<>();
...
...
@@ -440,10 +159,10 @@ public class DataCache {
//
//
//
//
/**
//
* 所有的料仓 key 为 cid, value 为 Storage
//
*/
//
private static Map<String, Storage> allStorage = new ConcurrentHashMap<>();
/**
* 所有的料仓 key 为 cid, value 为 Storage
*/
private
static
Map
<
String
,
Storage
>
allStorage
=
new
ConcurrentHashMap
<>();
//
//
// /**
...
...
@@ -460,30 +179,30 @@ public class DataCache {
// return storageIds;
// }
//
//
public Map<String, Storage> getAllStorage(){
//
if(allStorage.isEmpty()){
//
synchronized (allStorage){
//
if(allStorage.isEmpty()){
//
List<Storage> all = storageManager.findAll();
//
if(all != null){
//
Map<String, Storage> map = new ConcurrentHashMap<>();
//
for(Storage storage : all){
//
//
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
//
storage.initUsage(plateSizeBeanList);
//
//
map.put(storage.getCid(), storage);
//
//
//
}
//
allStorage = map;
//
log.info("加载所有料仓["+all.size()+"]信息到缓存");
//
}
//
}
//
}
//
}
//
return allStorage;
//
}
public
Map
<
String
,
Storage
>
getAllStorage
(){
if
(
allStorage
.
isEmpty
()){
synchronized
(
allStorage
){
if
(
allStorage
.
isEmpty
()){
List
<
Storage
>
all
=
storageManager
.
findAll
();
if
(
all
!=
null
){
Map
<
String
,
Storage
>
map
=
new
ConcurrentHashMap
<>();
for
(
Storage
storage
:
all
){
List
<
PlateSizeBean
>
plateSizeBeanList
=
storagePosManager
.
getStoragePosUsage
(
storage
.
getId
());
storage
.
initUsage
(
plateSizeBeanList
);
map
.
put
(
storage
.
getCid
(),
storage
);
}
allStorage
=
map
;
log
.
info
(
"加载所有料仓["
+
all
.
size
()+
"]信息到缓存"
);
}
}
}
}
return
allStorage
;
}
//
//
// /**
...
...
@@ -496,16 +215,16 @@ public class DataCache {
// }
// return storageList;
// }
//
//
/**
//
* 根据 cid 获取料仓信息
//
*/
//
public Storage getStorage(String cid){
//
if(Strings.isNullOrEmpty(cid)){
//
return null;
//
}
//
return getAllStorage().get(cid);
//
}
/**
* 根据 cid 获取料仓信息
*/
public
Storage
getStorage
(
String
cid
){
if
(
Strings
.
isNullOrEmpty
(
cid
)){
return
null
;
}
return
getAllStorage
().
get
(
cid
);
}
//
// /**
// * 根据 Id 获取料仓信息
...
...
src/main/java/com/neotel/smfcore/core/service/manager/IStoragePosManager.java
deleted
100644 → 0
查看文件 @
78b0f05
package
com
.
neotel
.
smfcore
.
core
.
service
.
manager
;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.core.service.po.StoragePos
;
public
interface
IStoragePosManager
extends
IBaseManager
<
StoragePos
>
{
}
src/main/java/com/neotel/smfcore/core/s
ervice/data
/UsageItem.java
→
src/main/java/com/neotel/smfcore/core/s
torage/bean
/UsageItem.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
s
ervice
.
data
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
bean
;
import
lombok.Data
;
...
...
src/main/java/com/neotel/smfcore/core/service/dao/IStorageDao.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/dao/IStorageDao.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
dao
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
dao
;
import
com.neotel.smfcore.common.base.IBaseDao
;
...
...
src/main/java/com/neotel/smfcore/core/service/dao/IStoragePosDao.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/dao/IStoragePosDao.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
dao
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
dao
;
import
com.neotel.smfcore.common.base.IBaseDao
;
...
...
src/main/java/com/neotel/smfcore/core/service/dao/impl/StorageDaoImpl.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/dao/impl/StorageDaoImpl.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
dao
.
impl
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
dao
.
impl
;
import
com.neotel.smfcore.common.base.AbstractBaseDao
;
import
com.neotel.smfcore.core.service.dao.IStorageDao
;
import
com.neotel.smfcore.core.service.po.Storage
;
import
com.neotel.smfcore.core.s
torage.s
ervice.dao.IStorageDao
;
import
com.neotel.smfcore.core.s
torage.s
ervice.po.Storage
;
import
org.springframework.stereotype.Service
;
@Service
...
...
src/main/java/com/neotel/smfcore/core/storage/service/dao/impl/StoragePosDaoImpl.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
storage
.
service
.
dao
.
impl
;
import
com.neotel.smfcore.common.base.AbstractBaseDao
;
import
com.neotel.smfcore.core.storage.service.dao.IStorageDao
;
import
com.neotel.smfcore.core.storage.service.dao.IStoragePosDao
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
org.springframework.stereotype.Service
;
@Service
public
class
StoragePosDaoImpl
extends
AbstractBaseDao
implements
IStoragePosDao
{
@Override
public
Class
getEntityClass
()
{
return
StoragePos
.
class
;
}
}
src/main/java/com/neotel/smfcore/core/service/manager/IStorageManager.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/manager/IStorageManager.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
manager
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
manager
;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.core.service.po.Storage
;
import
com.neotel.smfcore.core.s
torage.s
ervice.po.Storage
;
import
java.util.List
;
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
0 → 100644
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
storage
.
service
.
manager
;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.core.barcode.bean.PlateSizeBean
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
java.util.List
;
public
interface
IStoragePosManager
extends
IBaseManager
<
StoragePos
>
{
List
<
PlateSizeBean
>
getStoragePosUsage
(
String
storageId
);
}
src/main/java/com/neotel/smfcore/core/service/manager/impl/StorageManagerImpl.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/manager/impl/StorageManagerImpl.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
manager
.
impl
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
manager
.
impl
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.service.dao.IStorageDao
;
import
com.neotel.smfcore.core.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.service.po.Storage
;
import
com.neotel.smfcore.core.s
torage.s
ervice.dao.IStorageDao
;
import
com.neotel.smfcore.core.s
torage.s
ervice.manager.IStorageManager
;
import
com.neotel.smfcore.core.s
torage.s
ervice.po.Storage
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
...
...
src/main/java/com/neotel/smfcore/core/service/manager/impl/StoragePosManagerImpl.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/manager/impl/StoragePosManagerImpl.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
manager
.
impl
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
manager
.
impl
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.service.po.StoragePos
;
import
com.neotel.smfcore.core.barcode.bean.PlateSizeBean
;
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.StoragePos
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
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.List
;
@Service
public
class
StoragePosManagerImpl
implements
IStoragePosManager
{
@Autowired
private
IStoragePosDao
storagePosDao
;
@Override
public
List
<
PlateSizeBean
>
getStoragePosUsage
(
String
storageId
){
Aggregation
agg
=
Aggregation
.
newAggregation
(
Aggregation
.
match
(
Criteria
.
where
(
"storageId"
).
is
(
storageId
).
and
(
"enabled"
).
is
(
true
)),
Aggregation
.
group
(
"w"
,
"h"
,
"used"
).
count
().
as
(
"count"
),
Aggregation
.
project
(
"count"
).
and
(
"plateSize"
).
previousOperation
()
);
AggregationResults
<
PlateSizeBean
>
results
=
storagePosDao
.
getMongoTemplate
().
aggregate
(
agg
,
StoragePos
.
class
,
PlateSizeBean
.
class
);
List
<
PlateSizeBean
>
beans
=
results
.
getMappedResults
();
return
beans
;
}
@Override
public
StoragePos
get
(
String
id
)
{
return
null
;
return
storagePosDao
.
findOneById
(
id
)
;
}
@Override
public
StoragePos
save
(
StoragePos
object
)
throws
ValidateException
{
return
null
;
return
storagePosDao
.
save
(
object
)
;
}
@Override
...
...
@@ -26,11 +50,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public
List
<
StoragePos
>
findByPage
(
Query
query
,
Pageable
pageable
)
{
return
null
;
return
storagePosDao
.
findByQuery
(
query
,
pageable
)
;
}
@Override
public
List
<
StoragePos
>
findByQuery
(
Query
query
)
{
return
null
;
return
storagePosDao
.
findOne
(
query
)
;
}
}
src/main/java/com/neotel/smfcore/core/service/po/Storage.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/po/Storage.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
po
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
po
;
import
com.neotel.smfcore.common.base.BasePo
;
import
com.neotel.smfcore.common.enums.DeviceType
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.
service.data
.PlateSizeBean
;
import
com.neotel.smfcore.core.s
ervice.data
.UsageItem
;
import
com.neotel.smfcore.core.
barcode.bean
.PlateSizeBean
;
import
com.neotel.smfcore.core.s
torage.bean
.UsageItem
;
import
com.sun.istack.internal.NotNull
;
import
lombok.Data
;
import
org.springframework.data.mongodb.core.mapping.Document
;
...
...
src/main/java/com/neotel/smfcore/core/service/po/StoragePos.java
→
src/main/java/com/neotel/smfcore/core/s
torage/s
ervice/po/StoragePos.java
查看文件 @
38fdd1d
package
com
.
neotel
.
smfcore
.
core
.
service
.
po
;
package
com
.
neotel
.
smfcore
.
core
.
s
torage
.
s
ervice
.
po
;
import
com.google.common.base.Strings
;
import
com.neotel.smfcore.common.base.BasePo
;
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论