Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit e8bc9ea6
由
zshaohui
编写于
2023-11-30 13:47:14 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.虚拟仓
2.工单出库修改
1 个父辈
3be0048e
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
66 行增加
和
110 行删除
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/custom/lizhen/LizhenController.java
src/main/java/com/neotel/smfcore/custom/lizhen/innerBox/util/PreWarningItemCache.java
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
查看文件 @
e8bc9ea
...
...
@@ -312,7 +312,7 @@ public class DataInitManager {
addNewFunctionMenu
(
133
,
null
,
"outVir"
,
"虚拟仓出库"
,
"outVir"
,
"outers/outVir/index"
,
"index"
,
functionMenuMap
);
//内仓线外入库
addNewFunctionMenu
(
134
,
null
,
"
virWarehous"
,
"虚拟仓"
,
"v
irWarehous"
,
"virWarehous/virWarehous/index"
,
"feeding"
,
functionMenuMap
);
addNewFunctionMenu
(
134
,
null
,
"
bcVirWarehous"
,
"虚拟仓"
,
"bcV
irWarehous"
,
"virWarehous/virWarehous/index"
,
"feeding"
,
functionMenuMap
);
//内外仓电子看板
//addNewFunctionMenu(1,null,"elecKanban", "电子看板","elecKanban", "elecKanban/index","kanban",functionMenuMap);
...
...
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
e8bc9ea
...
...
@@ -414,57 +414,6 @@ public class LiteOrderCache {
* 锁定物料
*/
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
)
{
List
<
String
>
freeStorageIds
=
new
ArrayList
<>();
//判断是否有空闲料仓
List
<
String
>
storageIds
=
dataCache
.
getAvailableStorageIds
();
for
(
String
storageId
:
storageIds
)
{
boolean
hasOutTask
=
false
;
Storage
storage
=
dataCache
.
getStorageById
(
storageId
);
if
(!
storage
.
isType
(
new
DeviceType
[]{
DeviceType
.
SMD_XLR
}))
{
continue
;
}
//判断当前料仓,状态是否正常
StatusBean
statusBean
=
DevicesStatusUtil
.
getStatusBean
(
storage
.
getCid
());
if
(
statusBean
==
null
||
statusBean
.
getStatus
()
!=
BOX_STATUS
.
READY
)
{
continue
;
}
List
<
DataLog
>
allTasksByCid
=
taskService
.
getAllTasksByCid
(
storage
.
getCid
());
for
(
DataLog
task
:
allTasksByCid
)
{
if
(!
task
.
isFinished
()
&&
!
task
.
isCancel
()
&&
!
task
.
isToBox
()
&&
task
.
isCheckOutTask
()
&&
StringUtils
.
isNotBlank
(
task
.
getSourceId
())
)
if
(
task
.
isCheckOutTask
()
&&
StringUtils
.
isNotBlank
(
task
.
getSourceId
())
&&
(
task
.
isExecuting
()
||
task
.
isWait
())){
hasOutTask
=
true
;
break
;
}
}
if
(!
hasOutTask
)
{
//log.info("空闲料仓:" + storage.getName());
freeStorageIds
.
add
(
storageId
);
}
}
if
(
freeStorageIds
==
null
||
freeStorageIds
.
isEmpty
())
{
return
orderNo
+
"没有可用料仓"
;
}
//判断当前工单的任务数,是否大于2
/*int executingCount = 0;
if (liteOrderMap != null){
for (LiteOrder order : liteOrderMap.values()) {
if (order.isOutTails()){
executingCount ++;
}
}
}
if (executingCount >= 2){
return "正在执行的工单超过2个,跳过";
}*/
LiteOrder
cacheOrder
=
liteOrderMap
.
get
(
orderNo
);
if
(
cacheOrder
==
null
)
{
cacheOrder
=
liteOrderManager
.
findByOrderNo
(
orderNo
);
...
...
@@ -475,30 +424,18 @@ public class LiteOrderCache {
}
if
(!
cacheOrder
.
isTaskFinished
()
&&
!
cacheOrder
.
isNew
())
{
log
.
info
(
"工单["
+
orderNo
+
"]正在执行"
);
//
log.info("工单[" + orderNo + "]正在执行");
return
"smfcore.order.out.executing"
;
}
if
(
cacheOrder
.
isClosed
())
{
log
.
info
(
"工单["
+
orderNo
+
"]已关闭,无法出库"
);
//
log.info("工单[" + orderNo + "]已关闭,无法出库");
return
"smfcore.order.hasClose"
;
}
/*ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "smfcore.order.out.maxOrder";
}*/
//先查找是否已经锁定过库位,如果已经锁定过,出锁定的库位
List
<
StoragePos
>
lockPosList
=
storagePosManager
.
findLockPos
(
cacheOrder
.
getOrderNo
());
if
(
lockPosList
!=
null
&&
lockPosList
.
size
()
>
0
)
{
return
checkOutOrder
(
cacheOrder
).
getMsgKey
();
}
//获取是否有出料口
String
exportStr
=
StorageExportUtil
.
getExportByOrderNo
(
cacheOrder
.
getOrderNo
(),
true
,
cacheOrder
.
isMaiZheng
());
if
(
StringUtils
.
isBlank
(
exportStr
))
{
log
.
info
(
cacheOrder
.
getOrderNo
()
+
"没有空闲的出料口"
);
//
log.info(cacheOrder.getOrderNo() + "没有空闲的出料口");
return
"没有空闲的出料口"
;
}
...
...
@@ -514,10 +451,13 @@ public class LiteOrderCache {
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int
taskReelCount
=
0
;
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
List
<
String
>
availableStorageIds
=
new
ArrayList
<>();
for
(
Storage
storage
:
dataCache
.
getAllStorage
().
values
())
{
List
<
String
>
storageIdList
=
new
ArrayList
<>();
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
for
(
String
availableStorageId
:
availableStorageIds
)
{
Storage
storage
=
dataCache
.
getStorageById
(
availableStorageId
);
if
(!
storage
.
isVirtual
()){
availableStorageIds
.
add
(
storage
.
getId
()
);
storageIdList
.
add
(
availableStorageId
);
}
}
...
...
@@ -560,45 +500,16 @@ public class LiteOrderCache {
}
else
{
//PN
do
{
//首先按空闲料仓进行出库
List
<
StoragePos
>
storagePosList
=
storagePosManager
.
findPartNumberListInStorages
(
freeStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
,
orderItem
.
getBrand
());
//如果为空的话,则出全部的
if
(
storagePosList
==
null
||
storagePosList
.
isEmpty
())
{
storagePosList
=
storagePosManager
.
findPartNumberListInStorages
(
availableStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
,
orderItem
.
getBrand
());
}
//排序找到最早的
if
(
storagePosList
!=
null
&&
!
storagePosList
.
isEmpty
())
{
List
<
Barcode
>
barcodeList
=
new
ArrayList
<>();
for
(
StoragePos
storagePos
:
storagePosList
)
{
barcodeList
.
add
(
storagePos
.
getBarcode
());
}
if
(
barcodeList
!=
null
&&
!
barcodeList
.
isEmpty
())
{
barcodeList
=
barcodeList
.
stream
().
sorted
(
Comparator
.
comparing
(
Barcode:
:
getAmount
)
.
thenComparing
(
Barcode:
:
getExpireDate
,
Comparator
.
nullsFirst
(
Date:
:
compareTo
))
.
thenComparing
(
Barcode:
:
getCreateDate
)).
collect
(
Collectors
.
toList
());
Barcode
barcode
=
barcodeList
.
get
(
0
);
for
(
StoragePos
storagePos
:
storagePosList
)
{
if
(
storagePos
.
getBarcode
().
getBarcode
().
equals
(
barcode
.
getBarcode
()))
{
pos
=
storagePos
;
break
;
}
}
}
}
pos
=
storagePosManager
.
findPartNumberInStorages
(
storageIdList
,
partNumber
,
excludePosIds
,
checkoutType
,
orderItem
.
getBrand
());
if
(
pos
==
null
)
{
break
;
}
try
{
smfApi
.
canPutInAfterResolve
(
pos
.
getBarcode
());
}
catch
(
ValidateException
e
)
{
e
.
printStackTrace
();
log
.
error
(
"工单号:"
+
orderNo
+
"唯一码:"
+
pos
.
getBarcode
().
getBarcode
()
+
":"
+
e
.
getMessage
());
pos
=
null
;
break
;
excludePosIds
.
add
(
pos
.
getId
());
}
}
while
(
pos
==
null
);
}
...
...
src/main/java/com/neotel/smfcore/custom/lizhen/LizhenController.java
查看文件 @
e8bc9ea
package
com
.
neotel
.
smfcore
.
custom
.
lizhen
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.common.collect.Maps
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.exception.ApiException
;
import
com.neotel.smfcore.common.utils.Constants
;
...
...
@@ -35,6 +36,9 @@ import org.springframework.web.bind.annotation.RestController;
import
javax.annotation.PostConstruct
;
import
java.util.*
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.TimeUnit
;
@Slf4j
@RestController
...
...
@@ -186,6 +190,49 @@ public class LizhenController {
}
ScheduledExecutorService
scheduledThreadPool
=
Executors
.
newScheduledThreadPool
(
1
);
@PostConstruct
void
warningItem
()
{
scheduledThreadPool
.
scheduleAtFixedRate
(()
->
{
if
(!
isSend
)
{
try
{
isSend
=
true
;
sendWarningItem
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
isSend
=
false
;
}
}
},
10
,
10
,
TimeUnit
.
SECONDS
);
}
private
static
boolean
isSend
=
false
;
private
static
Map
<
String
,
Map
<
String
,
String
>>
warningItemMap
=
Maps
.
newConcurrentMap
();
public
void
sendWarningItem
()
{
if
(
warningItemMap
!=
null
&&
!
warningItemMap
.
isEmpty
())
{
Collection
<
Map
<
String
,
String
>>
values
=
warningItemMap
.
values
();
List
<
Map
<
String
,
String
>>
itemList
=
new
ArrayList
<>(
values
);
for
(
Map
<
String
,
String
>
param
:
itemList
)
{
try
{
String
id
=
param
.
get
(
"ID"
);
String
line
=
param
.
get
(
"LINE"
);
String
forwardUrl
=
getForwardUrl
(
line
);
log
.
info
(
"Mes缺料预警---"
+
JSONObject
.
toJSONString
(
param
)
+
",地址为:"
+
forwardUrl
);
String
result
=
HttpHelper
.
postJson
(
forwardUrl
,
param
);
log
.
info
(
id
+
"缺料预警转发结果为:"
+
result
);
warningItemMap
.
remove
(
id
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"缺料预警转发失败---"
+
e
.
getMessage
());
}
}
}
}
@ApiOperation
(
"内仓:机台叫料"
)
@PostMapping
(
"/mPickingList"
)
@AnonymousAccess
...
...
@@ -196,18 +243,16 @@ public class LizhenController {
for
(
Map
<
String
,
String
>
param
:
params
)
{
String
line
=
param
.
get
(
"LINE"
);
String
forwardUrl
=
getForwardUrl
(
line
);
log
.
info
(
"Mes缺料预警---"
+
JSONObject
.
toJSONString
(
param
)
+
",地址为:"
+
forwardUrl
);
if
(
StringUtils
.
isBlank
(
forwardUrl
)){
log
.
info
(
line
+
"没有对应的地址,跳过"
);
continue
;
}
String
id
=
param
.
get
(
"ID"
);
try
{
String
result
=
HttpHelper
.
postJson
(
forwardUrl
,
param
);
//log.info(id + "机台叫料结果为--" + result);
}
catch
(
ApiException
e
)
{
e
.
printStackTrace
();
log
.
info
(
id
+
"机台叫料转发失败---"
+
e
.
getMessage
());
if
(!
warningItemMap
.
containsKey
(
id
))
{
warningItemMap
.
put
(
id
,
param
);
}
}
return
ResultBean
.
newOkResult
(
""
);
...
...
@@ -220,7 +265,7 @@ public class LizhenController {
public
ResultBean
machineCallMaterial
(
@RequestBody
Map
<
String
,
String
>
data
)
{
boolean
startJob
=
dataCache
.
getCache
(
Constants
.
CACHE_StartJob
);
if
(!
startJob
)
{
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"定时任务未开启"
);
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"定时任务未开启"
,
new
String
[]{},
false
);
}
//log.info("Mes缺料预警---" + JSONObject.toJSONString(data));
PreWarningItem
item
=
new
PreWarningItem
();
...
...
src/main/java/com/neotel/smfcore/custom/lizhen/innerBox/util/PreWarningItemCache.java
查看文件 @
e8bc9ea
...
...
@@ -212,7 +212,7 @@ public class PreWarningItemCache {
liteOrder
.
setTaskReelCount
(
orderItems
.
size
());
liteOrder
.
setMaiZheng
(
maiZheng
);
liteOrder
=
liteOrderManager
.
createWithItems
(
liteOrder
);
log
.
info
(
"生成工单信息为:"
+
liteOrder
.
getOrderNo
());
log
.
info
(
"生成工单信息为:"
+
liteOrder
.
getOrderNo
()
+
"数量为:"
+
orderItems
.
size
()+
"线体名称为:"
+
liteOrder
.
getLine
()
);
liteOrderCache
.
addOrderToMap
(
liteOrder
);
}
//工单生成后,从缓存中清除
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论