Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit b924137f
由
LN
编写于
2022-03-18 11:09:52 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
安全库存和呆滞物料功能
1 个父辈
eeff6c50
隐藏空白字符变更
内嵌
并排
正在显示
23 个修改的文件
包含
474 行增加
和
58 行删除
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
src/main/java/com/neotel/smfcore/core/barcode/rest/ComponentController.java
src/main/java/com/neotel/smfcore/core/barcode/rest/bean/dto/ComponentDto.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/device/handler/impl/BaseDeviceHandler.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialBoxController.java
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialStockController.java
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/SafetyInventoryDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/SluggishMaterialsDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/mapstruct/SafetyInventoryMapper.java
src/main/java/com/neotel/smfcore/core/storage/rest/query/SafetyInventoryQueryCriteria.java
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.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
修改记录.txt
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
查看文件 @
b924137
...
@@ -210,6 +210,8 @@ public class DataInitManager {
...
@@ -210,6 +210,8 @@ public class DataInitManager {
Menu
zhuanruMenu
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"dumpWarehousing"
,
"转储入库"
,
1
,
"dumpWarehousing"
,
"system/dumpWarehousing/index"
,
""
,
0
,
"headIcon"
);
Menu
zhuanruMenu
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"dumpWarehousing"
,
"转储入库"
,
1
,
"dumpWarehousing"
,
"system/dumpWarehousing/index"
,
""
,
0
,
"headIcon"
);
Menu
singleMenu
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"singleDiskWarehousing"
,
"单盘入库"
,
1
,
"singleDiskWarehousing"
,
"system/singleDiskWarehousing/index"
,
""
,
0
,
"headIcon"
);
Menu
singleMenu
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"singleDiskWarehousing"
,
"单盘入库"
,
1
,
"singleDiskWarehousing"
,
"system/singleDiskWarehousing/index"
,
""
,
0
,
"headIcon"
);
Menu
sluggishMaterials
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"sluggishMaterials"
,
"呆滞物料"
,
1
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
""
,
0
,
"sMaterial"
);
Menu
safetyInventory
=
new
Menu
(
new
ArrayList
<
Menu
>(),
1
,
"safetyInventory"
,
"安全库存"
,
1
,
"safetyInventory"
,
"system/safetyInventory/index"
,
""
,
0
,
"safeInventory"
);
celueOut
.
setHidden
(
true
);
celueOut
.
setHidden
(
true
);
...
@@ -220,7 +222,7 @@ public class DataInitManager {
...
@@ -220,7 +222,7 @@ public class DataInitManager {
zhuanruMenu
.
setHidden
(
true
);
zhuanruMenu
.
setHidden
(
true
);
singleMenu
.
setHidden
(
true
);
singleMenu
.
setHidden
(
true
);
// orderSet.setHidden(true);
// orderSet.setHidden(true);
menus
.
addAll
(
createMenus
(
poutOut
,
menuOrder
,
out
,
posOut
,
groupOut
,
materialBox
,
outSet
,
inOrderMenu
,
putinMenu
,
zhuanruMenu
,
singleMenu
));
menus
.
addAll
(
createMenus
(
poutOut
,
menuOrder
,
out
,
posOut
,
groupOut
,
materialBox
,
outSet
,
inOrderMenu
,
putinMenu
,
zhuanruMenu
,
singleMenu
,
sluggishMaterials
,
safetyInventory
));
//MSD管理:MSD库存.MSD追溯性.MSD设置
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu
msd
=
Menu
.
CreatePMenu
(
"MSD管理"
,
20
,
"msd"
,
2
,
"MSD"
);
Menu
msd
=
Menu
.
CreatePMenu
(
"MSD管理"
,
20
,
"msd"
,
2
,
"MSD"
);
...
...
src/main/java/com/neotel/smfcore/core/barcode/rest/ComponentController.java
查看文件 @
b924137
...
@@ -87,6 +87,17 @@ public class ComponentController {
...
@@ -87,6 +87,17 @@ public class ComponentController {
if
(
component
.
getId
()
==
null
)
{
if
(
component
.
getId
()
==
null
)
{
throw
new
ValidateException
(
"smfcore.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"ID"
}
);
throw
new
ValidateException
(
"smfcore.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"ID"
}
);
}
}
//判断最大库存和最小库存
if
(
component
.
getMinStoreNum
()>
0
)
{
if
(
component
.
getMinStoreNum
()<=
component
.
getSafetyStoreNum
()&&
component
.
getSafetyStoreNum
()<=
component
.
getMaxStoreNum
()){
}
else
{
throw
new
ValidateException
(
"smfcore.component.storeError"
,
"请输入正确的库存,最小库存<=安全库存<=最大库存"
);
}
}
componentManager
.
saveComponent
(
component
);
componentManager
.
saveComponent
(
component
);
// //修改元器件时更新storagePos中的数据
// //修改元器件时更新storagePos中的数据
// if(!ObjectUtil.isEmpty(component.getPartNumber()))
// if(!ObjectUtil.isEmpty(component.getPartNumber()))
...
...
src/main/java/com/neotel/smfcore/core/barcode/rest/bean/dto/ComponentDto.java
查看文件 @
b924137
...
@@ -104,11 +104,11 @@ public class ComponentDto implements Serializable {
...
@@ -104,11 +104,11 @@ public class ComponentDto implements Serializable {
@ApiModelProperty
(
"高度"
)
@ApiModelProperty
(
"高度"
)
private
int
height
;
private
int
height
;
@ApiModelProperty
(
"单台料仓可存储此种物料的最大数量"
)
//
@ApiModelProperty("单台料仓可存储此种物料的最大数量")
private
int
maxStoreNum
=
999999999
;
//
private int maxStoreNum = 999999999;
//
@ApiModelProperty
(
"单台料仓存储此种物料的最小数量"
)
//
@ApiModelProperty("单台料仓存储此种物料的最小数量")
private
int
minStoreNum
=
0
;
//
private int minStoreNum = 0;
@ApiModelProperty
(
"出库时是否需要授权"
)
@ApiModelProperty
(
"出库时是否需要授权"
)
private
boolean
needAuth
=
false
;
private
boolean
needAuth
=
false
;
...
@@ -149,4 +149,16 @@ public class ComponentDto implements Serializable {
...
@@ -149,4 +149,16 @@ public class ComponentDto implements Serializable {
@ApiModelProperty
(
"尺寸是否已经确认"
)
@ApiModelProperty
(
"尺寸是否已经确认"
)
private
boolean
sizeConfirmed
=
false
;
private
boolean
sizeConfirmed
=
false
;
@ApiModelProperty
(
"最大库存"
)
private
int
maxStoreNum
=
999999999
;
@ApiModelProperty
(
"最小库存"
)
private
int
minStoreNum
=
0
;
@ApiModelProperty
(
"安全库存"
)
private
int
safetyStoreNum
=
0
;
@ApiModelProperty
(
"呆滞天数,默认0无需处理"
)
private
int
sluggishDay
=
0
;
}
}
src/main/java/com/neotel/smfcore/core/barcode/service/po/Barcode.java
查看文件 @
b924137
...
@@ -232,6 +232,10 @@ public class Barcode extends BasePo implements Serializable {
...
@@ -232,6 +232,10 @@ public class Barcode extends BasePo implements Serializable {
*/
*/
private
String
thickness
=
""
;
private
String
thickness
=
""
;
/**
/**
* 呆滞到期时间(入库时间+呆滞日期)
*/
private
Date
sluggishTime
;
/**
* 添加相关联条码
* 添加相关联条码
*
*
* @param relationCode
* @param relationCode
...
@@ -251,7 +255,7 @@ public class Barcode extends BasePo implements Serializable {
...
@@ -251,7 +255,7 @@ public class Barcode extends BasePo implements Serializable {
return
new
Date
(
putInTime
);
return
new
Date
(
putInTime
);
}
}
public
void
setPutInTime
(
long
putInTime
)
{
public
void
setPutInTime
(
long
putInTime
)
{
if
(
this
.
putInTime
==
-
1
)
{
if
(
this
.
putInTime
==
-
1
)
{
this
.
putInTime
=
putInTime
;
this
.
putInTime
=
putInTime
;
}
}
...
@@ -292,6 +296,15 @@ public class Barcode extends BasePo implements Serializable {
...
@@ -292,6 +296,15 @@ public class Barcode extends BasePo implements Serializable {
}
}
}
}
public
void
updateSluggishTime
(
int
sluggishDay
){
if
(
sluggishDay
>
0
){
long
maxTime
=
sluggishDay
*
60
*
60
*
1000
;
setSluggishTime
(
new
Date
(
putInTime
+
maxTime
));
}
else
{
setSluggishTime
(
null
);
}
}
/**
/**
* 到达回温的时间
* 到达回温的时间
*/
*/
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/po/Component.java
查看文件 @
b924137
...
@@ -125,13 +125,22 @@ public class Component extends BasePo implements Serializable {
...
@@ -125,13 +125,22 @@ public class Component extends BasePo implements Serializable {
private
boolean
sizeConfirmed
=
false
;
private
boolean
sizeConfirmed
=
false
;
/**
/**
*
单台料仓可存储此种物料的最大数量
*
最大库存
*/
*/
private
int
maxStoreNum
=
999999999
;
private
int
maxStoreNum
=
999999999
;
/**
/**
*
单台料仓存储此种物料的最小数量
*
最小库存
*/
*/
private
int
minStoreNum
=
0
;
private
int
minStoreNum
=
0
;
/**
*安全库存
*/
private
int
safetyStoreNum
=
0
;
/**
* 呆滞天数,默认0无需处理
*/
private
int
sluggishDay
=
0
;
/**
/**
* 出库时是否需要授权
* 出库时是否需要授权
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
b924137
...
@@ -615,6 +615,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
...
@@ -615,6 +615,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
if
(
barcode
!=
null
)
{
if
(
barcode
!=
null
)
{
barcode
.
setUsedCount
(
barcode
.
getUsedCount
()
+
1
);
barcode
.
setUsedCount
(
barcode
.
getUsedCount
()
+
1
);
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
updateSluggishTime
(
dataCache
.
getPNsluggishDay
(
barcode
.
getPartNumber
()));
barcode
.
setInOpor
(
task
.
getOperator
());
barcode
.
setInOpor
(
task
.
getOperator
());
barcode
.
setCheckOutDate
(
null
,
""
);
barcode
.
setCheckOutDate
(
null
,
""
);
barcode
.
setPosName
(
task
.
getPosName
());
barcode
.
setPosName
(
task
.
getPosName
());
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
查看文件 @
b924137
...
@@ -137,6 +137,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
...
@@ -137,6 +137,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
dataLog
.
setType
(
OP
.
PUT_IN
);
dataLog
.
setType
(
OP
.
PUT_IN
);
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
updateSluggishTime
(
dataCache
.
getPNsluggishDay
(
barcode
.
getPartNumber
()));
barcodeManager
.
saveBarcode
(
barcode
);
barcodeManager
.
saveBarcode
(
barcode
);
dataLog
.
setNum
(
barcode
.
getAmount
());
dataLog
.
setNum
(
barcode
.
getAmount
());
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
b924137
...
@@ -9,7 +9,9 @@ import com.neotel.smfcore.common.utils.Constants;
...
@@ -9,7 +9,9 @@ import com.neotel.smfcore.common.utils.Constants;
import
com.neotel.smfcore.common.utils.QueryHelp
;
import
com.neotel.smfcore.common.utils.QueryHelp
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.common.utils.YmlUpdateUtil
;
import
com.neotel.smfcore.common.utils.YmlUpdateUtil
;
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.Barcode
;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.inList.util.InListCache
;
import
com.neotel.smfcore.core.inList.util.InListCache
;
import
com.neotel.smfcore.core.language.service.bean.LanguageInfo
;
import
com.neotel.smfcore.core.language.service.bean.LanguageInfo
;
...
@@ -67,6 +69,9 @@ public class DataCache {
...
@@ -67,6 +69,9 @@ public class DataCache {
@Autowired
@Autowired
private
InListCache
inListCache
;
private
InListCache
inListCache
;
@Autowired
private
IComponentManager
componentManager
;
/**
/**
* 是否需要推送温湿度报警值
* 是否需要推送温湿度报警值
*/
*/
...
@@ -683,4 +688,11 @@ public class DataCache {
...
@@ -683,4 +688,11 @@ public class DataCache {
log
.
info
(
"AutoCreateStorage :自动创建料仓完成:cid["
+
storage
.
getCid
()+
"]name["
+
storage
.
getName
()+
"]type["
+
storage
.
getCompatibleType
().
name
()+
"]"
);
log
.
info
(
"AutoCreateStorage :自动创建料仓完成:cid["
+
storage
.
getCid
()+
"]name["
+
storage
.
getName
()+
"]type["
+
storage
.
getCompatibleType
().
name
()+
"]"
);
return
storage
;
return
storage
;
}
}
public
int
getPNsluggishDay
(
String
pn
){
Component
component
=
componentManager
.
findOneByPN
(
pn
);
if
(
component
!=
null
){
return
component
.
getSluggishDay
();
}
return
0
;
}
}
}
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialBoxController.java
查看文件 @
b924137
...
@@ -55,6 +55,9 @@ public class MaterialBoxController {
...
@@ -55,6 +55,9 @@ public class MaterialBoxController {
@Autowired
@Autowired
private
BarcodeMapper
barcodeMapper
;
private
BarcodeMapper
barcodeMapper
;
@Autowired
private
DataCache
dataCache
;
@ApiOperation
(
"查询料盒信息"
)
@ApiOperation
(
"查询料盒信息"
)
@PostMapping
@PostMapping
@PreAuthorize
(
"@el.check('materialBox')"
)
@PreAuthorize
(
"@el.check('materialBox')"
)
...
@@ -527,6 +530,7 @@ public class MaterialBoxController {
...
@@ -527,6 +530,7 @@ public class MaterialBoxController {
subBarcode
.
setAmount
(
opQty
);
subBarcode
.
setAmount
(
opQty
);
subBarcode
.
setUsedDate
(
new
Date
());
subBarcode
.
setUsedDate
(
new
Date
());
subBarcode
.
setPutInTime
(
System
.
currentTimeMillis
());
subBarcode
.
setPutInTime
(
System
.
currentTimeMillis
());
subBarcode
.
updateSluggishTime
(
dataCache
.
getPNsluggishDay
(
barcode
.
getPartNumber
()));
subBarcode
.
setCheckOutDate
(
null
,
""
);
subBarcode
.
setCheckOutDate
(
null
,
""
);
subBarcode
.
setHostBarcodeId
(
barcode
.
getId
());
subBarcode
.
setHostBarcodeId
(
barcode
.
getId
());
subBarcode
=
barcodeManager
.
save
(
subBarcode
);
subBarcode
=
barcodeManager
.
save
(
subBarcode
);
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialStockController.java
0 → 100644
查看文件 @
b924137
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.utils.FileUtil
;
import
com.neotel.smfcore.common.utils.QueryHelp
;
import
com.neotel.smfcore.core.barcode.service.manager.IComponentManager
;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.language.util.MessageUtils
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.rest.dto.SafetyInventoryDto
;
import
com.neotel.smfcore.core.storage.rest.dto.StoragePosDto
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper
;
import
com.neotel.smfcore.core.storage.rest.query.SafetyInventoryQueryCriteria
;
import
com.neotel.smfcore.core.storage.rest.query.StoragePosFindCriteria
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.*
;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api
(
tags
=
"物料管理:呆滞物料/安全库存"
)
@RequestMapping
(
"api/material"
)
public
class
MaterialStockController
{
@Autowired
private
final
IStoragePosManager
storagePosManager
;
@Autowired
private
final
StoragePosMapper
storagePosMapper
;
@Autowired
private
final
DataCache
dataCache
;
@Autowired
private
final
IComponentManager
componentManager
;
@Autowired
private
final
SafetyInventoryMapper
safetyInventoryMapper
;
// @ApiOperation("导出呆滞物料")
// @GetMapping(value = "/sluggishMaterials/download")
// @PreAuthorize("@el.check('sluggishMaterials')")
// public void sluggishMaterialsDownload(HttpServletResponse response, StoragePosFindCriteria criteria, Locale locale)throws IOException {
////
//// Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(criteria.getStorageIdList(),criteria.getBlurry());
//// List<InventoryItem> list = Lists.newArrayList(inventoryItemMap.values());
////
//// String partNumberStr= MessageUtils.getText("smfcore.inventory.partNumber",locale,"物料编号");
//// String countStr= MessageUtils.getText("smfcore.inventory.count",locale,"数量");
//// String lockReelStr= MessageUtils.getText("smfcore.inventory.lockReel",locale,"锁定");
//// String stockReelStr= MessageUtils.getText("smfcore.inventory.stockReel",locale,"库存");
//// String storageNameStr= MessageUtils.getText("smfcore.inventory.storageName",locale,"设备");
////
//// List<Map<String, Object>> maps = new ArrayList<>();
//// for (InventoryItem item : list) {
//// Map<String, Object> map = new LinkedHashMap<>();
//// map.put(partNumberStr, item.getPartNumber());
//// map.put(countStr, item.getStockCount());
//// map.put(lockReelStr, item.getLockReel());
//// map.put(stockReelStr, item.getStockReel());
//// map.put(storageNameStr, item.getStorageName());
//// maps.add(map);
//// }
//// FileUtil.downloadExcel(maps, response);
// }
@ApiOperation
(
"获取呆滞物料列表"
)
@GetMapping
(
value
=
"/sluggishMaterials"
)
@PreAuthorize
(
"@el.check('sluggishMaterials')"
)
public
PageData
<
StoragePosDto
>
sluggishMaterials
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
if
(
criteria
.
getStorageId
()
!=
null
&&
criteria
.
getStorageId
().
equals
(
"0"
))
{
criteria
.
setStorageId
(
null
);
}
Query
query
=
QueryHelp
.
getQuery
(
criteria
);
Criteria
baseCriteria
=
Criteria
.
where
(
"used"
).
is
(
true
);
//需要查询已经过呆滞日期的物料
baseCriteria
.
and
(
"barcode.sluggishTime"
).
exists
(
true
).
gte
(
new
Date
());
// baseCriteria.and("barcode.sluggishTime").gte(new Date());
query
.
addCriteria
(
baseCriteria
);
PageData
<
StoragePos
>
pages
=
storagePosManager
.
findByPage
(
query
,
pageable
);
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
}
@ApiOperation
(
"导出安全库存列表"
)
@GetMapping
(
value
=
"/safetyInventory/download"
)
@PreAuthorize
(
"@el.check('safetyInventory')"
)
public
void
safetyInventoryDownload
(
HttpServletResponse
response
,
SafetyInventoryQueryCriteria
criteria
,
Locale
locale
)
throws
IOException
{
List
<
SafetyInventoryDto
>
results
=
getSafetyInventoryList
(
criteria
);
String
partNumberStr
=
MessageUtils
.
getText
(
"smfcore.safetyInventory.partNumber"
,
locale
,
"物料编号"
);
String
countStr
=
MessageUtils
.
getText
(
"smfcore.safetyInventory.count"
,
locale
,
"库存数量"
);
String
stockReelStr
=
MessageUtils
.
getText
(
"smfcore.safetyInventory.stockReel"
,
locale
,
"库存盘数"
);
String
lockReelStr
=
MessageUtils
.
getText
(
"smfcore.safetyInventory.supplementReel"
,
locale
,
"补充盘数"
);
String
storageNameStr
=
MessageUtils
.
getText
(
"smfcore.safetyInventory.amount"
,
locale
,
"最小包装"
);
List
<
Map
<
String
,
Object
>>
maps
=
new
ArrayList
<>();
for
(
SafetyInventoryDto
item
:
results
)
{
Map
<
String
,
Object
>
map
=
new
LinkedHashMap
<>();
map
.
put
(
partNumberStr
,
item
.
getPartNumber
());
map
.
put
(
countStr
,
item
.
getStockCount
());
map
.
put
(
lockReelStr
,
item
.
getLockReel
());
map
.
put
(
stockReelStr
,
item
.
getSupplementReel
());
map
.
put
(
storageNameStr
,
item
.
getAmount
());
maps
.
add
(
map
);
}
FileUtil
.
downloadExcel
(
maps
,
response
);
}
@ApiOperation
(
"安全库存列表"
)
@GetMapping
(
value
=
"/safetyInventory"
)
@PreAuthorize
(
"@el.check('safetyInventory')"
)
public
ResponseEntity
<
List
<
SafetyInventoryDto
>>
safetyInventory
(
SafetyInventoryQueryCriteria
criteria
)
{
List
<
SafetyInventoryDto
>
results
=
getSafetyInventoryList
(
criteria
);
return
new
ResponseEntity
<>(
results
,
HttpStatus
.
OK
);
}
private
List
<
SafetyInventoryDto
>
getSafetyInventoryList
(
SafetyInventoryQueryCriteria
criteria
)
{
boolean
needSupplement
=
criteria
.
isNeedSupplement
();
Query
query
=
QueryHelp
.
getQuery
(
criteria
);
List
<
Component
>
componentList
=
componentManager
.
findByQuery
(
query
);
Map
<
String
,
InventoryItem
>
inventoryItemMap
=
dataCache
.
getAllInventory
(
criteria
.
getStorageIdList
(),
criteria
.
getBlurry
());
List
<
SafetyInventoryDto
>
results
=
new
ArrayList
<>();
//循环PN
for
(
Component
com
:
componentList
)
{
InventoryItem
item
=
inventoryItemMap
.
get
(
com
.
getPartNumber
());
SafetyInventoryDto
dto
=
new
SafetyInventoryDto
();
if
(
item
==
null
)
{
}
else
{
dto
=
safetyInventoryMapper
.
toDto
(
item
);
}
dto
.
setPartNumber
(
com
.
getPartNumber
());
dto
.
setAmount
(
com
.
getAmount
());
dto
.
setSupplementReel
(
0
);
//判断是否需要补充
if
(
dto
.
getStockCount
()
<
com
.
getMinStoreNum
())
{
if
(
dto
.
getStockReel
()
>
0
&&
dto
.
getStockCount
()
>
0
)
{
int
reelCount
=
dto
.
getStockCount
()
/
dto
.
getStockReel
();
//补充盘数
int
needReel
=
(
com
.
getMinStoreNum
()
-
dto
.
getStockCount
())
/
reelCount
;
dto
.
setSupplementReel
(
needReel
);
}
else
{
int
needReel
=
com
.
getMinStoreNum
()
/
dto
.
getAmount
();
dto
.
setSupplementReel
(
needReel
);
}
}
if
(
needSupplement
)
{
if
(
dto
.
getSupplementReel
()
>
0
){
results
.
add
(
dto
);
}
}
else
{
results
.
add
(
dto
);
}
}
return
results
;
}
}
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
查看文件 @
b924137
...
@@ -273,28 +273,17 @@ public class StoragePosController {
...
@@ -273,28 +273,17 @@ public class StoragePosController {
storagePosManager
.
deletePoss
(
ids
);
storagePosManager
.
deletePoss
(
ids
);
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
}
}
@ApiOperation
(
"导出查找出库列表"
)
@GetMapping
(
value
=
"/find/download"
)
private
Query
getPosFindCriteria
(
StoragePosFindCriteria
criteria
){
@PreAuthorize
(
"@el.check('checkOut')"
)
if
(
ObjectUtil
.
isNotEmpty
(
criteria
.
getStorageId
())
&&
criteria
.
getStorageId
().
equals
(
"0"
))
{
public
void
download
(
HttpServletResponse
response
,
StoragePosFindCriteria
criteria
,
HttpServletRequest
request
)
throws
IOException
{
if
(
criteria
.
getStorageId
()
!=
null
&&
criteria
.
getStorageId
().
equals
(
"0"
))
{
criteria
.
setStorageId
(
null
);
criteria
.
setStorageId
(
null
);
}
}
Query
query
=
QueryHelp
.
getQuery
(
criteria
);
Query
query
=
QueryHelp
.
getQuery
(
criteria
);
Criteria
baseCriteria
=
Criteria
.
where
(
"used"
).
is
(
true
);
Criteria
baseCriteria
=
Criteria
.
where
(
"used"
).
is
(
true
);
int
componentType
=
criteria
.
getType
();
int
componentType
=
criteria
.
getComponentType
();
String
name
=
""
;
if
(
componentType
!=
-
1
)
{
if
(
componentType
!=
-
1
)
{
int
type
=
componentType
;
baseCriteria
.
and
(
"barcode.type"
).
is
(
componentType
);
if
(
componentType
==
41
)
{
//锡膏夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
name
=
StorageConstants
.
PACKAGE_TYPE
.
SOLDER_FIXTURE
.
getCode
();
}
else
if
(
componentType
==
42
)
{
//PCB夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
name
=
StorageConstants
.
PACKAGE_TYPE
.
PCB_FIXTURE
.
getCode
();
}
baseCriteria
.
and
(
"barcode.type"
).
is
(
type
);
}
}
...
@@ -308,6 +297,15 @@ public class StoragePosController {
...
@@ -308,6 +297,15 @@ public class StoragePosController {
}
}
query
.
addCriteria
(
baseCriteria
);
query
.
addCriteria
(
baseCriteria
);
return
query
;
}
@ApiOperation
(
"导出查找出库列表"
)
@GetMapping
(
value
=
"/find/download"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
public
void
download
(
HttpServletResponse
response
,
StoragePosFindCriteria
criteria
,
HttpServletRequest
request
)
throws
IOException
{
Query
query
=
getPosFindCriteria
(
criteria
);
List
<
StoragePos
>
storagePos
=
storagePosManager
.
findByQuery
(
query
);
List
<
StoragePos
>
storagePos
=
storagePosManager
.
findByQuery
(
query
);
storagePosManager
.
download
(
storagePos
,
response
,
request
.
getLocale
());
storagePosManager
.
download
(
storagePos
,
response
,
request
.
getLocale
());
}
}
...
@@ -315,40 +313,8 @@ public class StoragePosController {
...
@@ -315,40 +313,8 @@ public class StoragePosController {
@GetMapping
(
"/find"
)
@GetMapping
(
"/find"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
public
PageData
<
StoragePosDto
>
storagePosFind
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
public
PageData
<
StoragePosDto
>
storagePosFind
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
if
(
criteria
.
getStorageId
()
!=
null
&&
criteria
.
getStorageId
().
equals
(
"0"
))
{
criteria
.
setStorageId
(
null
);
}
Query
query
=
QueryHelp
.
getQuery
(
criteria
);
Criteria
baseCriteria
=
Criteria
.
where
(
"used"
).
is
(
true
);
int
componentType
=
criteria
.
getType
();
Query
query
=
getPosFindCriteria
(
criteria
);
String
name
=
""
;
if
(
componentType
!=
-
1
)
{
int
type
=
componentType
;
request
.
setAttribute
(
"type"
,
componentType
);
if
(
componentType
==
41
)
{
//锡膏夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
name
=
StorageConstants
.
PACKAGE_TYPE
.
SOLDER_FIXTURE
.
getCode
();
}
else
if
(
componentType
==
42
)
{
//PCB夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
name
=
StorageConstants
.
PACKAGE_TYPE
.
PCB_FIXTURE
.
getCode
();
}
baseCriteria
.
and
(
"barcode.type"
).
is
(
type
);
}
String
expire
=
criteria
.
getExpire
();
if
(!
Strings
.
isNullOrEmpty
(
expire
))
{
if
(
"solder"
.
equalsIgnoreCase
(
expire
))
{
baseCriteria
.
and
(
"barcode.expTime"
).
lte
(
new
Date
());
}
else
if
(
"pcb"
.
equalsIgnoreCase
(
expire
))
{
baseCriteria
.
and
(
"barcode.expireDate"
).
lte
(
new
Date
());
}
request
.
setAttribute
(
"expire"
,
expire
);
}
query
.
addCriteria
(
baseCriteria
);
PageData
<
StoragePos
>
pages
=
storagePosManager
.
findByPage
(
query
,
pageable
);
PageData
<
StoragePos
>
pages
=
storagePosManager
.
findByPage
(
query
,
pageable
);
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/dto/SafetyInventoryDto.java
0 → 100644
查看文件 @
b924137
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* 安全库存详情(参照InventoryItemDto)
*/
@Data
public
class
SafetyInventoryDto
implements
Serializable
{
@ApiModelProperty
(
"物编"
)
private
String
partNumber
;
@ApiModelProperty
(
"库存数量"
)
private
int
stockCount
=
0
;
@ApiModelProperty
(
"锁定的数量"
)
private
int
lockCount
=
0
;
@ApiModelProperty
(
"库存盘数"
)
private
int
stockReel
=
0
;
@ApiModelProperty
(
"锁定的盘数"
)
private
int
lockReel
=
0
;
@ApiModelProperty
(
"过期的盘数"
)
private
int
expireReel
=
0
;
@ApiModelProperty
(
"即将过期的盘数(2个小时内)"
)
private
int
willExireReel
=
0
;
@ApiModelProperty
(
"设备ID"
)
private
String
storageId
;
@ApiModelProperty
(
"设备名称"
)
private
String
storageName
;
private
int
plateNumber
=
1
;
@ApiModelProperty
(
"最小包装数"
)
private
int
amount
;
@ApiModelProperty
(
"需要补充盘数"
)
private
int
supplementReel
=
0
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/dto/SluggishMaterialsDto.java
0 → 100644
查看文件 @
b924137
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
dto
;
import
com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* 呆滞物料信息(参照查找出库StoragePosDto)
*/
@Data
public
class
SluggishMaterialsDto
implements
Serializable
{
@ApiModelProperty
(
"库位ID"
)
private
String
id
;
@ApiModelProperty
(
"料仓ID"
)
private
String
storageId
;
@ApiModelProperty
(
"条码"
)
private
BarcodeDto
barcode
;
@ApiModelProperty
(
"库位号"
)
private
String
posName
;
@ApiModelProperty
(
"扩展库位的主库位"
)
private
String
hostPosId
;
@ApiModelProperty
(
"该仓位是否限制物编,虚拟仓使用"
)
private
List
<
String
>
limitPnList
;
@ApiModelProperty
(
"进料优先级,数字越大优先级越高,例:1-1的优先级为100 仓1-2的优先级200,那么入仓时就会优先进入1-2仓"
)
private
double
priority
=
0
f
;
@ApiModelProperty
(
"是否可用了"
)
private
boolean
enabled
=
true
;
@ApiModelProperty
(
"是否使用了"
)
private
boolean
used
=
false
;
@ApiModelProperty
(
"是否是回温库位,条码第一次入库是入库到冷藏库位,回温或二次入库时才入到回温库位"
)
private
boolean
warmPos
=
false
;
@ApiModelProperty
(
"高度"
)
private
int
h
;
@ApiModelProperty
(
"宽度"
)
private
int
w
;
@ApiModelProperty
(
"可出库时间,类型的锡膏时,可出库时间为最新放入的锡膏的可出库时间"
)
private
long
canCheckOutTime
=
0
;
@ApiModelProperty
(
"并联的其他库位,合并入主库位的库位"
)
private
List
<
String
>
mergePosList
;
@ApiModelProperty
(
"标签ID"
)
private
String
labelId
=
""
;
@ApiModelProperty
(
"标签名称"
)
private
String
labelName
;
@ApiModelProperty
(
"湿度"
)
private
String
humidity
=
""
;
@ApiModelProperty
(
"温度"
)
private
String
temperature
=
""
;
@ApiModelProperty
(
"设备名称"
)
private
String
storageName
;
@ApiModelProperty
(
"分组"
)
private
String
groupId
=
""
;
@ApiModelProperty
(
"组名称"
)
private
String
groupName
=
""
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/mapstruct/SafetyInventoryMapper.java
0 → 100644
查看文件 @
b924137
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
mapstruct
;
import
com.neotel.smfcore.common.base.BaseMapper
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.rest.dto.SafetyInventoryDto
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
@Mapper
(
componentModel
=
"spring"
,
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
SafetyInventoryMapper
extends
BaseMapper
<
SafetyInventoryDto
,
InventoryItem
>
{
}
src/main/java/com/neotel/smfcore/core/storage/rest/query/SafetyInventoryQueryCriteria.java
0 → 100644
查看文件 @
b924137
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
query
;
import
com.neotel.smfcore.common.annotation.QueryCondition
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
SafetyInventoryQueryCriteria
{
private
String
blurry
;
//
// @QueryCondition(isDBId =true)
// private String storageId;
//
@QueryCondition
(
type
=
QueryCondition
.
Type
.
IN
,
propName
=
"storageId"
)
private
List
<
String
>
storageIdList
;
/**
* 物料编号
*/
@QueryCondition
private
String
partNumber
;
/***
* 需要补充物料
*/
private
boolean
needSupplement
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
查看文件 @
b924137
...
@@ -2,6 +2,8 @@ package com.neotel.smfcore.core.storage.rest.query;
...
@@ -2,6 +2,8 @@ package com.neotel.smfcore.core.storage.rest.query;
import
com.neotel.smfcore.common.annotation.QueryCondition
;
import
com.neotel.smfcore.common.annotation.QueryCondition
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.Data
;
...
@@ -79,4 +81,18 @@ public class StoragePosFindCriteria {
...
@@ -79,4 +81,18 @@ public class StoragePosFindCriteria {
@QueryCondition
(
propName
=
"barcode.msl"
)
@QueryCondition
(
propName
=
"barcode.msl"
)
@ApiModelProperty
(
"等级"
)
@ApiModelProperty
(
"等级"
)
private
String
msl
;
private
String
msl
;
public
int
getComponentType
(){
int
componentType
=
getType
();
if
(
componentType
!=
-
1
)
{
int
type
=
componentType
;
if
(
componentType
==
41
)
{
//锡膏夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
}
else
if
(
componentType
==
42
)
{
//PCB夹具
type
=
COMPONENT_TYPE
.
FIXTURE
;
}
return
type
;
}
return
-
1
;
}
}
}
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
b924137
...
@@ -85,6 +85,7 @@ public class TaskService {
...
@@ -85,6 +85,7 @@ public class TaskService {
if
(
barcode
!=
null
){
if
(
barcode
!=
null
){
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
updateSluggishTime
(
dataCache
.
getPNsluggishDay
(
barcode
.
getPartNumber
()));
barcodeManager
.
saveBarcode
(
barcode
);
barcodeManager
.
saveBarcode
(
barcode
);
}
}
String
loginUser
=
SecurityUtils
.
getLoginUsername
();
String
loginUser
=
SecurityUtils
.
getLoginUsername
();
...
@@ -777,6 +778,7 @@ public class TaskService {
...
@@ -777,6 +778,7 @@ public class TaskService {
barcode
.
setUsedCount
(
barcode
.
getUsedCount
()
+
1
);
barcode
.
setUsedCount
(
barcode
.
getUsedCount
()
+
1
);
barcode
.
setUsedDate
(
new
Date
());
barcode
.
setUsedDate
(
new
Date
());
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
setPutInTime
(
System
.
currentTimeMillis
());
barcode
.
updateSluggishTime
(
dataCache
.
getPNsluggishDay
(
barcode
.
getPartNumber
()));
barcode
.
setInOpor
(
opUser
);
barcode
.
setInOpor
(
opUser
);
barcode
.
setCheckOutDate
(
null
,
""
);
barcode
.
setCheckOutDate
(
null
,
""
);
barcode
.
setPosName
(
task
.
getPosName
());
barcode
.
setPosName
(
task
.
getPosName
());
...
...
src/main/resources/messages.properties
查看文件 @
b924137
...
@@ -250,6 +250,7 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
...
@@ -250,6 +250,7 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
smfcore.safetyInventory.stockReel
=
\u
5E93
\u
5B58
\u
76D8
\u6570
smfcore.safetyInventory.stockReel
=
\u
5E93
\u
5B58
\u
76D8
\u6570
smfcore.safetyInventory.supplementReel
=
\u8865\u5145\u
76D8
\u6570
smfcore.safetyInventory.supplementReel
=
\u8865\u5145\u
76D8
\u6570
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88C5
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88C5
smfcore.component.storeError
=
\u
8BF7
\u
8F93
\u5165\u
6B63
\u
786E
\u7684\u
5E93
\u
5B58
\u
FF0C
\u6700\u
5C0F
\u
5E93
\u
5B58<=
\u
5B89
\u5168\u
5E93
\u
5B58<=
\u6700\u5927\u
5E93
\u
5B58
#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
查看文件 @
b924137
...
@@ -251,4 +251,5 @@ smfcore.safetyInventory.count=Stock Quantity
...
@@ -251,4 +251,5 @@ smfcore.safetyInventory.count=Stock Quantity
smfcore.safetyInventory.stockReel
=
Reel QTY
smfcore.safetyInventory.stockReel
=
Reel QTY
smfcore.safetyInventory.supplementReel
=
Number of additional plates
smfcore.safetyInventory.supplementReel
=
Number of additional plates
smfcore.safetyInventory.amount
=
Amount
smfcore.safetyInventory.amount
=
Amount
smfcore.component.storeError
=
Please enter the correct stock, minimum stock <= safety stock <= maximum stock
src/main/resources/messages_ja_JP.properties
查看文件 @
b924137
...
@@ -250,4 +250,5 @@ smfcore.safetyInventory.count=\u5728\u5EAB\u6570
...
@@ -250,4 +250,5 @@ smfcore.safetyInventory.count=\u5728\u5EAB\u6570
smfcore.safetyInventory.stockReel
=
\u
76E4
\u6578
smfcore.safetyInventory.stockReel
=
\u
76E4
\u6578
smfcore.safetyInventory.supplementReel
=
\u
8FFD
\u
52A0
\u
30D7
\u
30EC
\u
30FC
\u
30C8
\u
679A
\u6570
smfcore.safetyInventory.supplementReel
=
\u
8FFD
\u
52A0
\u
30D7
\u
30EC
\u
30FC
\u
30C8
\u
679A
\u6570
smfcore.safetyInventory.amount
=
\u6578\u
91CF
smfcore.safetyInventory.amount
=
\u6578\u
91CF
smfcore.component.storeError
=
\u
6B63
\u3057\u3044\u5728\u
5EAB
\u3092\u5165\u
529B
\u3057\u3066\u
304F
\u3060\u3055\u3044\u3001\u6700\u
5C0F
\u5728\u
5EAB
\u2266\u
5B89
\u5168\u5728\u
5EAB
\u2266\u6700\u5927\u5728\u
5EAB
src/main/resources/messages_zh_CN.properties
查看文件 @
b924137
...
@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
...
@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
smfcore.safetyInventory.stockReel
=
\u
5E93
\u
5B58
\u
76D8
\u6570
smfcore.safetyInventory.stockReel
=
\u
5E93
\u
5B58
\u
76D8
\u6570
smfcore.safetyInventory.supplementReel
=
\u8865\u5145\u
76D8
\u6570
smfcore.safetyInventory.supplementReel
=
\u8865\u5145\u
76D8
\u6570
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88C5
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88C5
smfcore.component.storeError
=
\u
8BF7
\u
8F93
\u5165\u
6B63
\u
786E
\u7684\u
5E93
\u
5B58
\u
FF0C
\u6700\u
5C0F
\u
5E93
\u
5B58<=
\u
5B89
\u5168\u
5E93
\u
5B58<=
\u6700\u5927\u
5E93
\u
5B58
src/main/resources/messages_zh_TW.properties
查看文件 @
b924137
...
@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5EAB\u5B58\u6578\u91CF
...
@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5EAB\u5B58\u6578\u91CF
smfcore.safetyInventory.stockReel
=
\u
5EAB
\u
5B58
\u
76E4
\u6578
smfcore.safetyInventory.stockReel
=
\u
5EAB
\u
5B58
\u
76E4
\u6578
smfcore.safetyInventory.supplementReel
=
\u
88DC
\u5145\u
76E4
\u6578
smfcore.safetyInventory.supplementReel
=
\u
88DC
\u5145\u
76E4
\u6578
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88DD
smfcore.safetyInventory.amount
=
\u6700\u
5C0F
\u5305\u
88DD
smfcore.component.storeError
=
\u
8ACB
\u
8F38
\u5165\u
6B63
\u
78BA
\u7684\u
5EAB
\u
5B58
\u
FF0C
\u6700\u
5C0F
\u
5EAB
\u
5B58<=
\u
5B89
\u5168\u
5EAB
\u
5B58<=
\u6700\u5927\u
5EAB
\u
5B58
修改记录.txt
查看文件 @
b924137
...
@@ -27,3 +27,6 @@
...
@@ -27,3 +27,6 @@
20220314:
20220314:
增加移动料架:NLM,入库时自动推荐库位,无合适库位时自动合并库位。
增加移动料架:NLM,入库时自动推荐库位,无合适库位时自动合并库位。
20220318:
安全库存和 呆滞物料功能
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论