Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 48f673de
由
zshaohui
编写于
2025-09-02 13:57:40 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.提供缓存信息接口给客户端
1 个父辈
102bc5b0
显示空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
630 行增加
和
28 行删除
src/main/java/com/neotel/smfcore/common/utils/Constants.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/custom/france1588/bean/XlcTask.java
src/main/java/com/neotel/smfcore/custom/france1588/controller/Device1588Controller.java
src/main/java/com/neotel/smfcore/custom/france1588/enums/TaskLoc.java
src/main/resources/messages.properties
src/main/resources/messages_de_DE.properties
src/main/resources/messages_en_US.properties
src/main/resources/messages_fr_FR.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/utils/Constants.java
查看文件 @
48f673d
package
com
.
neotel
.
smfcore
.
common
.
utils
;
package
com
.
neotel
.
smfcore
.
common
.
utils
;
public
class
Constants
{
public
class
Constants
{
private
Constants
()
{
private
Constants
()
{
// hide me
// hide me
}
}
...
@@ -213,4 +215,7 @@ public class Constants {
...
@@ -213,4 +215,7 @@ public class Constants {
*/
*/
public
static
final
String
Cache_AuthDate
=
"Cache_AuthDate"
;
public
static
final
String
Cache_AuthDate
=
"Cache_AuthDate"
;
public
static
final
String
Cache_BoxCacheInfo
=
"Cache_BoxCacheInfo"
;
}
}
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
48f673d
...
@@ -472,9 +472,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
...
@@ -472,9 +472,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
else
if
(
BOX_STATUS
.
IN_FAILED
==
status
)
{
//入库失败
}
else
if
(
BOX_STATUS
.
IN_FAILED
==
status
)
{
//入库失败
//暂不处理
//暂不处理
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
finishedOutPos
(
statusBean
.
getCid
(),
posName
,
barcode
,
executeTime
);
//
finishedOutPos(statusBean.getCid(),posName,barcode,executeTime);
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
endOutTask
(
statusBean
.
getCid
(),
posName
,
barcode
);
//
endOutTask(statusBean.getCid(),posName,barcode);
}
}
// else if (BOX_STATUS.REWARM_TAKING_END == status) {
// else if (BOX_STATUS.REWARM_TAKING_END == status) {
// //回温取料完成, 将库位清空
// //回温取料完成, 将库位清空
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
查看文件 @
48f673d
...
@@ -598,7 +598,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
...
@@ -598,7 +598,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
StoragePos
pos
=
storagePosDao
.
findOne
(
query
);
StoragePos
pos
=
storagePosDao
.
findOne
(
query
);
if
((!
ObjectUtil
.
isNotEmpty
(
msg
)
)&&
(
pos
!=
null
))
{
if
((!
ObjectUtil
.
isNotEmpty
(
msg
)
)&&
(
pos
!=
null
))
{
Point
targetP
=
PointUtil
.
getPosPoint
(
lastPosId
,
false
);
Point
targetP
=
PointUtil
.
getPosPoint
(
lastPosId
,
false
);
log
.
debug
(
msg
+
"结果:["
+
pos
.
getPosName
()
+
"]["
+
targetP
.
getX
()
+
","
+
targetP
.
getY
()
+
"]"
);
log
.
info
(
msg
+
"结果:["
+
pos
.
getPosName
()
+
"]["
+
targetP
.
getX
()
+
","
+
targetP
.
getY
()
+
"]"
);
}
}
return
pos
;
return
pos
;
}
}
...
...
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
查看文件 @
48f673d
...
@@ -252,6 +252,7 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
...
@@ -252,6 +252,7 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
//是否关闭
//是否关闭
private
boolean
closed
=
false
;
private
boolean
closed
=
false
;
private
boolean
outFromPos
=
false
;
public
String
getBarcode
()
{
public
String
getBarcode
()
{
if
(
barcode
==
null
){
if
(
barcode
==
null
){
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
48f673d
...
@@ -527,7 +527,8 @@ public class TaskService {
...
@@ -527,7 +527,8 @@ public class TaskService {
String
cid
=
storage
.
getCid
();
String
cid
=
storage
.
getCid
();
//有入库任务的料仓不分配出库任务
//有入库任务的料仓不分配出库任务
if
(!
hasExecutingTask
(
cid
,
OP
.
PUT_IN
))
{
if
(!
hasExecutingTask
(
cid
,
OP
.
PUT_IN
))
{
DataLog
task
=
findCheckoutBoxTask
(
storage
);
//DataLog task = findCheckoutBoxTask(storage);
DataLog
task
=
null
;
if
(
task
!=
null
)
{
if
(
task
!=
null
)
{
//从等待列表中删除,加入到执行列表中
//从等待列表中删除,加入到执行列表中
...
@@ -935,7 +936,7 @@ public class TaskService {
...
@@ -935,7 +936,7 @@ public class TaskService {
}
}
try
{
try
{
Collection
<
String
>
operatingPosIds
=
excludePosIds
();
Collection
<
String
>
operatingPosIds
=
excludePosIds
();
log
.
debug
(
"尝试从["
+
storage
.
getCid
()
+
"]中为["
+
barcode
.
getBarcode
()
+
"]查找空位"
);
log
.
info
(
"尝试从["
+
storage
.
getCid
()
+
"]中为["
+
barcode
.
getBarcode
()
+
"]查找空位"
);
StoragePos
pos
=
storagePosManager
.
getEmptyPosByStorage
(
storage
,
barcode
,
operatingPosIds
,
lastPosId
);
StoragePos
pos
=
storagePosManager
.
getEmptyPosByStorage
(
storage
,
barcode
,
operatingPosIds
,
lastPosId
);
if
(
pos
!=
null
)
{
if
(
pos
!=
null
)
{
//判断尺寸是否一致
//判断尺寸是否一致
...
@@ -958,7 +959,7 @@ public class TaskService {
...
@@ -958,7 +959,7 @@ public class TaskService {
for
(
Storage
storage
:
availbleStorageList
)
{
for
(
Storage
storage
:
availbleStorageList
)
{
try
{
try
{
Collection
<
String
>
operatingPosIds
=
excludePosIds
();
Collection
<
String
>
operatingPosIds
=
excludePosIds
();
log
.
debug
(
"尝试从["
+
storage
.
getCid
()
+
"]中为["
+
barcode
.
getBarcode
()
+
"]查找空位"
);
log
.
info
(
"尝试从["
+
storage
.
getCid
()
+
"]中为["
+
barcode
.
getBarcode
()
+
"]查找空位"
);
StoragePos
pos
=
storagePosManager
.
getEmptyPosByStorage
(
storage
,
barcode
,
operatingPosIds
,
lastPosId
);
StoragePos
pos
=
storagePosManager
.
getEmptyPosByStorage
(
storage
,
barcode
,
operatingPosIds
,
lastPosId
);
if
(
pos
!=
null
)
{
if
(
pos
!=
null
)
{
if
(
isSameSize
(
barcode
,
pos
)){
if
(
isSameSize
(
barcode
,
pos
)){
...
@@ -1350,31 +1351,45 @@ public class TaskService {
...
@@ -1350,31 +1351,45 @@ public class TaskService {
}
}
public
List
<
Barcode
>
barcodeListByCheckOutType
(
CHECKOUT_TYPE
checkoutType
,
List
<
Barcode
>
barcodeList
)
{
public
List
<
Barcode
>
barcodeListByCheckOutType
(
CHECKOUT_TYPE
checkoutType
,
List
<
Barcode
>
barcodeList
)
{
//按时间进行排序
// 处理barcodeList为null的情况
if
(
CHECKOUT_TYPE
.
EXPIRE_FIRST
.
equals
(
checkoutType
))
{
//先过期先出
if
(
barcodeList
==
null
)
{
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getExpireDate
,
Comparator
.
naturalOrder
())
return
Collections
.
emptyList
();
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())).
collect
(
Collectors
.
toList
());
}
}
else
if
(
CHECKOUT_TYPE
.
FIFO
.
equals
(
checkoutType
))
{
//严格的先进先出
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())
// 使用Comparator.nullsFirst或nullsLast处理可能的null值
.
thenComparing
(
Barcode:
:
getUsedCount
)).
collect
(
Collectors
.
toList
());
Comparator
<
Barcode
>
comparator
=
null
;
}
else
if
(
CHECKOUT_TYPE
.
USED_FIRST
.
equals
(
checkoutType
))
{
//尾料优先
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getAmount
)
if
(
CHECKOUT_TYPE
.
EXPIRE_FIRST
.
equals
(
checkoutType
))
{
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())).
collect
(
Collectors
.
toList
());
// 先过期先出
comparator
=
Comparator
.
comparing
(
Barcode:
:
getExpireDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()))
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()));
}
else
if
(
CHECKOUT_TYPE
.
FIFO
.
equals
(
checkoutType
))
{
// 严格的先进先出
comparator
=
Comparator
.
comparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()))
.
thenComparing
(
Barcode:
:
getUsedCount
);
}
else
if
(
CHECKOUT_TYPE
.
USED_FIRST
.
equals
(
checkoutType
))
{
// 尾料优先
comparator
=
Comparator
.
comparing
(
Barcode:
:
getAmount
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()))
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()));
}
else
if
(
CHECKOUT_TYPE
.
PRODUCE_DATE
.
equals
(
checkoutType
))
{
}
else
if
(
CHECKOUT_TYPE
.
PRODUCE_DATE
.
equals
(
checkoutType
))
{
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getProduceDate
,
Comparator
.
naturalOrder
(
))
comparator
=
Comparator
.
comparing
(
Barcode:
:
getProduceDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
))
.
thenComparing
(
Barcode:
:
getAmount
)
.
thenComparing
(
Barcode:
:
getAmount
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
())
)
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())).
collect
(
Collectors
.
toList
(
));
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
));
}
else
if
(
CHECKOUT_TYPE
.
BATCH_FIRST
.
equals
(
checkoutType
))
{
}
else
if
(
CHECKOUT_TYPE
.
BATCH_FIRST
.
equals
(
checkoutType
))
{
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getBatch
,
Comparator
.
naturalOrder
(
))
comparator
=
Comparator
.
comparing
(
Barcode:
:
getBatch
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
))
.
thenComparing
(
Barcode:
:
getProduceDate
,
Comparator
.
naturalOrder
(
))
.
thenComparing
(
Barcode:
:
getProduceDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
))
.
thenComparing
(
Barcode:
:
getAmount
)
.
thenComparing
(
Barcode:
:
getAmount
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
())
)
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())).
collect
(
Collectors
.
toList
(
));
.
thenComparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
));
}
else
{
//效率优先
}
else
{
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getPutInDate
,
Comparator
.
naturalOrder
())
// 效率优先
.
thenComparing
(
Barcode:
:
getCreateDate
))
comparator
=
Comparator
.
comparing
(
Barcode:
:
getPutInDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
))
.
collect
(
Collectors
.
toList
(
));
.
thenComparing
(
Barcode:
:
getCreateDate
,
Comparator
.
nullsFirst
(
Comparator
.
naturalOrder
()
));
}
}
return
barcodeList
;
return
barcodeList
.
stream
()
.
filter
(
Objects:
:
nonNull
)
// 过滤掉可能的null元素
.
sorted
(
comparator
)
.
collect
(
Collectors
.
toList
());
}
}
public
void
moveTaskToFinished
(
DataLog
task
)
{
public
void
moveTaskToFinished
(
DataLog
task
)
{
...
...
src/main/java/com/neotel/smfcore/custom/france1588/bean/XlcTask.java
0 → 100644
查看文件 @
48f673d
package
com
.
neotel
.
smfcore
.
custom
.
france1588
.
bean
;
import
lombok.Data
;
import
java.util.Date
;
@Data
public
class
XlcTask
{
private
String
taskId
;
private
String
barcode
;
private
int
type
;
private
String
toloc
;
private
String
posName
;
private
String
status
;
private
Date
createDate
;
}
src/main/java/com/neotel/smfcore/custom/france1588/controller/Device1588Controller.java
0 → 100644
查看文件 @
48f673d
package
com
.
neotel
.
smfcore
.
custom
.
france1588
.
controller
;
import
com.google.common.collect.Maps
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.common.utils.ReelLockPosUtil
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.barcode.bean.CodeBean
;
import
com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.util.DataCache
;
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.manager.IDataLogManager
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.custom.france1588.bean.XlcTask
;
import
com.neotel.smfcore.custom.france1588.enums.TaskLoc
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@RestController
@Slf4j
@RequestMapping
(
"/device1588"
)
public
class
Device1588Controller
{
@Autowired
private
IBarcodeManager
barcodeManager
;
@Autowired
private
CodeResolve
codeResolve
;
@Autowired
private
DataCache
dataCache
;
@Autowired
private
TaskService
taskService
;
@Autowired
private
IStoragePosManager
storagePosManager
;
@Autowired
private
IDataLogManager
dataLogManager
;
/**
* 1.查询料盘尺寸, 请求料号, 返回尺寸
*/
@ApiOperation
(
"查询物料尺寸"
)
@RequestMapping
(
"/getReelSize"
)
@AnonymousAccess
public
ResultBean
getReelSize
(
String
barcodeStr
)
{
Map
<
String
,
Integer
>
resultMap
=
new
HashMap
<>();
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
barcodeStr
);
if
(
codeBean
.
isValid
())
{
Barcode
barcode
=
codeBean
.
getBarcode
();
resultMap
.
put
(
"w"
,
barcode
.
getPlateSize
());
resultMap
.
put
(
"h"
,
barcode
.
getHeight
());
return
ResultBean
.
newOkResult
(
resultMap
);
}
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.valueInvalid"
,
"[{0}]不是有效的参数"
,
new
String
[]{
barcodeStr
});
}
/**
*2.查询入库用的料箱, 返回库位
* 延用通用的接口 /service/store/emptyPosForPutin
*/
/**
* 3.获取出库料箱,返回库位
*/
@ApiOperation
(
"获取出库料箱,返回库位"
)
@RequestMapping
(
"/generateBoxTask"
)
@AnonymousAccess
public
ResultBean
generateBoxTask
(
String
cid
)
{
//key为posId,value为存的料盘数量
Map
<
String
,
Integer
>
posReelCountMap
=
xlcPosReelCount
(
cid
);
//排序,找到物料最少的料箱
if
(
posReelCountMap
==
null
||
posReelCountMap
.
isEmpty
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.box.findFail"
,
"未找到可以出库的料箱"
);
}
// 按 Value 升序排序
posReelCountMap
=
posReelCountMap
.
entrySet
()
.
stream
()
.
sorted
(
Map
.
Entry
.
comparingByValue
())
.
collect
(
Collectors
.
toMap
(
Map
.
Entry
::
getKey
,
Map
.
Entry
::
getValue
,
(
oldValue
,
newValue
)
->
oldValue
,
LinkedHashMap:
:
new
// 保持顺序
));
//开始查找要出库的料箱
StoragePos
pos
=
null
;
for
(
String
posId
:
posReelCountMap
.
keySet
())
{
boolean
hasNoFinishedTask
=
hasNoFinishedTask
(
posId
);
if
(
hasNoFinishedTask
)
{
continue
;
}
//判断有没有禁用
StoragePos
storagePos
=
storagePosManager
.
get
(
posId
);
if
(!
storagePos
.
isEnabled
())
{
continue
;
}
Barcode
barcode
=
storagePos
.
getBarcode
();
if
(
barcode
==
null
)
{
continue
;
}
//判断有没有被锁定
String
reelLockPosId
=
ReelLockPosUtil
.
getReelLockPosId
(
barcode
.
getBarcode
());
if
(
StringUtils
.
isNotEmpty
(
reelLockPosId
))
{
continue
;
}
pos
=
storagePos
;
break
;
}
if
(
pos
==
null
)
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.box.findFail"
,
"未找到可以出库的料箱"
);
}
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
DataLog
dataLog
=
new
DataLog
(
storage
,
pos
.
getBarcode
(),
pos
);
dataLog
.
setLocInfo
(
TaskLoc
.
BOX_TASK_IN
);
dataLog
.
setType
(
OP
.
CHECKOUT
);
taskService
.
addTaskToExecute
(
dataLog
);
return
ResultBean
.
newOkResult
(
pos
.
getPosName
());
}
/**
* 4.获取xlc的出库任务
*/
@ApiOperation
(
"4.获取xlc的出库任务"
)
@RequestMapping
(
"/getAllXlcTask"
)
@AnonymousAccess
public
ResultBean
getAllXlcTask
(
String
cid
)
{
List
<
XlcTask
>
resultList
=
new
ArrayList
<>();
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
task
:
allTasks
)
{
if
(!
task
.
isCheckOutTask
()){
continue
;
}
if
(
task
.
isFinished
()
||
task
.
isCancel
())
{
continue
;
}
//判断是不是xlc的
String
storageId
=
task
.
getStorageId
();
if
(
StringUtils
.
isEmpty
(
storageId
))
{
continue
;
}
Storage
storage
=
dataCache
.
getStorageById
(
storageId
);
if
(!
storage
.
isXLC
()){
continue
;
}
if
(!
storage
.
getCid
().
equals
(
cid
)){
continue
;
}
XlcTask
xlcTask
=
new
XlcTask
();
xlcTask
.
setTaskId
(
task
.
getId
());
xlcTask
.
setBarcode
(
task
.
getBarcode
());
xlcTask
.
setType
(
task
.
getType
());
xlcTask
.
setToloc
(
task
.
getLocInfo
());
xlcTask
.
setPosName
(
task
.
getPosName
());
xlcTask
.
setStatus
(
task
.
getStatus
());
xlcTask
.
setCreateDate
(
task
.
getCreateDate
());
if
(
StringUtils
.
isEmpty
(
xlcTask
.
getToloc
())){
xlcTask
.
setToloc
(
TaskLoc
.
BOX_TASK_OUT
);
}
resultList
.
add
(
xlcTask
);
}
return
ResultBean
.
newOkResult
(
resultList
);
}
@ApiOperation
(
"5.设置料箱为空料箱"
)
@RequestMapping
(
"/setBoxEmpty"
)
@AnonymousAccess
public
ResultBean
setBoxEmpty
(
String
boxStr
)
{
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
boxStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
boxStr
});
}
//生成出库任务
Barcode
barcode
=
codeBean
.
getBarcode
();
List
<
Barcode
>
subCodeList
=
barcode
.
getSubCodeList
();
if
(
subCodeList
!=
null
&&
!
subCodeList
.
isEmpty
())
{
for
(
Barcode
subCode
:
subCodeList
)
{
subCode
.
setPosName
(
""
);
subCode
.
setHostBarcodeId
(
""
);
barcodeManager
.
save
(
subCode
);
DataLog
dataLog
=
new
DataLog
();
dataLog
.
setBarcode
(
subCode
.
getBarcode
());
dataLog
.
setPartNumber
(
subCode
.
getPartNumber
());
dataLog
.
setPosName
(
barcode
.
getBarcode
());
dataLog
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
dataLog
.
setNum
(
subCode
.
getAmount
());
dataLog
.
setType
(
OP
.
CHECKOUT
);
dataLogManager
.
save
(
dataLog
);
}
}
barcode
.
setSubCodeList
(
new
ArrayList
<>());
barcodeManager
.
save
(
barcode
);
return
ResultBean
.
newOkResult
(
""
);
}
@ApiOperation
(
"6.查询料箱空满状态"
)
@RequestMapping
(
"/reelInBoxNum"
)
@AnonymousAccess
public
ResultBean
reelInBoxNum
(
String
boxStr
)
{
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
boxStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
boxStr
});
}
int
reelNum
=
0
;
Barcode
barcode
=
codeBean
.
getBarcode
();
List
<
Barcode
>
subCodeList
=
barcode
.
getSubCodeList
();
if
(
subCodeList
!=
null
&&
!
subCodeList
.
isEmpty
())
{
reelNum
=
subCodeList
.
size
();
}
return
ResultBean
.
newOkResult
(
reelNum
);
}
@ApiOperation
(
"7.更新料箱位置信息"
)
@RequestMapping
(
"/updateBoxLoc"
)
@AnonymousAccess
public
ResultBean
updateBoxLoc
(
HttpServletRequest
request
)
{
String
boxStr
=
request
.
getParameter
(
"boxStr"
);
String
statusStr
=
request
.
getParameter
(
"statusStr"
);
log
.
info
(
"更新料箱:"
+
boxStr
+
"状态为:"
+
statusStr
);
//判断是不是有效的条码
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
boxStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
boxStr
});
}
Barcode
boxBarcode
=
codeBean
.
getBarcode
();
//判断任务是否存在
DataLog
task
=
null
;
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
boxBarcode
.
getBarcode
().
equals
(
dataLog
.
getBarcode
()))
{
if
(!
dataLog
.
isFinished
()
&&
!
dataLog
.
isCancel
())
{
task
=
dataLog
;
break
;
}
}
}
statusStr
=
statusStr
.
toUpperCase
();
if
(
task
!=
null
)
{
log
.
info
(
"更新料箱["
+
boxStr
+
"]的任务["
+
task
.
getId
()
+
"]状态为:"
+
statusStr
);
//判断是不是与上一次的任务相同
if
(
task
.
getStatus
().
equals
(
statusStr
))
{
return
ResultBean
.
newOkResult
(
""
);
}
task
.
setStatus
(
statusStr
);
if
(
OP_STATUS
.
EXECUTING
.
name
().
equals
(
statusStr
))
{
taskService
.
updateQueueTask
(
task
);
}
else
{
if
(!
task
.
isOutFromPos
())
{
taskService
.
moveTaskToFinished
(
task
);
outFromPos
(
task
);
task
.
setOutFromPos
(
true
);
}
taskService
.
updateFinishedTask
(
task
);
}
}
else
{
StoragePos
pos
=
storagePosManager
.
getByBarcode
(
boxBarcode
.
getBarcode
());
//如果在库位中,则生成一个出库任务
if
(
pos
!=
null
){
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
DataLog
dataLog
=
new
DataLog
(
storage
,
pos
.
getBarcode
(),
pos
);
dataLog
.
setStatus
(
statusStr
);
dataLog
.
setType
(
OP
.
CHECKOUT
);
if
(!
dataLog
.
isOutFromPos
())
{
taskService
.
moveTaskToFinished
(
dataLog
);
outFromPos
(
dataLog
);
dataLog
.
setOutFromPos
(
true
);
}
taskService
.
updateFinishedTask
(
dataLog
);
}
}
return
ResultBean
.
newOkResult
(
""
);
}
@ApiOperation
(
"8.料盘放入料箱"
)
@RequestMapping
(
"/reelToBox"
)
@AnonymousAccess
public
ResultBean
reelToBox
(
HttpServletRequest
request
)
{
String
boxStr
=
request
.
getParameter
(
"boxStr"
);
String
barcodeStr
=
request
.
getParameter
(
"barcodeStr"
);
log
.
info
(
"收到料盘:"
+
barcodeStr
+
",放到料箱:"
+
boxStr
);
//判断物料是不是有效的
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
barcodeStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
barcodeStr
});
}
Barcode
barcode
=
codeBean
.
getBarcode
();
barcode
=
removeOldBox
(
barcode
);
//判断料箱是不是有效的条码
CodeBean
boxCodeBean
=
codeResolve
.
resolveSingleCode
(
boxStr
);
if
(!
boxCodeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
boxStr
});
}
Barcode
boxBarcode
=
boxCodeBean
.
getBarcode
();
putInNewBox
(
barcode
,
boxBarcode
);
return
ResultBean
.
newOkResult
(
""
);
}
@ApiOperation
(
"9.判断是否需要出库"
)
@RequestMapping
(
"/needOut"
)
@AnonymousAccess
public
ResultBean
needOut
(
HttpServletRequest
request
)
{
String
barcodeStr
=
request
.
getParameter
(
"barcodeStr"
);
//判断物料是不是有效的
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
barcodeStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
barcodeStr
});
}
Barcode
barcode
=
codeBean
.
getBarcode
();
//判断需不需要出库
boolean
needOut
=
false
;
Integer
awaiting
=
barcode
.
getAppendData
(
"awaiting"
);
if
(
awaiting
!=
null
)
{
needOut
=
true
;
}
removeOldBox
(
barcode
);
return
ResultBean
.
newOkResult
(
needOut
);
}
@ApiOperation
(
"10.判断当前料箱是不是还有要出的物料"
)
@RequestMapping
(
"/boxHasOutReel"
)
@AnonymousAccess
public
ResultBean
boxHasOutReel
(
HttpServletRequest
request
)
{
String
boxStr
=
request
.
getParameter
(
"boxStr"
);
//判断物料是不是有效的
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
boxStr
);
if
(!
codeBean
.
isValid
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
boxStr
});
}
Barcode
barcode
=
codeBean
.
getBarcode
();
//判断需不需要出库
boolean
needOut
=
false
;
List
<
Barcode
>
subCodeList
=
barcode
.
getSubCodeList
();
if
(
subCodeList
!=
null
&&
!
subCodeList
.
isEmpty
()){
for
(
Barcode
subCode
:
subCodeList
)
{
Integer
awaiting
=
subCode
.
getAppendData
(
"awaiting"
);
if
(
awaiting
!=
null
)
{
needOut
=
true
;
break
;
}
}
}
return
ResultBean
.
newOkResult
(
needOut
);
}
@ApiOperation
(
"客户端修改缓存信息"
)
@RequestMapping
(
"/updateCacheInfo"
)
@AnonymousAccess
public
ResultBean
updateCacheInfo
(
@RequestBody
Map
<
String
,
Object
>
paramMap
)
{
Map
<
String
,
Object
>
cacheMap
=
dataCache
.
getCache
(
Constants
.
Cache_BoxCacheInfo
);
if
(
cacheMap
==
null
)
{
cacheMap
=
Maps
.
newConcurrentMap
();
}
if
(!
paramMap
.
isEmpty
())
{
for
(
String
key
:
paramMap
.
keySet
())
{
cacheMap
.
put
(
key
,
paramMap
.
get
(
key
));
}
}
dataCache
.
updateCache
(
Constants
.
Cache_BoxCacheInfo
,
cacheMap
);
return
ResultBean
.
newOkResult
(
cacheMap
);
}
@ApiOperation
(
"客户端获取缓存信息"
)
@RequestMapping
(
"/getCacheInfo"
)
@AnonymousAccess
public
ResultBean
getCacheInfo
()
{
Map
<
String
,
Object
>
cacheMap
=
dataCache
.
getCache
(
Constants
.
Cache_BoxCacheInfo
);
if
(
cacheMap
==
null
)
{
cacheMap
=
Maps
.
newConcurrentMap
();
}
return
ResultBean
.
newOkResult
(
cacheMap
);
}
private
void
putInNewBox
(
Barcode
barcode
,
Barcode
boxBarcode
)
{
StoragePos
pos
=
storagePosManager
.
getByBarcode
(
boxBarcode
.
getBarcode
());
if
(
pos
!=
null
)
{
boxBarcode
=
pos
.
getBarcode
();
}
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
setHostBarcodeId
(
boxBarcode
.
getId
());
barcode
.
setPosName
(
boxBarcode
.
getPosName
());
barcodeManager
.
save
(
barcode
);
boxBarcode
.
UpdateSubCode
(
barcode
);
barcodeManager
.
save
(
boxBarcode
);
if
(
pos
!=
null
)
{
pos
.
setBarcode
(
boxBarcode
);
storagePosManager
.
save
(
pos
);
}
DataLog
task
=
new
DataLog
();
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
task
.
setPartNumber
(
barcode
.
getPartNumber
());
task
.
setBarcode
(
barcode
.
getBarcode
());
task
.
setNum
(
barcode
.
getAmount
());
task
.
setType
(
OP
.
PUT_IN
);
task
.
setCid
(
boxBarcode
.
getPartNumber
());
task
.
setStorageName
(
boxBarcode
.
getBarcode
());
task
.
setPosName
(
boxBarcode
.
getBarcode
());
task
.
setOperator
(
"smf"
);
task
=
dataLogManager
.
save
(
task
);
taskService
.
updateFinishedTask
(
task
);
}
private
Barcode
removeOldBox
(
Barcode
barcode
)
{
String
hostBarcodeId
=
barcode
.
getHostBarcodeId
();
if
(
StringUtils
.
isEmpty
(
hostBarcodeId
))
{
return
barcode
;
}
//生成出库任务
String
orderItemId
=
barcode
.
getAppendData
(
"orderItemId"
);
String
orderNo
=
barcode
.
getAppendData
(
"orderNo"
);
String
orderId
=
barcode
.
getAppendData
(
"orderId"
);
Barcode
boxBarcode
=
barcodeManager
.
get
(
barcode
.
getHostBarcodeId
());
StoragePos
pos
=
storagePosManager
.
getByBarcode
(
boxBarcode
.
getBarcode
());
if
(
pos
!=
null
)
{
boxBarcode
=
pos
.
getBarcode
();
}
int
num
=
barcode
.
getAmount
();
barcode
.
setHostBarcodeId
(
""
);
barcode
.
setPosName
(
""
);
barcode
.
updateAppendData
(
"orderItemId"
,
null
);
barcode
.
updateAppendData
(
"orderNo"
,
null
);
barcode
.
updateAppendData
(
"orderId"
,
null
);
barcode
.
updateAppendData
(
"awaiting"
,
null
);
barcode
.
setAmount
(
0
);
//更新料箱信息
boxBarcode
.
UpdateSubCode
(
barcode
);
barcode
.
setAmount
(
num
);
barcodeManager
.
save
(
barcode
);
barcodeManager
.
save
(
boxBarcode
);
if
(
pos
!=
null
)
{
pos
.
setBarcode
(
boxBarcode
);
storagePosManager
.
save
(
pos
);
}
DataLog
task
=
new
DataLog
();
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
task
.
setPartNumber
(
barcode
.
getPartNumber
());
task
.
setBarcode
(
barcode
.
getBarcode
());
task
.
setNum
(
num
);
task
.
setType
(
OP
.
CHECKOUT
);
task
.
setCid
(
boxBarcode
.
getPartNumber
());
task
.
setStorageName
(
boxBarcode
.
getBarcode
());
task
.
setPosName
(
boxBarcode
.
getBarcode
());
task
.
setOperator
(
"smf"
);
if
(
StringUtils
.
isNotEmpty
(
orderItemId
))
{
task
.
setSubSourceId
(
orderItemId
);
}
if
(
StringUtils
.
isNotEmpty
(
orderNo
))
{
task
.
setSourceName
(
orderNo
);
}
if
(
StringUtils
.
isNotEmpty
(
orderId
))
{
task
.
setSourceId
(
orderId
);
}
task
=
dataLogManager
.
save
(
task
);
taskService
.
updateFinishedTask
(
task
);
return
barcode
;
}
private
void
outFromPos
(
DataLog
opTask
)
{
if
(
StringUtils
.
isEmpty
(
opTask
.
getPosId
()))
{
return
;
}
//从队列里面移除操作
taskService
.
removeQueueTask
(
opTask
);
StoragePos
storagePos
=
storagePosManager
.
get
(
opTask
.
getPosId
());
Barcode
barcode
=
storagePos
.
getBarcode
();
if
(
barcode
==
null
)
{
log
.
warn
(
"任务:"
+
opTask
.
getId
()
+
" 仓位:"
+
opTask
.
getPosName
()
+
" 的 Barcode 为null, 之前可能处理过,结束任务后直接返回"
);
return
;
}
barcode
=
barcodeManager
.
get
(
barcode
.
getId
());
if
(
barcode
!=
null
)
{
//二维码状态
barcode
.
setUsed
(
true
);
barcode
.
setUsedDate
(
new
Date
());
barcode
.
setCheckOutDate
(
new
Date
(),
""
);
barcode
.
setLockName
(
null
);
barcode
.
setLockId
(
null
);
barcode
.
setPosName
(
null
);
barcodeManager
.
save
(
barcode
);
}
storagePos
.
setBarcode
(
null
);
storagePos
.
setUsed
(
false
);
storagePosManager
.
save
(
storagePos
);
log
.
info
(
opTask
.
getBarcode
()
+
"出库完成,清空仓位: "
+
storagePos
.
getId
()
+
"["
+
storagePos
.
getPosName
()
+
"]"
);
taskService
.
moveTaskToFinished
(
opTask
);
}
private
boolean
hasNoFinishedTask
(
String
posId
)
{
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
posId
.
equals
(
dataLog
.
getPosId
())
&&
!
dataLog
.
isFinished
()
&&
!
dataLog
.
isCancel
())
{
return
true
;
}
}
return
false
;
}
private
Map
<
String
,
Integer
>
xlcPosReelCount
(
String
cid
)
{
Map
<
String
,
Integer
>
posReelCountMap
=
new
HashMap
<>();
//只找xlc设备的料箱
for
(
Storage
storage
:
dataCache
.
getAllStorage
().
values
())
{
if
(
storage
.
isXLC
()
&&
storage
.
getCid
().
equals
(
cid
))
{
Map
<
String
,
StoragePos
>
usedPosList
=
dataCache
.
getUsedPosList
(
storage
.
getCid
());
if
(
usedPosList
!=
null
&&
!
usedPosList
.
isEmpty
())
{
for
(
StoragePos
pos
:
usedPosList
.
values
())
{
Barcode
barcode
=
pos
.
getBarcode
();
if
(
barcode
!=
null
)
{
List
<
Barcode
>
subCodeList
=
barcode
.
getSubCodeList
();
if
(
subCodeList
==
null
||
subCodeList
.
isEmpty
())
{
posReelCountMap
.
put
(
pos
.
getId
(),
0
);
}
else
{
posReelCountMap
.
put
(
pos
.
getId
(),
subCodeList
.
size
());
}
}
}
}
}
}
return
posReelCountMap
;
}
}
src/main/java/com/neotel/smfcore/custom/france1588/enums/TaskLoc.java
0 → 100644
查看文件 @
48f673d
package
com
.
neotel
.
smfcore
.
custom
.
france1588
.
enums
;
public
class
TaskLoc
{
public
static
final
String
BOX_TASK_IN
=
"BOX_TASK_IN"
;
public
static
final
String
BOX_TASK_OUT
=
"BOX_TASK_OUT"
;
}
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages.properties
查看文件 @
48f673d
...
@@ -435,3 +435,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -435,3 +435,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5E93
\u
4F4D[{1}]
\u
4E2D,
\u
8BF7
\u5148\u
53D6
\u
51FA
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5E93
\u
4F4D[{1}]
\u
4E2D,
\u
8BF7
\u5148\u
53D6
\u
51FA
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6570\u
91CF
\u
5E94
\u
4E3A[{0}]
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6570\u
91CF
\u
5E94
\u
4E3A[{0}]
smfcode.virtual.enter
=
\u
8BF7
\u
626B
\u
63CF
\u6216\u
8F93
\u5165\u6761\u7801\u
540E
\u6309\u
56DE
\u
8F66
\u
786E
\u
8BA4
smfcode.virtual.enter
=
\u
8BF7
\u
626B
\u
63CF
\u6216\u
8F93
\u5165\u6761\u7801\u
540E
\u6309\u
56DE
\u
8F66
\u
786E
\u
8BA4
smfcore.box.findFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
4EE5
\u
51FA
\u
5E93
\u7684\u6599\u
7BB1
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_de_DE.properties
查看文件 @
48f673d
...
@@ -425,3 +425,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -425,3 +425,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}] befindet sich bereits im Lagerplatz [{1}]. Bitte entnehmen Sie es zuerst
smfcore.virtual.boxInPos
=
[{0}] befindet sich bereits im Lagerplatz [{1}]. Bitte entnehmen Sie es zuerst
smfcore.virtual.quantityError
=
Die zu entnehmende Menge sollte [{0}] betragen
smfcore.virtual.quantityError
=
Die zu entnehmende Menge sollte [{0}] betragen
smfcode.virtual.enter
=
Bitte scannen Sie den Barcode oder geben Sie ihn ein und best
\u
00E4tigen Sie mit Enter
smfcode.virtual.enter
=
Bitte scannen Sie den Barcode oder geben Sie ihn ein und best
\u
00E4tigen Sie mit Enter
smfcore.box.findFail
=
Kein verf
\u
00FCgbarer Beh
\u
00E4lter f
\u
00FCr den Ausgang gefunden
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_en_US.properties
查看文件 @
48f673d
...
@@ -426,3 +426,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -426,3 +426,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}] is already in location [{1}]. Please remove it first
smfcore.virtual.boxInPos
=
[{0}] is already in location [{1}]. Please remove it first
smfcore.virtual.quantityError
=
The quantity to be removed should be [{0}]
smfcore.virtual.quantityError
=
The quantity to be removed should be [{0}]
smfcode.virtual.enter
=
Please scan or enter the barcode, then press Enter
smfcode.virtual.enter
=
Please scan or enter the barcode, then press Enter
smfcore.box.findFail
=
No available bin found for outbound
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_fr_FR.properties
查看文件 @
48f673d
...
@@ -425,3 +425,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -425,3 +425,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}] est d
\u
00E9j
\u
00E0 dans l'emplacement [{1}]. Veuillez d'abord le retirer
smfcore.virtual.boxInPos
=
[{0}] est d
\u
00E9j
\u
00E0 dans l'emplacement [{1}]. Veuillez d'abord le retirer
smfcore.virtual.quantityError
=
La quantit
\u
00E9
\u
00E0 retirer doit
\u
00EAtre [{0}]
smfcore.virtual.quantityError
=
La quantit
\u
00E9
\u
00E0 retirer doit
\u
00EAtre [{0}]
smfcode.virtual.enter
=
Veuillez scanner ou saisir le code-barres, puis appuyer sur Entr
\u
00E9e
smfcode.virtual.enter
=
Veuillez scanner ou saisir le code-barres, puis appuyer sur Entr
\u
00E9e
smfcore.box.findFail
=
Aucun bac disponible trouv
\u
00E9 pour la sortie
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_ja_JP.properties
查看文件 @
48f673d
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}]
\u
306F
\u
65E2
\u
306B
\u
30ED
\u
30B1
\u
30FC
\u
30B7
\u
30E7
\u
30F3 [{1}]
\u
306B
\u3042\u
308A
\u
307E
\u3059\u3002\u5148\u
306B
\u
53D6
\u
308A
\u
51FA
\u3057\u3066\u
304F
\u3060\u3055\u3044
smfcore.virtual.boxInPos
=
[{0}]
\u
306F
\u
65E2
\u
306B
\u
30ED
\u
30B1
\u
30FC
\u
30B7
\u
30E7
\u
30F3 [{1}]
\u
306B
\u3042\u
308A
\u
307E
\u3059\u3002\u5148\u
306B
\u
53D6
\u
308A
\u
51FA
\u3057\u3066\u
304F
\u3060\u3055\u3044
smfcore.virtual.quantityError
=
\u
53D6
\u
308A
\u
51FA
\u3057\u6570\u
91CF
\u
306F[{0}]
\u3067\u3042\u
308B
\u
5FC5
\u8981\u
304C
\u3042\u
308A
\u
307E
\u3059
smfcore.virtual.quantityError
=
\u
53D6
\u
308A
\u
51FA
\u3057\u6570\u
91CF
\u
306F[{0}]
\u3067\u3042\u
308B
\u
5FC5
\u8981\u
304C
\u3042\u
308A
\u
307E
\u3059
smfcode.virtual.enter
=
\u
30D0
\u
30FC
\u
30B3
\u
30FC
\u
30C9
\u3092\u
30B9
\u
30AD
\u
30E3
\u
30F3
\u3001\u
307E
\u
305F
\u
306F
\u5165\u
529B
\u
5F8C
\u3001
Enter
\u
30AD
\u
30FC
\u3092\u
62BC
\u3057\u3066\u
304F
\u3060\u3055\u3044
smfcode.virtual.enter
=
\u
30D0
\u
30FC
\u
30B3
\u
30FC
\u
30C9
\u3092\u
30B9
\u
30AD
\u
30E3
\u
30F3
\u3001\u
307E
\u
305F
\u
306F
\u5165\u
529B
\u
5F8C
\u3001
Enter
\u
30AD
\u
30FC
\u3092\u
62BC
\u3057\u3066\u
304F
\u3060\u3055\u3044
smfcore.box.findFail
=
\u
51FA
\u
5EAB
\u
53EF
\u
80FD
\u
306A
\u
7BB1
\u
304C
\u
898B
\u3064\u
304B
\u
308A
\u
307E
\u
305B
\u3093
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_zh_CN.properties
查看文件 @
48f673d
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5E93
\u
4F4D[{1}]
\u
4E2D,
\u
8BF7
\u5148\u
53D6
\u
51FA
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5E93
\u
4F4D[{1}]
\u
4E2D,
\u
8BF7
\u5148\u
53D6
\u
51FA
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6570\u
91CF
\u
5E94
\u
4E3A[{0}]
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6570\u
91CF
\u
5E94
\u
4E3A[{0}]
smfcode.virtual.enter
=
\u
8BF7
\u
626B
\u
63CF
\u6216\u
8F93
\u5165\u6761\u7801\u
540E
\u6309\u
56DE
\u
8F66
\u
786E
\u
8BA4
smfcode.virtual.enter
=
\u
8BF7
\u
626B
\u
63CF
\u6216\u
8F93
\u5165\u6761\u7801\u
540E
\u6309\u
56DE
\u
8F66
\u
786E
\u
8BA4
smfcore.box.findFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
4EE5
\u
51FA
\u
5E93
\u7684\u6599\u
7BB1
\ No newline at end of file
\ No newline at end of file
src/main/resources/messages_zh_TW.properties
查看文件 @
48f673d
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
...
@@ -422,3 +422,4 @@ smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5EAB
\u
4F4D[{1}]
\u
4E2D,
\u
8ACB
\u5148\u
53D6
\u
51FA
smfcore.virtual.boxInPos
=
[{0}]
\u
5DF2
\u5728\u
5EAB
\u
4F4D[{1}]
\u
4E2D,
\u
8ACB
\u5148\u
53D6
\u
51FA
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6578\u
91CF
\u
61C9
\u
70BA[{0}]
smfcore.virtual.quantityError
=
\u
53D6
\u
51FA
\u6578\u
91CF
\u
61C9
\u
70BA[{0}]
smfcode.virtual.enter
=
\u
8ACB
\u6383\u
63CF
\u6216\u
8F38
\u5165\u
689D
\u
78BC
\u
5F8C
\u6309\u
56DE
\u
8ECA
\u
78BA
\u
8A8D
smfcode.virtual.enter
=
\u
8ACB
\u6383\u
63CF
\u6216\u
8F38
\u5165\u
689D
\u
78BC
\u
5F8C
\u6309\u
56DE
\u
8ECA
\u
78BA
\u
8A8D
smfcore.box.findFail
=
\u
672A
\u
627E
\u5230\u
53EF
\u
4EE5
\u
51FA
\u
5EAB
\u7684\u6599\u
7BB1
\ No newline at end of file
\ No newline at end of file
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论