Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 7ffd7338
由
LN
编写于
2023-01-29 10:30:01 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
增加工单模板上传
1 个父辈
2790543e
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
107 行增加
和
11 行删除
src/main/java/com/neotel/smfcore/common/csv/CsvReader.java
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
src/main/java/com/neotel/smfcore/core/system/rest/SettingsController.java
src/main/resources/messages.properties
src/main/resources/messages_en_US.properties
src/main/resources/messages_ja_JP.properties
src/main/resources/messages_zh_CN.properties
src/main/resources/messages_zh_TW.properties
src/main/java/com/neotel/smfcore/common/csv/CsvReader.java
查看文件 @
7ffd733
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
*/
*/
package
com
.
neotel
.
smfcore
.
common
.
csv
;
package
com
.
neotel
.
smfcore
.
common
.
csv
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
...
@@ -27,6 +28,8 @@ import java.io.*;
...
@@ -27,6 +28,8 @@ import java.io.*;
import
java.nio.charset.Charset
;
import
java.nio.charset.Charset
;
import
java.text.NumberFormat
;
import
java.text.NumberFormat
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
/**
* A stream based parser for parsing delimited text data from a file or a
* A stream based parser for parsing delimited text data from a file or a
...
@@ -35,16 +38,27 @@ import java.util.HashMap;
...
@@ -35,16 +38,27 @@ import java.util.HashMap;
@Slf4j
@Slf4j
public
class
CsvReader
{
public
class
CsvReader
{
public
static
CsvReader
newReader
(
String
fileURL
,
String
titleName
,
String
titleNameEn
)
throws
IOException
{
public
static
CsvReader
newReader
(
String
fileURL
,
String
titleName
,
String
titleNameEn
)
throws
IOException
{
String
reloadEncodeing
=
"GBK"
;
String
reloadEncodeing
=
"GBK"
;
CsvReader
csvRead
=
new
CsvReader
(
fileURL
);
CsvReader
csvRead
=
new
CsvReader
(
fileURL
);
csvRead
.
setSkipEmptyRecords
(
true
);
csvRead
.
setSkipEmptyRecords
(
true
);
csvRead
.
setTrimWhitespace
(
true
);
csvRead
.
setTrimWhitespace
(
true
);
csvRead
.
readHeaders
();
csvRead
.
readHeaders
();
String
[]
headers
=
csvRead
.
getHeaders
();
int
index
=
csvRead
.
getIndex
(
titleName
,
titleNameEn
);
boolean
needReload
=
false
;
if
(
headers
.
length
>
0
&&
ObjectUtil
.
isNotEmpty
(
headers
[
0
])
&&
isMessyCode
(
headers
[
0
]))
{
needReload
=
true
;
log
.
info
(
"文件["
+
fileURL
+
"]有乱码,改为"
+
reloadEncodeing
+
"重新读取"
);
}
else
if
(
ObjectUtil
.
isNotEmpty
(
titleName
)
||
ObjectUtil
.
isNotEmpty
(
titleNameEn
))
{
int
index
=
csvRead
.
getIndex
(
titleName
,
titleNameEn
);
if
(
index
==
-
1
)
{
needReload
=
true
;
log
.
info
(
"文件["
+
fileURL
+
"]未包含列["
+
titleName
+
"]["
+
titleNameEn
+
"],改为"
+
reloadEncodeing
+
"重新读取"
);
}
}
//未找到列,重新读取
//未找到列,重新读取
if
(
index
==
-
1
)
{
if
(
needReload
)
{
log
.
info
(
"文件未包含列["
+
titleName
+
"]["
+
titleNameEn
+
"],改为"
+
reloadEncodeing
+
"重新读取"
);
csvRead
.
close
();
csvRead
.
close
();
csvRead
=
new
CsvReader
(
fileURL
,
CsvReader
.
Letters
.
COMMA
,
Charset
.
forName
(
reloadEncodeing
));
csvRead
=
new
CsvReader
(
fileURL
,
CsvReader
.
Letters
.
COMMA
,
Charset
.
forName
(
reloadEncodeing
));
csvRead
.
setSkipEmptyRecords
(
true
);
csvRead
.
setSkipEmptyRecords
(
true
);
...
@@ -54,6 +68,43 @@ public class CsvReader {
...
@@ -54,6 +68,43 @@ public class CsvReader {
return
csvRead
;
return
csvRead
;
}
}
public
static
boolean
isMessyCode
(
String
strName
)
{
Pattern
p
=
Pattern
.
compile
(
"\\s*|t*|r*|n*"
);
Matcher
m
=
p
.
matcher
(
strName
);
String
after
=
m
.
replaceAll
(
""
);
String
temp
=
after
.
replaceAll
(
"\\p{P}"
,
""
);
char
[]
ch
=
temp
.
trim
().
toCharArray
();
float
chLength
=
ch
.
length
;
float
count
=
0
;
for
(
int
i
=
0
;
i
<
ch
.
length
;
i
++)
{
char
c
=
ch
[
i
];
if
(!
Character
.
isLetterOrDigit
(
c
))
{
if
(!
isChinese
(
c
))
{
count
=
count
+
1
;
}
}
}
float
result
=
count
/
chLength
;
if
(
result
>
0.4
)
{
return
true
;
}
else
{
return
false
;
}
}
public
static
boolean
isChinese
(
char
c
)
{
Character
.
UnicodeBlock
ub
=
Character
.
UnicodeBlock
.
of
(
c
);
if
(
ub
==
Character
.
UnicodeBlock
.
CJK_UNIFIED_IDEOGRAPHS
||
ub
==
Character
.
UnicodeBlock
.
CJK_COMPATIBILITY_IDEOGRAPHS
||
ub
==
Character
.
UnicodeBlock
.
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
||
ub
==
Character
.
UnicodeBlock
.
GENERAL_PUNCTUATION
||
ub
==
Character
.
UnicodeBlock
.
CJK_SYMBOLS_AND_PUNCTUATION
||
ub
==
Character
.
UnicodeBlock
.
HALFWIDTH_AND_FULLWIDTH_FORMS
)
{
return
true
;
}
return
false
;
}
private
Reader
inputStream
=
null
;
private
Reader
inputStream
=
null
;
private
String
fileName
=
null
;
private
String
fileName
=
null
;
...
...
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
查看文件 @
7ffd733
...
@@ -137,9 +137,12 @@ public class OrderController {
...
@@ -137,9 +137,12 @@ public class OrderController {
}
}
File
folder
=
new
File
(
properties
.
getPath
(),
"pos"
);
File
folder
=
new
File
(
properties
.
getPath
(),
"pos"
);
File
localFile
=
FileUtil
.
upload
(
orderFile
,
folder
.
getAbsolutePath
());
File
localFile
=
FileUtil
.
upload
(
orderFile
,
folder
.
getAbsolutePath
());
orderFileWatch
.
handleOrderFile
(
localFile
);
boolean
result
=
orderFileWatch
.
handleOrderFile
(
localFile
);
if
(
result
)
{
return
ResultBean
.
newOkResult
(
"smfcore.order.uploadOK"
,
"工单上传成功"
);
return
ResultBean
.
newOkResult
(
"smfcore.order.uploadOK"
,
"工单上传成功"
);
}
else
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.order.uploadFailure"
,
"上传失败"
);
}
}
}
@ApiOperation
(
"工单出库"
)
@ApiOperation
(
"工单出库"
)
...
...
src/main/java/com/neotel/smfcore/core/system/rest/SettingsController.java
查看文件 @
7ffd733
...
@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.rest;
...
@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.rest;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.neotel.smfcore.common.bean.ResultBean
;
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.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.DateUtil
;
...
@@ -17,6 +18,8 @@ import com.neotel.smfcore.core.system.rest.bean.dto.SettingsDto;
...
@@ -17,6 +18,8 @@ import com.neotel.smfcore.core.system.rest.bean.dto.SettingsDto;
import
com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto
;
import
com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto
;
import
com.neotel.smfcore.core.system.rest.bean.mapstruct.SettingsMapper
;
import
com.neotel.smfcore.core.system.rest.bean.mapstruct.SettingsMapper
;
import
com.neotel.smfcore.core.system.service.po.Settings
;
import
com.neotel.smfcore.core.system.service.po.Settings
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
com.neotel.smfcore.security.bean.FileProperties
;
import
com.neotel.smfcore.security.rest.bean.dto.MenuDto
;
import
com.neotel.smfcore.security.rest.bean.dto.MenuDto
;
import
com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria
;
import
com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria
;
import
com.neotel.smfcore.security.service.po.Menu
;
import
com.neotel.smfcore.security.service.po.Menu
;
...
@@ -34,6 +37,7 @@ import org.springframework.http.ResponseEntity;
...
@@ -34,6 +37,7 @@ import org.springframework.http.ResponseEntity;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
...
@@ -50,6 +54,9 @@ import java.util.*;
...
@@ -50,6 +54,9 @@ import java.util.*;
public
class
SettingsController
{
public
class
SettingsController
{
@Autowired
@Autowired
private
DataCache
dataCache
;
private
DataCache
dataCache
;
@Autowired
private
final
FileProperties
properties
;
/**
/**
* 当前版本
* 当前版本
*/
*/
...
@@ -210,7 +217,28 @@ public class SettingsController {
...
@@ -210,7 +217,28 @@ public class SettingsController {
log
.
error
(
"导出失败"
+
e
.
getMessage
(),
e
);
log
.
error
(
"导出失败"
+
e
.
getMessage
(),
e
);
}
}
}
}
@ApiOperation
(
"上传工单模板"
)
@PostMapping
(
value
=
"/uploadOrderModel"
)
@AnonymousAccess
public
ResultBean
uploadOrderModel
(
@RequestParam
MultipartFile
orderFile
)
{
String
image
=
"csv"
;
String
fileType
=
FileUtil
.
getExtensionName
(
orderFile
.
getOriginalFilename
());
String
fileName
=
FileUtil
.
getFileNameNoEx
(
orderFile
.
getOriginalFilename
());
if
(
fileType
!=
null
&&
!
image
.
contains
(
fileType
))
{
throw
new
ValidateException
(
"smfcore.feleFormatError"
,
"文件格式错误!, 仅支持{0}格式"
,
new
String
[]{
image
});
}
File
folder
=
new
File
(
properties
.
getPath
(),
"pos"
);
File
localFile
=
FileUtil
.
upload
(
orderFile
,
folder
.
getAbsolutePath
());
try
{
CsvReader
csvRead
=
CsvReader
.
newReader
(
localFile
.
getAbsolutePath
(),
""
,
""
);
String
[]
headers
=
csvRead
.
getHeaders
();
return
ResultBean
.
newOkResult
(
headers
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
return
ResultBean
.
newOkResult
(
""
);
}
}
@ApiOperation
(
"获取版本号"
)
@ApiOperation
(
"获取版本号"
)
@GetMapping
(
"/version"
)
@GetMapping
(
"/version"
)
public
String
version
()
{
public
String
version
()
{
...
...
src/main/resources/messages.properties
查看文件 @
7ffd733
...
@@ -259,7 +259,9 @@ smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\
...
@@ -259,7 +259,9 @@ smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\
smfcore.error.getMaterialLot.out
=
\u6761\u7801
[{0}]
\u
9A8C
\u
8BC1
\u5931\u
8D25
\u
FF0C
\u
65E0
\u
6CD5
\u
51FA
\u
5E93
smfcore.error.getMaterialLot.out
=
\u6761\u7801
[{0}]
\u
9A8C
\u
8BC1
\u5931\u
8D25
\u
FF0C
\u
65E0
\u
6CD5
\u
51FA
\u
5E93
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.agv
=
AGV
smfcore.agv
=
AGV
smfcore.micron.operationFailure
=
\u
64CD
\u
4F5C
\u5931\u
8D25
smfcore.micron.checkoutByPnFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
51FA
\u
5E93
\u7269\u6599
smfcore.order.uploadFailure
=
\u
4E0A
\u
4F20
\u5931\u
8D25
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
...
...
src/main/resources/messages_en_US.properties
查看文件 @
7ffd733
...
@@ -257,3 +257,6 @@ smfcore.error.virtualOut.num=The number cannot exceed {0}
...
@@ -257,3 +257,6 @@ smfcore.error.virtualOut.num=The number cannot exceed {0}
smfcore.error.virtualOut.noItem
=
The corresponding material is not found in work order {0}
smfcore.error.virtualOut.noItem
=
The corresponding material is not found in work order {0}
smfcore.spKanban
=
Equipment Overview
smfcore.spKanban
=
Equipment Overview
smfcore.agv
=
AGV
smfcore.agv
=
AGV
smfcore.micron.operationFailure
=
Operation failed
smfcore.micron.checkoutByPnFail
=
Material not found for dispatch
smfcore.order.uploadFailure
=
Upload failed
src/main/resources/messages_ja_JP.properties
查看文件 @
7ffd733
...
@@ -255,3 +255,6 @@ smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0}
...
@@ -255,3 +255,6 @@ smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0}
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u5355
{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5BF9
\u
5E94
\u7684
PN
\u6216\u7269\u6599\u
7F16
\u
53F7
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u5355
{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5BF9
\u
5E94
\u7684
PN
\u6216\u7269\u6599\u
7F16
\u
53F7
smfcore.spKanban
=
\u
6A5F
\u5668\u6982\u8981
smfcore.spKanban
=
\u
6A5F
\u5668\u6982\u8981
smfcore.agv
=
AGV
smfcore.agv
=
AGV
smfcore.micron.operationFailure
=
\u
64CD
\u
4F5C
\u
306B
\u5931\u6557\u3057\u
305F
smfcore.micron.checkoutByPnFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
51FA
\u
5E93
\u7269\u6599
smfcore.order.uploadFailure
=
\u
4E0A
\u
4F20
\u5931\u
8D25
src/main/resources/messages_zh_CN.properties
查看文件 @
7ffd733
...
@@ -254,4 +254,7 @@ smfcore.greaterThanZero=\u6570\u91CF\u5FC5\u987B\u5927\u4E8E0
...
@@ -254,4 +254,7 @@ smfcore.greaterThanZero=\u6570\u91CF\u5FC5\u987B\u5927\u4E8E0
smfcore.error.virtualOut.num
=
\u6570\u
91CF
\u
4E0D
\u
80FD
\u
8D85
\u
8FC7{0}
smfcore.error.virtualOut.num
=
\u6570\u
91CF
\u
4E0D
\u
80FD
\u
8D85
\u
8FC7{0}
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u5355
{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5BF9
\u
5E94
\u7684
PN
\u6216\u7269\u6599\u
7F16
\u
53F7
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u5355
{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5BF9
\u
5E94
\u7684
PN
\u6216\u7269\u6599\u
7F16
\u
53F7
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.agv
=
AGV
\ No newline at end of file
\ No newline at end of file
smfcore.agv
=
AGV
smfcore.micron.operationFailure
=
\u
64CD
\u
4F5C
\u5931\u
8D25
smfcore.micron.checkoutByPnFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
51FA
\u
5E93
\u7269\u6599
smfcore.order.uploadFailure
=
\u
4E0A
\u
4F20
\u5931\u
8D25
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_zh_TW.properties
查看文件 @
7ffd733
...
@@ -256,3 +256,6 @@ smfcore.error.virtualOut.num=\u6578\u91CF\u4E0D\u80FD\u8D85\u904E{0}
...
@@ -256,3 +256,6 @@ smfcore.error.virtualOut.num=\u6578\u91CF\u4E0D\u80FD\u8D85\u904E{0}
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u
55AE{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5C0D
\u
61C9
\u7684
PN
\u7269\u6599\u
7DE8
\u
865F
smfcore.error.virtualOut.noItem
=
\u
5DE5
\u
55AE{0}
\u
4E2D
\u
672A
\u
627E
\u5230\u
5C0D
\u
61C9
\u7684
PN
\u7269\u6599\u
7DE8
\u
865F
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.spKanban
=
\u
8BBE
\u5907\u6982\u
89C8
smfcore.agv
=
AGV
smfcore.agv
=
AGV
smfcore.micron.operationFailure
=
\u
64CD
\u
4F5C
\u5931\u6557
smfcore.micron.checkoutByPnFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
51FA
\u
5EAB
\u7269\u6599
smfcore.order.uploadFailure
=
\u
4E0A
\u
4F20
\u5931\u
8D25
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论