Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 16ca0b8e
由
LN
编写于
2024-11-19 16:10:30 +0800
浏览文件
选项
浏览文件
标签
下载
差异文件
Merge remote-tracking branch 'origin/master'
2 个父辈
0ee4aae6
82706606
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
238 行增加
和
147 行删除
src/main/java/com/neotel/smfcore/common/init/MenuInit.java
src/main/java/com/neotel/smfcore/core/equipment/enums/EquipmentType.java
src/main/java/com/neotel/smfcore/core/equipment/rest/EquipViewController.java
src/main/java/com/neotel/smfcore/core/equipment/rest/dto/EquipStatusDto.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
src/main/java/com/neotel/smfcore/core/order/rest/bean/dto/OrderDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
src/main/java/com/neotel/smfcore/custom/fuji/FujiApi.java
src/main/java/com/neotel/smfcore/custom/fuji/FujiMenu.java
src/main/java/com/neotel/smfcore/custom/fuji/controller/FujiController.java
src/main/java/com/neotel/smfcore/custom/fuji/order/JobHandler.java
src/main/java/com/neotel/smfcore/custom/fuji/order/service/JobService.java
src/main/java/com/neotel/smfcore/custom/fuji/util/NotifyUtil.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/init/MenuInit.java
查看文件 @
16ca0b8
...
...
@@ -118,10 +118,10 @@ public class MenuInit {
//AGV看板
//addDefaultFunctionMenu(1,null,"AGV看板","agvkanban", "agv/agvkanban/index","agv");
addDefaultFunctionMenu
(-
1
,
null
,
"Neo Ai"
,
"neoai"
,
"neoai/index"
,
"neoai"
);
//
addDefaultFunctionMenu(-1,null,"Neo Ai","neoai","neoai/index","neoai");
//Mimo看板
addDefaultFunctionMenu
(
0
,
null
,
"SMD BOX MIMO"
,
"SMDBOXMIMO"
,
"smdBoxMimo/index"
,
"smdMimo"
);
//
addDefaultFunctionMenu(0,null,"SMD BOX MIMO","SMDBOXMIMO", "smdBoxMimo/index","smdMimo");
Menu
boardMap
=
Menu
.
CreatePMenu
(
"仪表盘"
,
0
,
"dashBoard"
,
"kanban"
,
null
);
...
...
@@ -134,9 +134,13 @@ public class MenuInit {
addDefaultFunctionMenu
(
0
,
boardMap
,
"SP仪表盘"
,
"spkanban"
,
"kanban/spkanban/index"
,
"kanban"
);
//设备看板
addDefaultFunctionMenu
(
1
,
null
,
"设备互联"
,
"lockMaterial"
,
"lockMaterial/material/index"
,
"kanban"
,
DEFAULT_SHOW_MENU
);
addDefaultFunctionMenu
(
1
,
null
,
"设备互联"
,
"lockMaterial"
,
"lockMaterial/material/index"
,
"sKanban"
,
DEFAULT_SHOW_MENU
);
Menu
selfAudit
=
Menu
.
CreatePMenu
(
"盘点管理"
,
2
,
"selfAuditManagerment"
,
"selfAudit"
,
null
);
addDefaultFunctionMenu
(
121
,
selfAudit
,
"盘点"
,
"selfAudit"
,
"system/selfAudit/index"
,
"selfAudit"
);
addDefaultFunctionMenu
(
122
,
selfAudit
,
"盘点记录"
,
"selfAuditLog"
,
"system/selfAuditLog/index"
,
"selfAuditLog"
);
//设备互联
addDefaultFunctionMenu
(
2
,
null
,
"设备互联"
,
"equipmentView"
,
"neolight/equipmentView/index"
,
"sKanban"
);
//
addDefaultFunctionMenu(2,null,"设备互联","equipmentView", "neolight/equipmentView/index","sKanban");
//物料管理:工单出库,查找出库(UID出库,PN出库),物料标签,料盒操作,出库策略,工单设置
Menu
poutOut
=
Menu
.
CreatePMenu
(
"物料管理"
,
3
,
"order"
,
"workOrder"
,
null
);
...
...
@@ -158,9 +162,7 @@ public class MenuInit {
// addDefaultFunctionMenu(11, poutOut, "转储入库", "dumpWarehousing", "system/dumpWarehousing/index", "headIcon");
// addDefaultFunctionMenu(12, poutOut, "单盘入库", "singleDiskWarehousing", "system/singleDiskWarehousing/index", "headIcon");
addDefaultFunctionMenu
(
13
,
poutOut
,
"呆滞物料"
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
"sMaterial"
);
addDefaultFunctionMenu
(
14
,
poutOut
,
"安全库存"
,
"safetyInventory"
,
"system/safetyInventory/index"
,
"safeInventory"
);
addDefaultFunctionMenu
(
15
,
poutOut
,
"过期物料"
,
"expireMaterials"
,
"system/expireMaterials/index"
,
"sMaterial"
);
addDefaultFunctionMenu
(
16
,
poutOut
,
"生成工单"
,
"createOrder"
,
"system/createOrder/index"
,
"createOrder"
);
//addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder");
addDefaultFunctionMenu
(
91
,
poutOut
,
"共享文件夹"
,
"orderSetting"
,
"system/orderSetting/index"
,
"sysSet"
,
DEFAULT_SHOW_MENU
);
...
...
@@ -204,17 +206,24 @@ public class MenuInit {
addDefaultFunctionMenu
(
72
,
pMenuReport
,
"库存"
,
"inventory"
,
"neolight/inventory/index"
,
"inventory"
);
addDefaultFunctionMenu
(
73
,
pMenuReport
,
"温湿度"
,
"humiture"
,
"humiture/humitureReport/index"
,
"humiture"
);
addDefaultFunctionMenu
(
73
,
pMenuReport
,
"温湿度"
,
"spHumiture"
,
"humiture/spHumitureReport/index"
,
"humiture"
);
addDefaultFunctionMenu
(
74
,
pMenuReport
,
"安全库存"
,
"safetyInventory"
,
"system/safetyInventory/index"
,
"safeInventory"
);
addDefaultFunctionMenu
(
75
,
pMenuReport
,
"过期物料"
,
"expireMaterials"
,
"system/expireMaterials/index"
,
"sMaterial"
);
addDefaultFunctionMenu
(
81
,
pMenuReport
,
"物料追踪"
,
"materialChart"
,
"neolight/materialChart/index"
,
"maChart"
);
//可观测性:物料追踪
Menu
guanceMenu
=
Menu
.
CreatePMenu
(
"可观测性"
,
10
,
"observability"
,
"scanKey"
,
null
);
addDefaultFunctionMenu
(
81
,
guanceMenu
,
"物料追踪"
,
"materialChart"
,
"neolight/materialChart/index"
,
"maChart"
);
//
Menu guanceMenu = Menu.CreatePMenu("可观测性", 10, "observability", "scanKey",null);
//
addDefaultFunctionMenu(81,guanceMenu, "物料追踪", "materialChart", "neolight/materialChart/index", "maChart");
//物联网:共享文件夹
//Menu pMenuWulian = Menu.CreatePMenu("物联网", 11, "internet", "interMenu",null);
//用户管理:用户管理,角色管理
Menu
pMenuUser
=
Menu
.
CreatePMenu
(
"用户管理"
,
12
,
"userManager"
,
"Steve-Jobs"
,
null
);
addDefaultFunctionMenu
(
111
,
pMenuUser
,
"用户管理"
,
"peoples"
,
"system/user/index"
,
"peoples"
,
DEFAULT_SHOW_MENU
);
addDefaultFunctionMenu
(
112
,
pMenuUser
,
"角色管理"
,
"role"
,
"system/role/index"
,
"role"
,
DEFAULT_SHOW_MENU
);
//设置:料仓管理,菜单管理
Menu
poutSet
=
Menu
.
CreatePMenu
(
"设置"
,
1
2
,
"system"
,
"system"
,
null
);
Menu
poutSet
=
Menu
.
CreatePMenu
(
"设置"
,
1
3
,
"system"
,
"system"
,
null
);
addDefaultFunctionMenu
(
101
,
poutSet
,
"设备管理"
,
"bunker"
,
"storage/storage/index"
,
"database"
,
DEFAULT_SHOW_MENU
);
addDefaultFunctionMenu
(
102
,
poutSet
,
"库位管理"
,
"storagePos"
,
"storagePos/storagePos/index"
,
"tree-table"
,
DEFAULT_SHOW_MENU
);
addDefaultFunctionMenu
(
103
,
poutSet
,
"菜单管理"
,
"menu"
,
"system/menu/index"
,
"menu"
);
...
...
@@ -225,16 +234,6 @@ public class MenuInit {
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
addDefaultFunctionMenu
(
106
,
poutSet
,
"料架设置"
,
"shelfSetting"
,
"system/shelfSetting/index"
,
"translation"
,
NL_SHOW_MENU
);
//用户管理:用户管理,角色管理
Menu
pMenuUser
=
Menu
.
CreatePMenu
(
"用户管理"
,
13
,
"userManager"
,
"Steve-Jobs"
,
null
);
addDefaultFunctionMenu
(
111
,
pMenuUser
,
"用户管理"
,
"peoples"
,
"system/user/index"
,
"peoples"
,
DEFAULT_SHOW_MENU
);
addDefaultFunctionMenu
(
112
,
pMenuUser
,
"角色管理"
,
"role"
,
"system/role/index"
,
"role"
,
DEFAULT_SHOW_MENU
);
//条形码:条码管理,条码设置
Menu
selfAudit
=
Menu
.
CreatePMenu
(
"盘点管理"
,
14
,
"selfAuditManagerment"
,
"selfAudit"
,
null
);
addDefaultFunctionMenu
(
121
,
selfAudit
,
"盘点"
,
"selfAudit"
,
"system/selfAudit/index"
,
"selfAudit"
);
addDefaultFunctionMenu
(
122
,
selfAudit
,
"盘点记录"
,
"selfAuditLog"
,
"system/selfAuditLog/index"
,
"selfAuditLog"
);
Menu
helpAbout
=
Menu
.
CreatePMenu
(
"帮助"
,
9999
,
"help"
,
"help"
,
null
);
addDefaultFunctionMenu
(
99991
,
helpAbout
,
"说明书"
,
"instruction"
,
"system/instruction/index"
,
"aboutBook"
);
addDefaultFunctionMenu
(
99992
,
helpAbout
,
"关于"
,
"about"
,
"system/about/index"
,
"message"
,
DEFAULT_SHOW_MENU
);
...
...
src/main/java/com/neotel/smfcore/core/equipment/enums/EquipmentType.java
查看文件 @
16ca0b8
...
...
@@ -50,5 +50,8 @@ public enum EquipmentType {
/**
* 韩华
*/
HANWHA
()
HANWHA
(),
NEXIM
()
}
src/main/java/com/neotel/smfcore/core/equipment/rest/EquipViewController.java
查看文件 @
16ca0b8
...
...
@@ -16,6 +16,8 @@ import com.neotel.smfcore.core.storage.enums.DeviceType;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.core.system.util.EquipStatusUtil
;
import
com.neotel.smfcore.custom.fuji.bean.FujiConfig
;
import
com.neotel.smfcore.custom.fuji.config.FujiCacheConfig
;
import
com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -57,7 +59,7 @@ public class EquipViewController {
Map
<
String
,
Equipment
>
allEquipList
=
equipmentCache
.
getAllEquipment
();
for
(
Equipment
equip
:
allEquipList
.
values
())
{
EquipStatusDto
dto
=
new
EquipStatusDto
(
equip
.
getId
(),
equip
.
getName
(),
equip
.
getCid
(),
false
,
0
,
""
,
equip
.
getType
());
EquipStatusDto
dto
=
new
EquipStatusDto
(
equip
.
getId
(),
equip
.
getName
(),
equip
.
getCid
(),
false
,
0
,
""
,
equip
.
getType
()
,
false
);
EquipStatusBean
bean
=
EquipStatusUtil
.
getStatusBean
(
equip
.
getCid
());
if
(
bean
!=
null
){
if
(
bean
.
timeOut
()){
...
...
@@ -74,6 +76,11 @@ public class EquipViewController {
dto
.
setOnLine
(
true
);
dto
.
setStatus
(
1
);
}
}
else
if
(
equip
.
getType
().
equalsIgnoreCase
(
EquipmentType
.
NEXIM
.
name
())){
FujiConfig
config
=
dataCache
.
getCache
(
FujiCacheConfig
.
FujiConfig_Cache_Name
);
if
(
config
!=
null
){
dto
.
setActivate
(
true
);
}
}
resultList
.
add
(
dto
);
...
...
@@ -83,7 +90,7 @@ public class EquipViewController {
Collection
<
Storage
>
storages
=
dataCache
.
getAllStorage
().
values
();
for
(
Storage
storage
:
storages
)
{
if
(
storage
.
getType
().
equals
(
DeviceType
.
NLL
.
name
())){
EquipStatusDto
dto
=
new
EquipStatusDto
(
storage
.
getId
(),
storage
.
getName
(),
storage
.
getCid
(),
false
,
0
,
""
,
storage
.
getType
());
EquipStatusDto
dto
=
new
EquipStatusDto
(
storage
.
getId
(),
storage
.
getName
(),
storage
.
getCid
(),
false
,
0
,
""
,
storage
.
getType
()
,
false
);
StatusBean
bean
=
DevicesStatusUtil
.
getStatusBean
(
storage
.
getCid
());
if
(
bean
==
null
||
bean
.
timeOut
()){
dto
.
setOnLine
(
false
);
...
...
src/main/java/com/neotel/smfcore/core/equipment/rest/dto/EquipStatusDto.java
查看文件 @
16ca0b8
...
...
@@ -33,5 +33,6 @@ public class EquipStatusDto implements Serializable {
@ApiModelProperty
(
"设备类型,NEOSCAN=扫码贴标,COUNTING=点料机"
)
private
String
type
=
EquipmentType
.
AUTO
.
name
();
@ApiModelProperty
(
"是否激活"
)
private
boolean
activate
=
false
;
}
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
16ca0b8
...
...
@@ -825,4 +825,8 @@ public class LiteOrderCache {
}
public
Collection
<
LiteOrder
>
getAllLiteOrder
(){
return
liteOrderMap
.
values
();
}
}
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
查看文件 @
16ca0b8
...
...
@@ -471,7 +471,7 @@ public class OrderController {
}
String
result
=
liteOrderCache
.
closeOrder
(
orderNo
);
if
(
ObjectUtil
.
isEmpty
(
result
))
{
if
(
ObjectUtil
.
isEmpty
(
result
)
||
"smfcore.order.close.success"
.
equals
(
result
)
)
{
return
ResultBean
.
newOkResult
(
result
,
result
);
}
else
{
return
ResultBean
.
newErrorResult
(-
1
,
result
,
result
);
...
...
src/main/java/com/neotel/smfcore/core/order/rest/bean/dto/OrderDto.java
查看文件 @
16ca0b8
...
...
@@ -9,7 +9,9 @@ import org.springframework.data.annotation.Transient;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@Getter
@Setter
...
...
@@ -89,4 +91,7 @@ public class OrderDto implements Serializable {
@ApiModelProperty
(
"工单线别"
)
private
String
line
=
""
;
@ApiModelProperty
(
"附加字段"
)
private
Map
<
String
,
String
>
appendData
=
new
HashMap
<>();
}
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
查看文件 @
16ca0b8
...
...
@@ -562,6 +562,13 @@ public class StoragePosController {
// throw new ValidateException("位置[" + pid + "]不存在");
continue
;
}
Barcode
posBarcode
=
pos
.
getBarcode
();
if
(
posBarcode
==
null
){
log
.
info
(
pos
.
getPosName
()+
"库位上没有物料,跳过"
);
continue
;
}
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
if
(
storage
==
null
)
{
throw
new
ValidateException
(
"smfcore.valueNotExist"
,
"{0}[{1}]不存在"
,
new
String
[]{
"storageId"
,
pos
.
getStorageId
()});
...
...
src/main/java/com/neotel/smfcore/custom/fuji/FujiApi.java
查看文件 @
16ca0b8
...
...
@@ -74,8 +74,11 @@ public class FujiApi extends BaseSmfApiListener {
@Override
public
void
outTaskStatusChange
(
String
outNotifyUrl
,
DataLog
task
)
{
if
(
task
.
isFinished
())
{
//NotifyUtil.createLoadEtn(task.getBarcode(),task.getPosName(),task.getNum(),"",task.getW(),task.getH(),task.getPartNumber(),task.getStorageName(),FileDirectoryConfig.NOTIFY);
NotifyUtil
.
createProvideEtn
(
task
.
getBarcode
(),
task
.
getPosName
(),
task
.
getNum
(),
""
,
task
.
getW
(),
task
.
getH
(),
task
.
getPartNumber
(),
task
.
getSourceName
(),
task
.
getLine
(),
task
.
getStorageName
(),
getNotifyEtn
());
String
fileName
=
task
.
getAppendData
(
"fileName"
)
==
null
?
""
:
task
.
getAppendData
(
"fileName"
).
toString
();
String
sourceName
=
task
.
getAppendData
(
"jobName"
)
==
null
?
""
:
task
.
getAppendData
(
"jobName"
).
toString
();
NotifyUtil
.
createProvideEtn
(
task
.
getBarcode
(),
task
.
getPosName
(),
task
.
getNum
(),
""
,
task
.
getW
(),
task
.
getH
(),
task
.
getPartNumber
(),
sourceName
,
task
.
getLine
(),
task
.
getStorageName
(),
getNotifyEtn
(),
fileName
);
//NotifyUtil.createDeleteEtn(task.getBarcode(),task.getW(),task.getH(),task.getPartNumber(),FileDirectoryConfig.NOTIFY);
}
}
...
...
src/main/java/com/neotel/smfcore/custom/fuji/FujiMenu.java
0 → 100644
查看文件 @
16ca0b8
package
com
.
neotel
.
smfcore
.
custom
.
fuji
;
import
com.neotel.smfcore.common.init.MenuInit
;
import
com.neotel.smfcore.core.api.SmfApi
;
import
com.neotel.smfcore.security.service.po.Menu
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.PostConstruct
;
@Component
public
class
FujiMenu
{
@Autowired
MenuInit
menuInit
;
@Autowired
SmfApi
smfApi
;
@PostConstruct
public
void
init
(){
String
menuLabel
=
"fuji"
;
Menu
nexim
=
Menu
.
CreatePMenu
(
"Nexim"
,
3
,
"nexim"
,
"nexim"
,
null
);
MenuInit
.
addMenu
(
menuLabel
,
nexim
,
3
,
"Nexim 工单"
,
"neximWorkOrder"
,
"neolight/neximWorkOrder/index"
,
"neximWorkOrder"
);
String
apiName
=
smfApi
.
getApiName
();
if
(
Strings
.
isNotBlank
(
apiName
)
&&
apiName
.
equals
(
menuLabel
)){
menuInit
.
showMenu
(
apiName
);
}
}
}
src/main/java/com/neotel/smfcore/custom/fuji/controller/FujiController.java
查看文件 @
16ca0b8
...
...
@@ -6,9 +6,13 @@ import com.neotel.smfcore.common.utils.StringUtils;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.order.service.po.LiteOrderItem
;
import
com.neotel.smfcore.custom.fuji.FujiApi
;
import
com.neotel.smfcore.custom.fuji.bean.FujiConfig
;
import
com.neotel.smfcore.custom.fuji.config.FujiCacheConfig
;
import
com.neotel.smfcore.custom.fuji.order.service.JobService
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -17,7 +21,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.Map
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Slf4j
@RestController
...
...
@@ -33,9 +38,15 @@ public class FujiController {
@Autowired
private
FujiApi
fujiApi
;
@Autowired
private
LiteOrderCache
liteOrderCache
;
@Autowired
private
JobService
jobService
;
@ApiOperation
(
"修改配置"
)
@RequestMapping
(
"/updateFujiConfig"
)
@AnonymousAccess
//
@AnonymousAccess
public
ResultBean
updateFujiConfig
(
@RequestBody
FujiConfig
newConfig
)
{
log
.
info
(
"修改配置信息为:"
+
JSON
.
toJSONString
(
newConfig
));
FujiConfig
config
=
dataCache
.
getCache
(
FujiCacheConfig
.
FujiConfig_Cache_Name
);
...
...
@@ -54,7 +65,7 @@ public class FujiController {
@ApiOperation
(
"获取配置"
)
@RequestMapping
(
"/getFujiConfig"
)
@AnonymousAccess
//
@AnonymousAccess
public
ResultBean
getFujiConfig
()
{
FujiConfig
config
=
dataCache
.
getCache
(
FujiCacheConfig
.
FujiConfig_Cache_Name
);
if
(
config
==
null
)
{
...
...
@@ -65,7 +76,7 @@ public class FujiController {
@ApiOperation
(
"did注册"
)
@RequestMapping
(
"/didRegister"
)
@AnonymousAccess
//
@AnonymousAccess
public
ResultBean
didRegister
(
@RequestBody
Map
<
String
,
String
>
paramMap
)
{
String
code
=
paramMap
.
get
(
"code"
);
if
(
StringUtils
.
isEmpty
(
code
))
{
...
...
@@ -84,4 +95,81 @@ public class FujiController {
return
ResultBean
.
newOkResult
(
""
);
}
@ApiOperation
(
"job出库"
)
@RequestMapping
(
"/jobCheckOut"
)
@AnonymousAccess
public
synchronized
ResultBean
jobCheckOut
(
String
orderNo
)
{
LiteOrder
liteOrder
=
liteOrderCache
.
getLiteOrder
(
orderNo
);
if
(
liteOrder
==
null
){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.order.out.notFound"
,
"工单未找到"
);
}
if
(
liteOrder
.
isClosed
()){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.order.hasClose"
,
"工单已关闭"
);
}
if
(!
liteOrder
.
isNew
()){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.order.out.executing"
,
"工单正在执行"
);
}
liteOrder
=
jobService
.
executeJob
(
liteOrder
);
jobService
.
writeAns
(
liteOrder
);
return
ResultBean
.
newOkResult
(
""
);
}
@ApiOperation
(
"获取需要出库/正在执行中的job任务"
)
@RequestMapping
(
"/jobInfo"
)
@AnonymousAccess
public
ResultBean
getJobInfo
()
{
List
<
Map
<
String
,
Object
>>
resultList
=
new
ArrayList
<>();
Collection
<
LiteOrder
>
allLiteOrder
=
liteOrderCache
.
getAllLiteOrder
();
if
(
allLiteOrder
!=
null
&&
!
allLiteOrder
.
isEmpty
())
{
List
<
LiteOrder
>
liteOrderList
=
new
ArrayList
<>();
for
(
LiteOrder
liteOrder
:
allLiteOrder
)
{
if
(
liteOrder
.
isNew
()
||
liteOrder
.
isOutTails
())
{
liteOrderList
.
add
(
liteOrder
);
}
else
{
//其他的默认超过2个小时 不展示
if
(
System
.
currentTimeMillis
()
-
liteOrder
.
getUpdateDate
().
getTime
()
<=
1000
*
60
*
60
*
2
){
liteOrderList
.
add
(
liteOrder
);
}
}
}
liteOrderList
=
liteOrderList
.
stream
().
sorted
(
Comparator
.
comparing
(
LiteOrder:
:
getCreateDate
).
reversed
()).
collect
(
Collectors
.
toList
());
for
(
LiteOrder
liteOrder
:
liteOrderList
)
{
Map
<
String
,
Object
>
resultMap
=
new
HashMap
<>();
String
jobState
=
liteOrder
.
getAppend
(
"jobState"
);
String
jobName
=
liteOrder
.
getAppend
(
"jobName"
);
String
fileName
=
liteOrder
.
getAppend
(
"fileName"
);
resultMap
.
put
(
"jobState"
,
jobState
);
resultMap
.
put
(
"jobName"
,
jobName
);
resultMap
.
put
(
"fileName"
,
fileName
);
List
<
Map
<
String
,
String
>>
itemList
=
new
ArrayList
<>();
for
(
LiteOrderItem
orderItem
:
liteOrder
.
getOrderItems
())
{
Map
<
String
,
String
>
itemMap
=
new
HashMap
<>();
String
item
=
orderItem
.
getAppend
(
"item"
);
String
errorCode
=
orderItem
.
getAppend
(
"errorCode"
);
String
errorText
=
orderItem
.
getAppend
(
"errorText"
);
String
ri
=
orderItem
.
getRi
();
String
pn
=
orderItem
.
getPn
();
int
needReelCount
=
orderItem
.
getNeedReelCount
();
itemMap
.
put
(
"item"
,
item
);
itemMap
.
put
(
"errorCode"
,
""
);
if
(!
"0"
.
equals
(
errorCode
)){
itemMap
.
put
(
"errorCode"
,
errorCode
);
}
itemMap
.
put
(
"errorText"
,
errorText
);
itemMap
.
put
(
"ri"
,
ri
);
itemMap
.
put
(
"pn"
,
pn
);
itemMap
.
put
(
"needReelCount"
,
needReelCount
+
""
);
itemList
.
add
(
itemMap
);
}
resultMap
.
put
(
"itemList"
,
itemList
);
resultList
.
add
(
resultMap
);
}
}
return
ResultBean
.
newOkResult
(
resultList
);
}
}
src/main/java/com/neotel/smfcore/custom/fuji/order/JobHandler.java
查看文件 @
16ca0b8
...
...
@@ -70,7 +70,7 @@ public class JobHandler {
config
=
new
FujiConfig
();
}
if
(
System
.
currentTimeMillis
()-
lastHandleTime
>=
1000
*
config
.
getTime
()){
log
.
info
(
DateUtil
.
toDateString
(
System
.
currentTimeMillis
(),
"yyyy-MM-dd HH:mm:ss"
));
//
log.info(DateUtil.toDateString(System.currentTimeMillis(),"yyyy-MM-dd HH:mm:ss"));
try
{
handler
();
}
catch
(
Exception
e
)
{
...
...
@@ -116,114 +116,34 @@ public class JobHandler {
log
.
info
(
"获取到line为:"
+
JSON
.
toJSONString
(
lineList
));
//开始处理每行数据
Job
job
=
getJob
(
lineList
);
Job
job
=
jobService
.
getJob
(
lineList
);
String
ansName
=
currentFile
.
getName
();
int
pos
=
ansName
.
lastIndexOf
(
"."
);
ansName
=
pos
>
0
?
ansName
.
substring
(
0
,
pos
)
:
ansName
;
//判断是否已经存在job
/* boolean existJob = jobService.isExistJob(job.getName()
);
boolean
existJob
=
jobService
.
isExistJob
(
job
.
getName
(),
ansName
);
if
(
existJob
){
return
;
}
*/
}
job
=
jobService
.
getJobResultInfo
(
job
);
LiteOrder
liteOrder
=
jobService
.
getJobResultInfo
(
job
,
ansName
,
lineList
);
//旧的文件,移除到其他文件夹,写入ANS文件
String
newFilePath
=
"nexim/eto/"
+
currentFile
.
getName
();
FileUtil
.
move
(
currentFile
,
new
File
(
newFilePath
),
true
);
//新写入文件到当前文件夹
List
<
JobItem
>
data
=
job
.
getData
();
int
error
=
0
;
for
(
JobItem
item
:
data
)
{
if
(
error
==
1
){
continue
;
}
else
{
if
(
item
.
getErrorCode
()
==
1902
||
item
.
getErrorCode
()
==
1928
){
error
=
2
;
}
else
if
(
item
.
getErrorCode
()
==
1876
||
item
.
getErrorCode
()
==
1877
||
item
.
getErrorCode
()
==
1878
||
item
.
getErrorCode
()
==
1886
||
item
.
getErrorCode
()
==
1901
){
error
=
1
;
}
}
//判断是否为自动出库
if
(
"PROVIDE_DELETE"
.
equals
(
job
.
getJobState
())){
jobService
.
writeAns
(
liteOrder
);
}
}
}
lineList
.
add
(
"[Result]"
);
lineList
.
add
(
"Error="
+
error
);
for
(
JobItem
item
:
data
)
{
if
(
item
.
getErrorCode
()
!=
0
){
lineList
.
add
(
item
.
getItem
()+
"="
+
item
.
getErrorCode
()+
":"
+
item
.
getErrorText
());
}
}
//写入文件到当前文件夹
String
ansName
=
currentFile
.
getName
();
int
pos
=
ansName
.
lastIndexOf
(
"."
);
ansName
=
pos
>
0
?
ansName
.
substring
(
0
,
pos
)
:
ansName
;
String
ansFilePath
=
path
+
"\\"
+
ansName
+
".ANS"
;
try
(
BufferedWriter
writer
=
new
BufferedWriter
(
new
FileWriter
(
ansFilePath
)))
{
for
(
String
line
:
lineList
)
{
// 逐行写入 List 中的内容
writer
.
write
(
line
);
writer
.
newLine
();
// 写入换行符以分隔每一行
}
}
catch
(
IOException
e
)
{
// 处理可能发生的 IO 异常
log
.
info
(
"写入文件时发生错误: "
,
e
);
}
//生成出库任务
List
<
DataLog
>
dataLogList
=
job
.
getDataLogList
();
if
(
dataLogList
!=
null
&&
!
dataLogList
.
isEmpty
()){
for
(
DataLog
dataLog
:
dataLogList
)
{
taskService
.
updateQueueTask
(
dataLog
);
}
}
}
}
private
Job
getJob
(
List
<
String
>
lineList
)
{
Job
job
=
new
Job
();
for
(
String
line
:
lineList
)
{
String
[]
lineSpl
=
line
.
split
(
"="
);
if
(
line
.
startsWith
(
"Action"
))
{
job
.
setAction
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"Object"
))
{
job
.
setObject
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"Name"
))
{
job
.
setName
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"Los"
))
{
job
.
setLos
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"JobState"
))
{
job
.
setJobState
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"ProdSite"
))
{
job
.
setProdSite
(
lineSpl
[
1
]);
}
else
if
(
line
.
startsWith
(
"Answer"
))
{
job
.
setAnswer
(
lineSpl
[
1
]);
}
}
List
<
JobItem
>
itemList
=
new
ArrayList
<>();
for
(
String
line
:
lineList
)
{
if
(
line
.
startsWith
(
"Item"
))
{
String
[]
lineSpl
=
line
.
split
(
"="
);
JobItem
item
=
new
JobItem
();
item
.
setItem
(
lineSpl
[
0
]);
String
[]
split
=
lineSpl
[
1
].
split
(
"\\|"
);
item
.
setPart
(
split
[
0
]);
item
.
setCarrier
(
split
[
1
]);
if
(
StringUtils
.
isNotEmpty
(
split
[
2
]))
{
item
.
setNeedNum
(
Integer
.
valueOf
(
split
[
2
]));
}
if
(
StringUtils
.
isNotEmpty
(
split
[
3
]))
{
item
.
setNeedReelCount
(
Integer
.
valueOf
(
split
[
3
]));
}
itemList
.
add
(
item
);
}
}
job
.
setData
(
itemList
);
return
job
;
}
}
src/main/java/com/neotel/smfcore/custom/fuji/order/service/JobService.java
查看文件 @
16ca0b8
此文件的差异被折叠,
点击展开。
src/main/java/com/neotel/smfcore/custom/fuji/util/NotifyUtil.java
查看文件 @
16ca0b8
...
...
@@ -91,13 +91,19 @@ public class NotifyUtil {
String
sourceName
,
String
line
,
String
storageName
,
String
path
)
{
String
path
,
String
fileName
)
{
OutputStreamWriter
out
=
null
;
String
localFilePath
=
""
;
try
{
//CARRIER_1608R-00002_LOAD_20240524_15_00_02.ETN
//localFilePath = path + "CARRIER_" + barcode + "_PROVIDE_" + new SimpleDateFormat("yyyyMMdd_HH_mm_ss").format(new Date()) + ".ETN";
localFilePath
=
path
+
"\\"
+
barcode
+
"_PROVIDE"
+
".ETN"
;
if
(
StringUtils
.
isEmpty
(
sourceName
))
{
localFilePath
=
path
+
"\\"
+
barcode
+
"_PROVIDE"
+
".ETN"
;
}
else
{
localFilePath
=
path
+
"\\"
+
fileName
+
".ETN"
;
}
//localFilePath = path +"\\"+barcode+"_PROVIDE"+".ETN";
log
.
info
(
"本地文件路径为:"
+
localFilePath
);
//log.info("内容为:" + JSON.toJSONString(notify));
...
...
src/main/resources/messages.properties
查看文件 @
16ca0b8
...
...
@@ -375,19 +375,20 @@ smfcore.spbox.expireOut=\u8FC7\u671F\u7269\u6599\u51FA\u5E93
smfcore.humiture.codetemperature
=
\u5236\u
51B7
\u
6E29
\u
5EA6
smfcore.humiture.ntemperature
=
\u
51B7
\u
85CF
\u
6E29
\u
5EA6
smfcore.cyclecount.executing
=
Cycle Count
\u
6B63
\u5728\u6267\u
884C
smfcore.eleckanban
=
\u
7535\u
5B50
\u
770B
\u
677F
smfcore.eleckanban
=
\u
4EEA
\u8868\u
76D82
smfcore.agv.already.call
=
\u
5DF2
\u
7ECF
\u
547C
\u
53EB
smfcore.agv.pickup
=
AGV
\u
5DF2
\u
88AB
\u
53EB
\u6765\u
53D6
\u
8D27
smfcore.agv.dispatch
=
\u
8D27
\u7269\u
5DF2
\u
7ECF
\u
53D1
\u9001\u5230\u
5B58
\u
50A8
\u
7CFB
\u
7EDF
smfcore.agv.awaitingInstruction
=
\u
7B49
\u
5F85
\u6307\u
793A
smfcore.agv.operation
=
AGV
\u5728\u
8FD0
\u
884C
\u
4E2D
smfcore.boxmimokanban
=
\u
4E
91
\u6599\u
4ED3
\u
770B
\u
677F
smfcore.boxmimokanban
=
\u
4E
EA
\u8868\u
76D81
smfcore.neoai
=
Neo Ai
smfcore.duo.offline
=
\u
8BBE
\u5907
{0}
\u
79BB
\u
7EBF
smfcore.msg.op.fail
=
\u
64CD
\u
4F5C
\u5931\u
8D25
smfcore.equip.notExist
=
\u
8BBE
\u5907\u
4E0D
\u
5B58
\u5728
smfcore.order.finished
=
\u
5DE5
\u5355
[{0}]
\u7684\u
4EFB
\u
52A1
\u
5DF2
\u5168\u
90E8
\u
5B8C
\u6210
smfcore.spkanban
=
SP
\u
4EEA
\u8868\u
76D8
smfcore.neximWorkOrder
=
Nexim
\u
5DE5
\u5355
smfcore.storagePos.plateSize
=
\u6599\u
76D8
\u
5C3A
\u
5BF8
smfcore.storagePos.w
=
\u
76F4
\u
5F84
smfcore.storagePos.h
=
\u
539A
\u
5EA6
...
...
@@ -398,4 +399,6 @@ smfcore.storagePos.layer=\u5C42
smfcore.storagePos.slot
=
\u
69FD
\u
4F4D
smfcore.storagePos.available
=
\u
662F
\u5426\u
53EF
\u7528
smfcore.storagePos.yes=
\u
662F
smfcore.storagePos.no
=
\u5426
\ No newline at end of file
smfcore.storagePos.no
=
\u5426
smfcore.dashBoard
=
\u
4EEA
\u8868\u
76D8
smfcore.spHumiture
=
\u
6E29
\u
6E7F
\u
5EA6
\ No newline at end of file
src/main/resources/messages_en_US.properties
查看文件 @
16ca0b8
...
...
@@ -62,7 +62,7 @@ smfcore.checkNg=checking material is ng:{0}
smfcore.loadMaterialFinished
=
Loading material finished: {0}
smfcore.lockMaterial
=
EPM
smfcore.lightGroup
=
Neo Light Grouping
smfcore.order
=
Material
Management
smfcore.order
=
Material
smfcore.workOrder
=
Work Order
smfcore.workOrderkanban
=
WO KANBAN
smfcore.searchOut
=
Search
...
...
@@ -71,7 +71,7 @@ smfcore.system=System
smfcore.bunker
=
Equipment
smfcore.storagePos
=
Storage Location
smfcore.menu
=
Menu Manager
smfcore.materiel
=
Product Info
smfcore.materiel
=
Product Info
.
smfcore.componentParts
=
Component
smfcore.barcode
=
MA ID Manager
smfcore.log
=
Big Data
...
...
@@ -138,7 +138,7 @@ smfcore.shelf.msg.noTask=The operation failed, and the corresponding outgoing ta
smfcore.shelf.msg.scanPos
=
Please scan the library code first
smfcore.shelf.msg.inOk
=
The operation is successful, please put it into the storage space[{0}]
smfcore.label.noReel
=
Material not found for release
smfcore.msd
=
MSD
Management
smfcore.msd
=
MSD
smfcore.msdManage
=
MSD Inventory
smfcore.msdData
=
MSD Traceability
smfcore.msdSetting
=
MSD Setting
...
...
@@ -146,7 +146,7 @@ smfcore.translation=Resource Translation
smfcore.languageCanotNull
=
Language type cannot be empty
smfcore.noLanguageSetAccess
=
No permission to edit the language
smfcore.languageCanotRemoveAll
=
Cannot delete all languages
smfcore.solderPaste
=
Solder Paste
Management
smfcore.solderPaste
=
Solder Paste
smfcore.solderPasteKanban
=
Equipment Overview
smfcore.solderPasteManage
=
Inventory
smfcore.solderPasteData
=
Traceability
...
...
@@ -365,20 +365,21 @@ smfcore.spbox.expireOut=Expired solder paste out of storage
smfcore.humiture.codetemperature
=
Refrigeration zone temperature
smfcore.humiture.ntemperature
=
Return temperature zone temperature
smfcore.cyclecount.executing
=
Cycle Count are being executed
smfcore.eleckanban
=
Dash
Board
smfcore.eleckanban
=
Dash
board2
smfcore.agv.already.call
=
Already called
smfcore.agv.pickup
=
AGV has been called to pick up goods
smfcore.agv.dispatch
=
Goods dispatched to storage system
smfcore.agv.awaitingInstruction
=
Awaiting instruction
smfcore.agv.operation
=
AGV is in operation
smfcore.boxmimokanban
=
SMD BOX KANBAN
smfcore.boxmimokanban
=
Dashboard1
smfcore.neoai
=
Neo Ai
smfcore.duo.offline
=
Equipment {0} offline
smfcore.msg.op.fail
=
failure of an operation
smfcore.equip.notExist
=
Device does not exist
smfcore.order.finished
=
workorder[{0}] has completed all of its tasks
smfcore.spkanban
=
SP Dash Board
smfcore.spkanban
=
SP Dashboard
smfcore.neximWorkOrder
=
Nexim Work Order
smfcore.storagePos.plateSize
=
Detected Size
smfcore.storagePos.w
=
Diameter
smfcore.storagePos.h
=
Thickness
...
...
@@ -389,4 +390,6 @@ smfcore.storagePos.layer=Layer
smfcore.storagePos.slot
=
Slot
smfcore.storagePos.available
=
Available
smfcore.storagePos.yes
=
Yes
smfcore.storagePos.no
=
No
\ No newline at end of file
smfcore.storagePos.no
=
No
smfcore.dashBoard
=
Dashboard
smfcore.spHumiture
=
Temperature & Humidity
\ No newline at end of file
src/main/resources/messages_ja_JP.properties
查看文件 @
16ca0b8
...
...
@@ -367,7 +367,7 @@ smfcore.agv.pickup=AGV\u304C\u5546\u54C1\u3092\u53D7\u3051\u53D6\u308B\u305F\u30
smfcore.agv.dispatch
=
\u
4FDD
\u
7BA1
\u
30B7
\u
30B9
\u
30C6
\u
30E0
\u
306B
\u
767A
\u9001\u3055\u
308C
\u
308B
\u5546\u
54C1
smfcore.agv.awaitingInstruction
=
\u6307\u
793A
\u
5F85
\u3061
smfcore.agv.operation
=
AGV
\u
52D5
\u
4F5C
\u
4E2D
\u3067\u3059
smfcore.eleckanban
=
\u
30C0
\u
30C3
\u
30B7
\u
30E5
\u
30DC
\u
30FC
\u
30C9
smfcore.boxmimokanban
=
\u
30AF
\u
30E9
\u
30A6
\u
30C9
\u5009\u
5EAB
\u
30AB
\u
30F3
\u
30D0
\u
30F3
smfcore.neoai
=
Neo Ai
smfcore.duo.offline
=
\u
8BBE
\u5907
{0}
\u
79BB
\u
7EBF
...
...
@@ -375,6 +375,7 @@ smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist
=
\u
8BBE
\u5907\u
4E0D
\u
5B58
\u5728
smfcore.order.finished
=
\u
30EF
\u
30FC
\u
30AF
\u
30AA
\u
30FC
\u
30C0
\u
30FC[{0}]
\u
306E
\u
30BF
\u
30B9
\u
30AF
\u
306F
\u3059\u3079\u3066\u
5B8C
\u
4E86
\u3057\u
307E
\u3057\u
305F
smfcore.spkanban
=
\u
30C0
\u
30C3
\u
30B7
\u
30E5
\u
30DC
\u
30FC
\u
30C9
smfcore.neximWorkOrder
=
Nexim
\u
5DE5
\u
55AE
smfcore.storagePos.plateSize
=
\u6599\u
76D8
\u
5C3A
\u
5BF8
smfcore.storagePos.w
=
\u
76F4
\u
5F84
smfcore.storagePos.h
=
\u
539A
\u3055
...
...
@@ -385,4 +386,6 @@ smfcore.storagePos.layer=\u5C42
smfcore.storagePos.slot
=
\u
69FD
\u
4F4D
smfcore.storagePos.available
=
\u5229\u7528\u
53EF
\u5426
smfcore.storagePos.yes=
\u
662F
smfcore.storagePos.no
=
\u5426
\ No newline at end of file
smfcore.storagePos.no
=
\u5426
smfcore.dashBoard
=
\u
30C0
\u
30C3
\u
30B7
\u
30E5
\u
30DC
\u
30FC
\u
30C9
smfcore.spHumiture
=
\u
6E29
\u
6E7F
\u
5EA6
\ No newline at end of file
src/main/resources/messages_zh_CN.properties
查看文件 @
16ca0b8
...
...
@@ -367,14 +367,15 @@ smfcore.agv.pickup=AGV\u5DF2\u88AB\u53EB\u6765\u53D6\u8D27
smfcore.agv.dispatch
=
\u
8D27
\u7269\u
5DF2
\u
7ECF
\u
53D1
\u9001\u5230\u
5B58
\u
50A8
\u
7CFB
\u
7EDF
smfcore.agv.awaitingInstruction
=
\u
7B49
\u
5F85
\u6307\u
793A
smfcore.agv.operation
=
AGV
\u5728\u
8FD0
\u
884C
\u
4E2D
smfcore.boxmimokanban
=
\u
4E
91
\u6599\u
4ED3
\u
770B
\u
677F
smfcore.eleckanban
=
\u
4EEA
\u8868\u
76D82
smfcore.boxmimokanban
=
\u
4E
EA
\u8868\u
76D81
smfcore.neoai
=
Neo Ai
smfcore.duo.offline
=
\u
8BBE
\u5907
{0}
\u
79BB
\u
7EBF
smfcore.msg.op.fail
=
\u
64CD
\u
4F5C
\u5931\u
8D25
smfcore.equip.notExist
=
\u
8BBE
\u5907\u
4E0D
\u
5B58
\u5728
smfcore.order.finished
=
\u
5DE5
\u5355
[{0}]
\u7684\u
4EFB
\u
52A1
\u
5DF2
\u5168\u
90E8
\u
5B8C
\u6210
smfcore.spkanban
=
SP
\u
4EEA
\u8868\u
76D8
smfcore.neximWorkOrder
=
Nexim
\u
5DE5
\u5355
smfcore.storagePos.plateSize
=
\u6599\u
76D8
\u
5C3A
\u
5BF8
smfcore.storagePos.w
=
\u
76F4
\u
5F84
smfcore.storagePos.h
=
\u
539A
\u
5EA6
...
...
@@ -385,4 +386,6 @@ smfcore.storagePos.layer=\u5C42
smfcore.storagePos.slot
=
\u
69FD
\u
4F4D
smfcore.storagePos.available
=
\u
662F
\u5426\u
53EF
\u7528
smfcore.storagePos.yes
=
\u
662F
smfcore.storagePos.no
=
\u5426
\ No newline at end of file
smfcore.storagePos.no
=
\u5426
smfcore.dashBoard=
\u
4EEA
\u8868\u
76D8
smfcore.spHumiture
=
\u
6E29
\u
6E7F
\u
5EA6
\ No newline at end of file
src/main/resources/messages_zh_TW.properties
查看文件 @
16ca0b8
...
...
@@ -367,14 +367,15 @@ smfcore.agv.pickup=AGV\u5DF2\u88AB\u53EB\u4F86\u53D6\u8CA8
smfcore.agv.dispatch
=
\u
8CA8
\u7269\u
767C
\u9001\u5230\u
5B58
\u5132\u
7CFB
\u
7D71
smfcore.agv.awaitingInstruction
=
\u
7B49
\u
5F85
\u6307\u
793A
smfcore.agv.operation
=
AGV
\u
6B63
\u5728\u
904B
\u
884C
smfcore.boxmimokanban
=
\u
96F2
\u6599\u5009\u
770B
\u
677F
smfcore.eleckanban
=
\u
4EEA
\u8868\u
76D82
smfcore.boxmimokanban
=
\u
4EEA
\u8868\u
76D81
smfcore.neoai
=
Neo Ai
smfcore.duo.offline
=
\u
8A2D
\u5099
{0}
\u
96E2
\u
7DDA
smfcore.msg.op.fail
=
\u
64CD
\u
4F5C
\u5931\u6557
smfcore.equip.notExist
=
\u
8A2D
\u5099\u
4E0D
\u
5B58
\u5728
smfcore.order.finished
=
\u
5DE5
\u
55AE[{0}]
\u7684\u
4EFB
\u
52D9
\u
5DF2
\u5168\u
90E8
\u
5B8C
\u6210
smfcore.spkanban
=
SP
\u5100\u9336\u
76E4
smfcore.neximWorkOrder
=
Nexim
\u
30EF
\u
30FC
\u
30AF
\u
30AA
\u
30FC
\u
30C0
\u
30FC
\u
30A2
\u
30A6
\u
30C8
smfcore.storagePos.plateSize
=
\u6599\u
76D8
\u
5C3A
\u
5BF8
smfcore.storagePos.w
=
\u
76F4
\u
5F84
smfcore.storagePos.h
=
\u
539A
\u
5EA6
...
...
@@ -385,4 +386,6 @@ smfcore.storagePos.layer=\u5C64
smfcore.storagePos.slot
=
\u
69FD
\u
4F4D
smfcore.storagePos.available
=
\u
662F
\u5426\u
53EF
\u7528
smfcore.storagePos.yes
=
\u
662F
smfcore.storagePos.no
=
\u5426
\ No newline at end of file
smfcore.storagePos.no
=
\u5426
smfcore.dashBoard=SP
\u5100\u9336\u
76E4
smfcore.spHumiture
=
\u
6E29
\u
6E7F
\u
5EA6
\ No newline at end of file
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论