Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 06ca2d2c
由
LN
编写于
2021-10-14 15:14:51 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
策略出库功能
1 个父辈
ccabc300
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
245 行增加
和
11 行删除
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/storage/bean/InventoryItem.java
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialController.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/InventoryItemDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/TacticsOutDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/mapstruct/InventoryItemMapper.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/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
06ca2d2
...
@@ -370,7 +370,7 @@ public class DataCache {
...
@@ -370,7 +370,7 @@ public class DataCache {
List
<
Storage
>
storages
=
Lists
.
newArrayList
();
List
<
Storage
>
storages
=
Lists
.
newArrayList
();
for
(
Storage
storage
:
for
(
Storage
storage
:
allStorages
.
values
())
{
allStorages
.
values
())
{
if
(
storageIds
.
contains
(
storage
.
getId
())){
if
(
storageIds
==
null
||
storageIds
.
contains
(
storage
.
getId
())){
storages
.
add
(
storage
);
storages
.
add
(
storage
);
}
}
}
}
...
@@ -391,8 +391,10 @@ public class DataCache {
...
@@ -391,8 +391,10 @@ public class DataCache {
if
(
pnInventoryItem
==
null
){
if
(
pnInventoryItem
==
null
){
pnInventoryItem
=
new
InventoryItem
();
pnInventoryItem
=
new
InventoryItem
();
pnInventoryItem
.
setStorageName
(
storageInventoryItem
.
getStorageName
());
pnInventoryItem
.
setStorageName
(
storageInventoryItem
.
getStorageName
());
pnInventoryItem
.
setStorageId
(
storage
.
getId
());
}
else
{
}
else
{
pnInventoryItem
.
setStorageName
(
""
);
pnInventoryItem
.
setStorageName
(
null
);
pnInventoryItem
.
setStorageId
(
null
);
}
}
pnInventoryItem
.
setPartNumber
(
partNumber
);
pnInventoryItem
.
setPartNumber
(
partNumber
);
pnInventoryItem
.
setStockCount
(
pnInventoryItem
.
getStockCount
()
+
storageInventoryItem
.
getStockCount
());
pnInventoryItem
.
setStockCount
(
pnInventoryItem
.
getStockCount
()
+
storageInventoryItem
.
getStockCount
());
...
...
src/main/java/com/neotel/smfcore/core/storage/bean/InventoryItem.java
查看文件 @
06ca2d2
...
@@ -47,10 +47,12 @@ public class InventoryItem {
...
@@ -47,10 +47,12 @@ public class InventoryItem {
* 即将过期的盘数(2个小时内)
* 即将过期的盘数(2个小时内)
*/
*/
private
int
willExireReel
=
0
;
private
int
willExireReel
=
0
;
private
String
storageId
;
/**
/**
* 设备名称
* 设备名称
*/
*/
private
String
StorageName
=
""
;
private
String
storageName
;
public
String
getPartNumber
()
{
public
String
getPartNumber
()
{
return
partNumber
;
return
partNumber
;
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialController.java
查看文件 @
06ca2d2
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
;
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
;
import
com.google.common.base.Strings
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.QueryHelp
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.rest.dto.InventoryItemDto
;
import
com.neotel.smfcore.core.storage.rest.dto.StorageDto
;
import
com.neotel.smfcore.core.storage.rest.dto.StorageDto
;
import
com.neotel.smfcore.core.storage.rest.dto.StoragePosDto
;
import
com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.InventoryItemMapper
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper
;
import
com.neotel.smfcore.core.storage.rest.query.InventoryQueryCriteria
;
import
com.neotel.smfcore.core.storage.rest.query.InventoryQueryCriteria
;
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.Label
;
import
com.neotel.smfcore.core.storage.service.po.Label
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
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.data.mongodb.core.query.Query
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.Set
;
@Slf4j
@Slf4j
@RestController
@RestController
...
@@ -30,14 +49,93 @@ import java.util.Map;
...
@@ -30,14 +49,93 @@ import java.util.Map;
public
class
MaterialController
{
public
class
MaterialController
{
@Autowired
@Autowired
private
DataCache
dataCache
;
private
DataCache
dataCache
;
@Autowired
private
InventoryItemMapper
inventoryItemMapper
;
@Autowired
private
TaskService
taskService
;
@ApiOperation
(
"策略出库获取库存"
)
@Autowired
private
final
StoragePosMapper
storagePosMapper
;
@Autowired
private
final
IStoragePosManager
storagePosManager
;
@ApiOperation
(
"策略出库获取库存列表"
)
@GetMapping
(
value
=
"/inventory"
)
@GetMapping
(
value
=
"/inventory"
)
@PreAuthorize
(
"el.check('tacticsOuput')"
)
@PreAuthorize
(
"
@
el.check('tacticsOuput')"
)
public
ResponseEntity
<
List
<
InventoryItem
>>
inventory
(
InventoryQueryCriteria
criteria
)
{
public
ResponseEntity
<
List
<
InventoryItem
Dto
>>
inventory
(
InventoryQueryCriteria
criteria
)
{
Map
<
String
,
InventoryItem
>
inventoryItemMap
=
dataCache
.
getAllInventory
(
criteria
.
getStorageIdList
());
Map
<
String
,
InventoryItem
>
inventoryItemMap
=
dataCache
.
getAllInventory
(
criteria
.
getStorageIdList
());
List
<
InventoryItem
>
list
=
Lists
.
newArrayList
(
inventoryItemMap
.
values
());
List
<
InventoryItem
>
list
=
Lists
.
newArrayList
(
inventoryItemMap
.
values
());
return
new
ResponseEntity
<>(
list
,
HttpStatus
.
OK
);
return
new
ResponseEntity
<>(
inventoryItemMapper
.
toDto
(
list
),
HttpStatus
.
OK
);
}
@ApiOperation
(
"策略出库"
)
@GetMapping
(
value
=
"/tacticsOuput"
)
@PreAuthorize
(
"@el.check('tacticsOuput')"
)
public
ResultBean
tacticsOuput
(
@RequestBody
Set
<
TacticsOutDto
>
outDtoSet
)
{
if
(
outDtoSet
==
null
){
throw
new
ValidateException
(
"smfcode.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"PN"
}
);
}
for
(
TacticsOutDto
dto
:
outDtoSet
)
{
if
(
dto
.
getPartNumber
()==
null
){
throw
new
ValidateException
(
"smfcode.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"PN"
}
);
}
else
if
(
dto
.
getPlateNumber
()==
null
){
throw
new
ValidateException
(
"smfcode.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"Num"
}
);
}
}
taskService
.
tacticsCheckOut
(
outDtoSet
);
return
ResultBean
.
newOkResult
(
"ok"
);
}
}
@ApiOperation
(
"物料分组界面"
)
@GetMapping
(
"/labelOuput"
)
@PreAuthorize
(
"@el.check('labelOuput')"
)
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
();
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
);
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
}
}
}
src/main/java/com/neotel/smfcore/core/storage/rest/dto/InventoryItemDto.java
0 → 100644
查看文件 @
06ca2d2
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
InventoryItemDto
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
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/dto/TacticsOutDto.java
0 → 100644
查看文件 @
06ca2d2
package
com
.
neotel
.
smfcore
.
core
.
storage
.
rest
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
TacticsOutDto
implements
Serializable
{
@ApiModelProperty
(
"物编"
)
private
String
partNumber
;
@ApiModelProperty
(
"出库盘数"
)
private
Integer
plateNumber
;
@ApiModelProperty
(
"料仓Id"
)
private
String
storageId
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/mapstruct/InventoryItemMapper.java
0 → 100644
查看文件 @
06ca2d2
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.InventoryItemDto
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
@Mapper
(
componentModel
=
"spring"
,
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
InventoryItemMapper
extends
BaseMapper
<
InventoryItemDto
,
InventoryItem
>
{
}
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
查看文件 @
06ca2d2
...
@@ -33,6 +33,9 @@ public class StoragePosFindCriteria {
...
@@ -33,6 +33,9 @@ public class StoragePosFindCriteria {
@ApiModelProperty
(
"库位号"
)
@ApiModelProperty
(
"库位号"
)
private
String
posName
;
private
String
posName
;
@QueryCondition
@ApiModelProperty
(
"标签ID"
)
private
String
labelId
;
@ApiModelProperty
(
"类型"
)
@ApiModelProperty
(
"类型"
)
private
int
type
=-
1
;
private
int
type
=-
1
;
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
06ca2d2
...
@@ -14,7 +14,13 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
...
@@ -14,7 +14,13 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.order.enums.LITEORDER_STATUS
;
import
com.neotel.smfcore.core.order.enums.ORDER_COLOR
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.order.service.po.LiteOrderItem
;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.enums.DeviceType
;
import
com.neotel.smfcore.core.storage.enums.DeviceType
;
import
com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto
;
import
com.neotel.smfcore.core.storage.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.storage.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.manager.impl.StorageManagerImpl
;
import
com.neotel.smfcore.core.storage.service.manager.impl.StorageManagerImpl
;
...
@@ -857,4 +863,55 @@ public class TaskService {
...
@@ -857,4 +863,55 @@ public class TaskService {
// QisdaApi.ClearStockBy(task.getPosName());
// QisdaApi.ClearStockBy(task.getPosName());
// }
// }
}
}
/**
* 策略出库
*/
public
synchronized
void
tacticsCheckOut
(
Set
<
TacticsOutDto
>
tacticsOutDtos
)
{
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
List
<
String
>
availableStorageIds
=
new
ArrayList
<>();
for
(
Storage
storage
:
dataCache
.
getAllStorage
().
values
())
{
//默认所有料仓可用
// StatusBean statusBean =dataCache. getStatus(storage.getCid());
// if (statusBean.isAvailable())
{
availableStorageIds
.
add
(
storage
.
getId
());
}
}
Collection
<
String
>
excludePosIds
=
excludePosIds
();
//其他出库模式一次性全部生成任务
for
(
TacticsOutDto
item
:
tacticsOutDtos
)
{
log
.
info
(
"开始执行策略出库["
+
item
.
getPartNumber
()
+
"] ["
+
item
.
getStorageId
()
+
"] 盘数="
+
item
.
getPlateNumber
());
String
partNumber
=
item
.
getPartNumber
();
for
(
int
i
=
1
;
i
<=
item
.
getPlateNumber
();
i
++)
{
StoragePos
pos
=
null
;
if
(
item
.
getStorageId
()
!=
null
)
{
String
[]
storageIds
=
new
String
[]{
item
.
getStorageId
()};
pos
=
storagePosManager
.
findPartNumberInStorages
(
Lists
.
newArrayList
(
storageIds
),
partNumber
,
excludePosIds
,
checkoutType
);
}
else
{
pos
=
storagePosManager
.
findPartNumberInStorages
(
availableStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
);
}
if
(
pos
==
null
)
{
log
.
error
(
"策略出库["
+
item
.
getPartNumber
()
+
"] 未找到可以出库的物料["
+
partNumber
+
"]"
);
break
;
}
else
{
log
.
info
(
"策略出库,PN["
+
item
.
getPartNumber
()
+
"]第["
+
i
+
"]盘, 出库位置仓位【"
+
pos
.
getPosName
()
+
"】RI=["
+
pos
.
getBarcode
().
getBarcode
()
+
"] PN=["
+
partNumber
+
"] num:"
+
pos
.
getBarcode
().
getAmount
());
DataLog
task
=
newTask
(
pos
);
task
.
setSourceId
(
null
);
task
.
setSourceName
(
"策略出库"
);
task
.
setType
(
OP
.
CHECKOUT
);
addTaskToExecute
(
task
);
}
}
}
}
}
}
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论