Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
HYH.APSJ
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
佟礼
HYH.APSJ
Commits
9a024f03
Commit
9a024f03
authored
Mar 20, 2026
by
DESKTOP-VKRD9QF\Administration
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
滚动修改
parent
2efd4663
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
174 additions
and
83 deletions
+174
-83
LockedOrderProcessorService.java
...ava/com/aps/service/plan/LockedOrderProcessorService.java
+173
-82
PlanResultService.java
src/main/java/com/aps/service/plan/PlanResultService.java
+1
-1
No files found.
src/main/java/com/aps/service/plan/LockedOrderProcessorService.java
View file @
9a024f03
...
@@ -71,7 +71,7 @@ public class LockedOrderProcessorService {
...
@@ -71,7 +71,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"锁定期范围: {} 到 {} (冻结期: {}秒)"
,
config
.
lockStartTime
,
config
.
lockEndTime
,
config
.
freezeSeconds
);
log
.
debug
(
"锁定期范围: {} 到 {} (冻结期: {}秒)"
,
config
.
lockStartTime
,
config
.
lockEndTime
,
config
.
freezeSeconds
);
// 2. 从已下发场景获取锁定期工单
// 2. 从已下发场景获取锁定期工单
LockedOrdersData
lockedData
=
loadLockedOrdersFromScenes
(
config
,
chromosome
.
getBaseTime
(),
chromosome
.
getScenarioID
());
LockedOrdersData
lockedData
=
loadLockedOrdersFromScenes
(
config
,
chromosome
.
getBaseTime
(),
chromosome
.
getScenarioID
());
...
@@ -103,7 +103,7 @@ public class LockedOrderProcessorService {
...
@@ -103,7 +103,7 @@ public class LockedOrderProcessorService {
long
freezeSeconds
=
timeConfig
.
getFreezeDate
()
!=
null
?
timeConfig
.
getFreezeDate
().
longValue
()
:
0
;
long
freezeSeconds
=
timeConfig
.
getFreezeDate
()
!=
null
?
timeConfig
.
getFreezeDate
().
longValue
()
:
0
;
if
(
freezeSeconds
<=
0
)
{
if
(
freezeSeconds
<=
0
)
{
log
.
info
(
"冻结期秒数为{},跳过添加锁定期工单"
,
freezeSeconds
);
log
.
debug
(
"冻结期秒数为{},跳过添加锁定期工单"
,
freezeSeconds
);
return
null
;
return
null
;
}
}
...
@@ -125,11 +125,11 @@ public class LockedOrderProcessorService {
...
@@ -125,11 +125,11 @@ public class LockedOrderProcessorService {
// 查询锁定期内的Dispatch记录
// 查询锁定期内的Dispatch记录
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
if
(
frozenDispatches
.
isEmpty
())
{
if
(
frozenDispatches
.
isEmpty
())
{
log
.
info
(
"冻结期内没有工单需要添加"
);
log
.
debug
(
"冻结期内没有工单需要添加"
);
return
data
;
return
data
;
}
}
log
.
info
(
"查询到冻结期内的工序数: {}"
,
frozenDispatches
.
size
());
log
.
debug
(
"查询到冻结期内的工序数: {}"
,
frozenDispatches
.
size
());
// 获取所有不同的sceneId
// 获取所有不同的sceneId
Set
<
String
>
dispatchSceneIds
=
frozenDispatches
.
stream
()
Set
<
String
>
dispatchSceneIds
=
frozenDispatches
.
stream
()
...
@@ -142,14 +142,14 @@ public class LockedOrderProcessorService {
...
@@ -142,14 +142,14 @@ public class LockedOrderProcessorService {
return
data
;
return
data
;
}
}
log
.
info
(
"锁定期工单来自 {} 个已下发场景: {}"
,
dispatchSceneIds
.
size
(),
dispatchSceneIds
);
log
.
debug
(
"锁定期工单来自 {} 个已下发场景: {}"
,
dispatchSceneIds
.
size
(),
dispatchSceneIds
);
// 遍历每个场景,加载锁定期工单
// 遍历每个场景,加载锁定期工单
for
(
String
sceneId
:
dispatchSceneIds
)
{
for
(
String
sceneId
:
dispatchSceneIds
)
{
processSceneForLockedOrders
(
sceneId
,
frozenDispatches
,
config
,
newBaseTime
,
data
,
newSceneId
);
processSceneForLockedOrders
(
sceneId
,
frozenDispatches
,
config
,
newBaseTime
,
data
,
newSceneId
);
}
}
log
.
info
(
"从 {} 个已下发场景排产结果中获取到 {} 个锁定期工单"
,
dispatchSceneIds
.
size
(),
data
.
results
.
size
());
log
.
debug
(
"从 {} 个已下发场景排产结果中获取到 {} 个锁定期工单"
,
dispatchSceneIds
.
size
(),
data
.
results
.
size
());
}
catch
(
Exception
ex
)
{
}
catch
(
Exception
ex
)
{
log
.
error
(
"从已下发场景排产结果获取锁定期工单失败: {}"
,
ex
.
getMessage
(),
ex
);
log
.
error
(
"从已下发场景排产结果获取锁定期工单失败: {}"
,
ex
.
getMessage
(),
ex
);
...
@@ -165,7 +165,7 @@ public class LockedOrderProcessorService {
...
@@ -165,7 +165,7 @@ public class LockedOrderProcessorService {
LockPeriodConfig
config
,
LocalDateTime
newBaseTime
,
LockPeriodConfig
config
,
LocalDateTime
newBaseTime
,
LockedOrdersData
data
,
String
newSceneId
)
{
LockedOrdersData
data
,
String
newSceneId
)
{
try
{
try
{
log
.
info
(
"处理场景: {}"
,
sceneId
);
log
.
debug
(
"处理场景: {}"
,
sceneId
);
// 加载场景的排产结果
// 加载场景的排产结果
Chromosome
dispatchChromosome
=
loadSceneChromosome
(
sceneId
);
Chromosome
dispatchChromosome
=
loadSceneChromosome
(
sceneId
);
...
@@ -179,7 +179,7 @@ public class LockedOrderProcessorService {
...
@@ -179,7 +179,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"场景 {} - 已下发场景baseTime: {}, 新场景baseTime: {}"
,
sceneId
,
dispatchBaseTime
,
newBaseTime
);
log
.
debug
(
"场景 {} - 已下发场景baseTime: {}, 新场景baseTime: {}"
,
sceneId
,
dispatchBaseTime
,
newBaseTime
);
// 筛选属于当前场景的Dispatch记录
// 筛选属于当前场景的Dispatch记录
List
<
Dispatch
>
currentSceneDispatches
=
allDispatches
.
stream
()
List
<
Dispatch
>
currentSceneDispatches
=
allDispatches
.
stream
()
...
@@ -190,7 +190,7 @@ public class LockedOrderProcessorService {
...
@@ -190,7 +190,7 @@ public class LockedOrderProcessorService {
Set
<
String
>
lockedOrderIds
=
findLockedOrderIds
(
dispatchChromosome
,
currentSceneDispatches
,
Set
<
String
>
lockedOrderIds
=
findLockedOrderIds
(
dispatchChromosome
,
currentSceneDispatches
,
config
,
dispatchBaseTime
,
sceneId
);
config
,
dispatchBaseTime
,
sceneId
);
log
.
info
(
"场景 {} 中发现 {} 个订单在锁定期内有工序: {}"
,
sceneId
,
lockedOrderIds
.
size
(),
lockedOrderIds
);
log
.
debug
(
"场景 {} 中发现 {} 个订单在锁定期内有工序: {}"
,
sceneId
,
lockedOrderIds
.
size
(),
lockedOrderIds
);
// 复制锁定期订单的所有工序
// 复制锁定期订单的所有工序
copyLockedOrders
(
dispatchChromosome
,
currentSceneDispatches
,
lockedOrderIds
,
copyLockedOrders
(
dispatchChromosome
,
currentSceneDispatches
,
lockedOrderIds
,
...
@@ -212,7 +212,7 @@ public class LockedOrderProcessorService {
...
@@ -212,7 +212,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息"
,
log
.
debug
(
"场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息"
,
oldSceneId
,
dispatchChromosome
.
getAllOperations
().
size
());
oldSceneId
,
dispatchChromosome
.
getAllOperations
().
size
());
for
(
GAScheduleResult
result
:
data
.
results
)
{
for
(
GAScheduleResult
result
:
data
.
results
)
{
...
@@ -226,14 +226,14 @@ public class LockedOrderProcessorService {
...
@@ -226,14 +226,14 @@ public class LockedOrderProcessorService {
if
(
entry
!=
null
)
{
if
(
entry
!=
null
)
{
// 检查原始Entry的machineOptions
// 检查原始Entry的machineOptions
log
.
info
(
"原始Entry {} 的machineOptions数量: {}"
,
log
.
debug
(
"原始Entry {} 的machineOptions数量: {}"
,
entry
.
getExecId
(),
entry
.
getExecId
(),
entry
.
getMachineOptions
()
!=
null
?
entry
.
getMachineOptions
().
size
()
:
"null"
);
entry
.
getMachineOptions
()
!=
null
?
entry
.
getMachineOptions
().
size
()
:
"null"
);
if
(
entry
.
getMachineOptions
()
!=
null
&&
!
entry
.
getMachineOptions
().
isEmpty
())
{
if
(
entry
.
getMachineOptions
()
!=
null
&&
!
entry
.
getMachineOptions
().
isEmpty
())
{
for
(
int
i
=
0
;
i
<
entry
.
getMachineOptions
().
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
entry
.
getMachineOptions
().
size
();
i
++)
{
MachineOption
option
=
entry
.
getMachineOptions
().
get
(
i
);
MachineOption
option
=
entry
.
getMachineOptions
().
get
(
i
);
log
.
info
(
" machineOption[{}]: machineId={}, equipCode={}, equipName={}"
,
log
.
debug
(
" machineOption[{}]: machineId={}, equipCode={}, equipName={}"
,
i
,
option
.
getMachineId
(),
option
.
getEquipCode
(),
option
.
getEquipName
());
i
,
option
.
getMachineId
(),
option
.
getEquipCode
(),
option
.
getEquipName
());
}
}
}
}
...
@@ -242,7 +242,7 @@ public class LockedOrderProcessorService {
...
@@ -242,7 +242,7 @@ public class LockedOrderProcessorService {
Entry
lockedEntry
;
Entry
lockedEntry
;
try
{
try
{
lockedEntry
=
ProductionDeepCopyUtil
.
deepCopy
(
entry
);
lockedEntry
=
ProductionDeepCopyUtil
.
deepCopy
(
entry
);
log
.
info
(
"深拷贝后Entry {} 的machineOptions数量: {}, equipCode={}, equipName={}"
,
log
.
debug
(
"深拷贝后Entry {} 的machineOptions数量: {}, equipCode={}, equipName={}"
,
lockedEntry
.
getExecId
(),
lockedEntry
.
getExecId
(),
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
,
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
,
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
());
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
());
...
@@ -258,7 +258,7 @@ public class LockedOrderProcessorService {
...
@@ -258,7 +258,7 @@ public class LockedOrderProcessorService {
// 原因:过滤machineOptions会导致在修改订单数量时,重新解码时无法正确处理
// 原因:过滤machineOptions会导致在修改订单数量时,重新解码时无法正确处理
// 解码器会根据所有可用的machineOptions进行调度,而不是被限制在单一设备
// 解码器会根据所有可用的machineOptions进行调度,而不是被限制在单一设备
// 这样可以避免因数量改变导致的时间冲突问题
// 这样可以避免因数量改变导致的时间冲突问题
log
.
info
(
"锁定期Entry {} 保留所有machineOptions: 数量={}, equipCode={}, equipName={}"
,
log
.
debug
(
"锁定期Entry {} 保留所有machineOptions: 数量={}, equipCode={}, equipName={}"
,
lockedEntry
.
getExecId
(),
lockedEntry
.
getExecId
(),
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
,
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
,
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
());
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
());
...
@@ -267,11 +267,11 @@ public class LockedOrderProcessorService {
...
@@ -267,11 +267,11 @@ public class LockedOrderProcessorService {
if
(
newSceneId
!=
null
)
{
if
(
newSceneId
!=
null
)
{
String
originalSceneId
=
lockedEntry
.
getSceneId
();
String
originalSceneId
=
lockedEntry
.
getSceneId
();
lockedEntry
.
setSceneId
(
newSceneId
);
lockedEntry
.
setSceneId
(
newSceneId
);
log
.
info
(
"更新锁定期Entry的sceneId: {} -> {}"
,
originalSceneId
,
newSceneId
);
log
.
debug
(
"更新锁定期Entry的sceneId: {} -> {}"
,
originalSceneId
,
newSceneId
);
}
}
data
.
entries
.
put
(
result
.
getExecId
(),
lockedEntry
);
data
.
entries
.
put
(
result
.
getExecId
(),
lockedEntry
);
log
.
info
(
"从场景 {} 匹配到锁定期Entry: ExecId={}, 设备ID={}, equipCode={}, equipName={}, machineOptions数量={}"
,
log
.
debug
(
"从场景 {} 匹配到锁定期Entry: ExecId={}, 设备ID={}, equipCode={}, equipName={}, machineOptions数量={}"
,
oldSceneId
,
result
.
getExecId
(),
result
.
getMachineId
(),
oldSceneId
,
result
.
getExecId
(),
result
.
getMachineId
(),
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
(),
lockedEntry
.
getEquipCode
(),
lockedEntry
.
getEquipName
(),
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
);
lockedEntry
.
getMachineOptions
()
!=
null
?
lockedEntry
.
getMachineOptions
().
size
()
:
"null"
);
...
@@ -280,7 +280,7 @@ public class LockedOrderProcessorService {
...
@@ -280,7 +280,7 @@ public class LockedOrderProcessorService {
}
}
}
}
log
.
info
(
"场景 {} 成功匹配 {} 个Entry信息"
,
oldSceneId
,
data
.
entries
.
size
());
log
.
debug
(
"场景 {} 成功匹配 {} 个Entry信息"
,
oldSceneId
,
data
.
entries
.
size
());
}
}
/**
/**
...
@@ -290,7 +290,7 @@ public class LockedOrderProcessorService {
...
@@ -290,7 +290,7 @@ public class LockedOrderProcessorService {
LockPeriodConfig
config
,
LocalDateTime
baseTime
,
String
sceneId
)
{
LockPeriodConfig
config
,
LocalDateTime
baseTime
,
String
sceneId
)
{
Set
<
String
>
lockedOrderIds
=
new
HashSet
<>();
Set
<
String
>
lockedOrderIds
=
new
HashSet
<>();
log
.
info
(
"场景 {} 开始分析工序时间,锁定期范围: {} 到 {}"
,
sceneId
,
config
.
lockStartTime
,
config
.
lockEndTime
);
log
.
debug
(
"场景 {} 开始分析工序时间,锁定期范围: {} 到 {}"
,
sceneId
,
config
.
lockStartTime
,
config
.
lockEndTime
);
for
(
GAScheduleResult
result
:
chromosome
.
getResult
())
{
for
(
GAScheduleResult
result
:
chromosome
.
getResult
())
{
LocalDateTime
startTime
=
baseTime
.
plusSeconds
(
result
.
getStartTime
());
LocalDateTime
startTime
=
baseTime
.
plusSeconds
(
result
.
getStartTime
());
...
@@ -300,7 +300,7 @@ public class LockedOrderProcessorService {
...
@@ -300,7 +300,7 @@ public class LockedOrderProcessorService {
// 检查工序是否在锁定期内
// 检查工序是否在锁定期内
if
(!
startTime
.
isBefore
(
config
.
lockStartTime
)
&&
!
startTime
.
isAfter
(
config
.
lockEndTime
))
{
if
(!
startTime
.
isBefore
(
config
.
lockStartTime
)
&&
!
startTime
.
isAfter
(
config
.
lockEndTime
))
{
log
.
info
(
"工序在锁定期内: ExecId={}, OrderId={}, 开始时间={}"
,
log
.
debug
(
"工序在锁定期内: ExecId={}, OrderId={}, 开始时间={}"
,
result
.
getExecId
(),
result
.
getOrderId
(),
startTime
);
result
.
getExecId
(),
result
.
getOrderId
(),
startTime
);
// 通过订单号匹配Dispatch记录
// 通过订单号匹配Dispatch记录
...
@@ -313,7 +313,7 @@ public class LockedOrderProcessorService {
...
@@ -313,7 +313,7 @@ public class LockedOrderProcessorService {
if
(
hasValidDispatch
&&
result
.
getOrderId
()
!=
null
)
{
if
(
hasValidDispatch
&&
result
.
getOrderId
()
!=
null
)
{
lockedOrderIds
.
add
(
result
.
getOrderId
());
lockedOrderIds
.
add
(
result
.
getOrderId
());
log
.
info
(
"订单 {} 被标记为锁定期订单(通过订单号匹配)"
,
result
.
getOrderId
());
log
.
debug
(
"订单 {} 被标记为锁定期订单(通过订单号匹配)"
,
result
.
getOrderId
());
}
else
{
}
else
{
log
.
warn
(
"工序 {} 在锁定期内但没有有效的Dispatch记录(订单号: {})"
,
log
.
warn
(
"工序 {} 在锁定期内但没有有效的Dispatch记录(订单号: {})"
,
result
.
getExecId
(),
result
.
getOrderId
());
result
.
getExecId
(),
result
.
getOrderId
());
...
@@ -362,7 +362,7 @@ public class LockedOrderProcessorService {
...
@@ -362,7 +362,7 @@ public class LockedOrderProcessorService {
boolean
isInLockPeriod
=
!
prevStartTime
.
isBefore
(
config
.
lockStartTime
)
&&
boolean
isInLockPeriod
=
!
prevStartTime
.
isBefore
(
config
.
lockStartTime
)
&&
!
prevStartTime
.
isAfter
(
config
.
lockEndTime
);
!
prevStartTime
.
isAfter
(
config
.
lockEndTime
);
log
.
info
(
"从场景 {} 获取订单 {} 的工序: ExecId={}, OrderCode={}, MachineId={}, 原始时间=[{} 到 {}], 新相对时间=[{} 到 {}]秒, 是否在锁定期内={}"
,
log
.
debug
(
"从场景 {} 获取订单 {} 的工序: ExecId={}, OrderCode={}, MachineId={}, 原始时间=[{} 到 {}], 新相对时间=[{} 到 {}]秒, 是否在锁定期内={}"
,
sceneId
,
result
.
getOrderId
(),
lockedResult
.
getExecId
(),
lockedResult
.
getOrderCode
(),
sceneId
,
result
.
getOrderId
(),
lockedResult
.
getExecId
(),
lockedResult
.
getOrderCode
(),
lockedResult
.
getMachineId
(),
prevStartTime
,
prevEndTime
,
newStartTime
,
newEndTime
,
isInLockPeriod
);
lockedResult
.
getMachineId
(),
prevStartTime
,
prevEndTime
,
newStartTime
,
newEndTime
,
isInLockPeriod
);
}
}
...
@@ -375,7 +375,7 @@ public class LockedOrderProcessorService {
...
@@ -375,7 +375,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息"
,
log
.
debug
(
"场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息"
,
sceneId
,
chromosome
.
getAllOperations
().
size
());
sceneId
,
chromosome
.
getAllOperations
().
size
());
for
(
GAScheduleResult
result
:
data
.
results
)
{
for
(
GAScheduleResult
result
:
data
.
results
)
{
...
@@ -398,7 +398,7 @@ public class LockedOrderProcessorService {
...
@@ -398,7 +398,7 @@ public class LockedOrderProcessorService {
if
(
entry
!=
null
)
{
if
(
entry
!=
null
)
{
result
.
setOperationId
(
entry
.
getId
());
result
.
setOperationId
(
entry
.
getId
());
log
.
info
(
"通过ExecId匹配到Entry并修正OperationId: ExecId={}, EntryId={}"
,
log
.
debug
(
"通过ExecId匹配到Entry并修正OperationId: ExecId={}, EntryId={}"
,
result
.
getExecId
(),
entry
.
getId
());
result
.
getExecId
(),
entry
.
getId
());
}
}
}
}
...
@@ -410,7 +410,7 @@ public class LockedOrderProcessorService {
...
@@ -410,7 +410,7 @@ public class LockedOrderProcessorService {
}
}
}
}
log
.
info
(
"场景 {} 成功匹配 {} 个Entry信息"
,
sceneId
,
data
.
entries
.
size
());
log
.
debug
(
"场景 {} 成功匹配 {} 个Entry信息"
,
sceneId
,
data
.
entries
.
size
());
}
}
/**
/**
...
@@ -419,15 +419,15 @@ public class LockedOrderProcessorService {
...
@@ -419,15 +419,15 @@ public class LockedOrderProcessorService {
private
LockedOrdersData
createLockedOrdersFromDispatch
(
LockPeriodConfig
config
,
LocalDateTime
baseTime
)
{
private
LockedOrdersData
createLockedOrdersFromDispatch
(
LockPeriodConfig
config
,
LocalDateTime
baseTime
)
{
LockedOrdersData
data
=
new
LockedOrdersData
();
LockedOrdersData
data
=
new
LockedOrdersData
();
log
.
info
(
"从Dispatch表查询锁定期工单"
);
log
.
debug
(
"从Dispatch表查询锁定期工单"
);
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
if
(
frozenDispatches
.
isEmpty
())
{
if
(
frozenDispatches
.
isEmpty
())
{
log
.
info
(
"冻结期内没有工单需要添加"
);
log
.
debug
(
"冻结期内没有工单需要添加"
);
return
data
;
return
data
;
}
}
log
.
info
(
"查询到冻结期内的工序数: {}"
,
frozenDispatches
.
size
());
log
.
debug
(
"查询到冻结期内的工序数: {}"
,
frozenDispatches
.
size
());
for
(
Dispatch
dispatch
:
frozenDispatches
)
{
for
(
Dispatch
dispatch
:
frozenDispatches
)
{
GAScheduleResult
result
=
createResultFromDispatch
(
dispatch
,
baseTime
);
GAScheduleResult
result
=
createResultFromDispatch
(
dispatch
,
baseTime
);
...
@@ -443,7 +443,7 @@ public class LockedOrderProcessorService {
...
@@ -443,7 +443,7 @@ public class LockedOrderProcessorService {
private
GAScheduleResult
createResultFromDispatch
(
Dispatch
dispatch
,
LocalDateTime
baseTime
)
{
private
GAScheduleResult
createResultFromDispatch
(
Dispatch
dispatch
,
LocalDateTime
baseTime
)
{
GAScheduleResult
result
=
new
GAScheduleResult
();
GAScheduleResult
result
=
new
GAScheduleResult
();
log
.
info
(
"处理Dispatch记录: id={}, executeId={}, mesCode={}, equipId={}, beginTime={}, endTime={}"
,
log
.
debug
(
"处理Dispatch记录: id={}, executeId={}, mesCode={}, equipId={}, beginTime={}, endTime={}"
,
dispatch
.
getId
(),
dispatch
.
getExecuteId
(),
dispatch
.
getMesCode
(),
dispatch
.
getId
(),
dispatch
.
getExecuteId
(),
dispatch
.
getMesCode
(),
dispatch
.
getEquipId
(),
dispatch
.
getBeginTime
(),
dispatch
.
getEndTime
());
dispatch
.
getEquipId
(),
dispatch
.
getBeginTime
(),
dispatch
.
getEndTime
());
...
@@ -458,7 +458,7 @@ public class LockedOrderProcessorService {
...
@@ -458,7 +458,7 @@ public class LockedOrderProcessorService {
result
.
setProductName
(
""
);
result
.
setProductName
(
""
);
result
.
setProductCode
(
""
);
result
.
setProductCode
(
""
);
log
.
info
(
"从Dispatch创建锁定期工单: executeId={}, OperationId={}, mesCode={}"
,
log
.
debug
(
"从Dispatch创建锁定期工单: executeId={}, OperationId={}, mesCode={}"
,
dispatch
.
getExecuteId
(),
result
.
getOperationId
(),
dispatch
.
getMesCode
());
dispatch
.
getExecuteId
(),
result
.
getOperationId
(),
dispatch
.
getMesCode
());
// 计算相对时间
// 计算相对时间
...
@@ -466,7 +466,7 @@ public class LockedOrderProcessorService {
...
@@ -466,7 +466,7 @@ public class LockedOrderProcessorService {
int
startTime
=
(
int
)
java
.
time
.
temporal
.
ChronoUnit
.
SECONDS
.
between
(
baseTime
,
dispatch
.
getBeginTime
());
int
startTime
=
(
int
)
java
.
time
.
temporal
.
ChronoUnit
.
SECONDS
.
between
(
baseTime
,
dispatch
.
getBeginTime
());
int
endTime
=
(
int
)
java
.
time
.
temporal
.
ChronoUnit
.
SECONDS
.
between
(
baseTime
,
dispatch
.
getEndTime
());
int
endTime
=
(
int
)
java
.
time
.
temporal
.
ChronoUnit
.
SECONDS
.
between
(
baseTime
,
dispatch
.
getEndTime
());
log
.
info
(
"锁定期工单时间计算: ExecId={}, Dispatch时间=[{} 到 {}], baseTime={}, 相对时间=[{} 到 {}]秒"
,
log
.
debug
(
"锁定期工单时间计算: ExecId={}, Dispatch时间=[{} 到 {}], baseTime={}, 相对时间=[{} 到 {}]秒"
,
dispatch
.
getExecuteId
(),
dispatch
.
getBeginTime
(),
dispatch
.
getEndTime
(),
dispatch
.
getExecuteId
(),
dispatch
.
getBeginTime
(),
dispatch
.
getEndTime
(),
baseTime
,
startTime
,
endTime
);
baseTime
,
startTime
,
endTime
);
...
@@ -510,7 +510,7 @@ public class LockedOrderProcessorService {
...
@@ -510,7 +510,7 @@ public class LockedOrderProcessorService {
int
beforeSize
=
chromosome
.
getResult
().
size
();
int
beforeSize
=
chromosome
.
getResult
().
size
();
chromosome
.
getResult
().
addAll
(
data
.
results
);
chromosome
.
getResult
().
addAll
(
data
.
results
);
log
.
info
(
"成功添加 {} 个锁定期工单到调度结果中,result大小从{}变为{}"
,
log
.
debug
(
"成功添加 {} 个锁定期工单到调度结果中,result大小从{}变为{}"
,
data
.
results
.
size
(),
beforeSize
,
chromosome
.
getResult
().
size
());
data
.
results
.
size
(),
beforeSize
,
chromosome
.
getResult
().
size
());
// 1.5. 关键修复:将锁定期工单添加到ResultOld中,确保重新解码时能获取正确的设备ID
// 1.5. 关键修复:将锁定期工单添加到ResultOld中,确保重新解码时能获取正确的设备ID
...
@@ -523,14 +523,14 @@ public class LockedOrderProcessorService {
...
@@ -523,14 +523,14 @@ public class LockedOrderProcessorService {
try
{
try
{
GAScheduleResult
resultCopy
=
ProductionDeepCopyUtil
.
deepCopy
(
result
);
GAScheduleResult
resultCopy
=
ProductionDeepCopyUtil
.
deepCopy
(
result
);
chromosome
.
getResultOld
().
add
(
resultCopy
);
chromosome
.
getResultOld
().
add
(
resultCopy
);
log
.
info
(
"添加锁定期工单到ResultOld: OperationId={}, MachineId={}, IsLocked={}"
,
log
.
debug
(
"添加锁定期工单到ResultOld: OperationId={}, MachineId={}, IsLocked={}"
,
resultCopy
.
getOperationId
(),
resultCopy
.
getMachineId
(),
resultCopy
.
isIsLocked
());
resultCopy
.
getOperationId
(),
resultCopy
.
getMachineId
(),
resultCopy
.
isIsLocked
());
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"深拷贝GAScheduleResult失败: {}"
,
e
.
getMessage
(),
e
);
log
.
error
(
"深拷贝GAScheduleResult失败: {}"
,
e
.
getMessage
(),
e
);
chromosome
.
getResultOld
().
add
(
result
);
// 失败时使用原始对象
chromosome
.
getResultOld
().
add
(
result
);
// 失败时使用原始对象
}
}
}
}
log
.
info
(
"成功添加 {} 个锁定期工单到ResultOld中"
,
data
.
results
.
size
());
log
.
debug
(
"成功添加 {} 个锁定期工单到ResultOld中"
,
data
.
results
.
size
());
// 2. 复制锁定期订单的Order对象
// 2. 复制锁定期订单的Order对象
copyLockedOrderObjects
(
chromosome
,
data
,
config
);
copyLockedOrderObjects
(
chromosome
,
data
,
config
);
...
@@ -566,19 +566,19 @@ public class LockedOrderProcessorService {
...
@@ -566,19 +566,19 @@ public class LockedOrderProcessorService {
.
filter
(
result
->
result
.
getOperationId
()
==
oldId
)
.
filter
(
result
->
result
.
getOperationId
()
==
oldId
)
.
forEach
(
result
->
{
.
forEach
(
result
->
{
result
.
setOperationId
(
finalNextAvailableId
);
result
.
setOperationId
(
finalNextAvailableId
);
log
.
info
(
"更新ResultOld中的operationId: {} -> {}, ExecId={}"
,
log
.
debug
(
"更新ResultOld中的operationId: {} -> {}, ExecId={}"
,
oldId
,
finalNextAvailableId
,
result
.
getExecId
());
oldId
,
finalNextAvailableId
,
result
.
getExecId
());
});
});
}
}
log
.
info
(
"锁定期Entry ID重新分配: {} -> {}, ExecId={}"
,
log
.
debug
(
"锁定期Entry ID重新分配: {} -> {}, ExecId={}"
,
oldId
,
nextAvailableId
,
lockedEntry
.
getExecId
());
oldId
,
nextAvailableId
,
lockedEntry
.
getExecId
());
nextAvailableId
++;
nextAvailableId
++;
}
}
chromosome
.
getAllOperations
().
addAll
(
data
.
entries
.
values
());
chromosome
.
getAllOperations
().
addAll
(
data
.
entries
.
values
());
log
.
info
(
"成功添加 {} 个锁定期Entry到allOperations中,大小从{}变为{},ID范围: {}-{}"
,
log
.
debug
(
"成功添加 {} 个锁定期Entry到allOperations中,大小从{}变为{},ID范围: {}-{}"
,
data
.
entries
.
size
(),
beforeEntrySize
,
chromosome
.
getAllOperations
().
size
(),
data
.
entries
.
size
(),
beforeEntrySize
,
chromosome
.
getAllOperations
().
size
(),
maxExistingId
+
1
,
nextAvailableId
-
1
);
maxExistingId
+
1
,
nextAvailableId
-
1
);
}
}
...
@@ -606,13 +606,13 @@ public class LockedOrderProcessorService {
...
@@ -606,13 +606,13 @@ public class LockedOrderProcessorService {
// 将每个工序的groupId添加到operationSequencing
// 将每个工序的groupId添加到operationSequencing
for
(
Entry
entry
:
orderEntries
)
{
for
(
Entry
entry
:
orderEntries
)
{
currentSequencing
.
add
(
entry
.
getGroupId
());
currentSequencing
.
add
(
entry
.
getGroupId
());
log
.
info
(
"添加锁定期工序到排产序列: OrderId={}, GroupId={}, Sequence={}"
,
log
.
debug
(
"添加锁定期工序到排产序列: OrderId={}, GroupId={}, Sequence={}"
,
orderId
,
entry
.
getGroupId
(),
entry
.
getSequence
());
orderId
,
entry
.
getGroupId
(),
entry
.
getSequence
());
}
}
}
}
chromosome
.
setOperationSequencing
(
currentSequencing
);
chromosome
.
setOperationSequencing
(
currentSequencing
);
log
.
info
(
"更新operationSequencing,从{}个工序增加到{}个工序"
,
log
.
debug
(
"更新operationSequencing,从{}个工序增加到{}个工序"
,
chromosome
.
getOperationSequencing
().
size
()
-
(
currentSequencing
.
size
()
-
chromosome
.
getOperationSequencing
().
size
()),
chromosome
.
getOperationSequencing
().
size
()
-
(
currentSequencing
.
size
()
-
chromosome
.
getOperationSequencing
().
size
()),
currentSequencing
.
size
());
currentSequencing
.
size
());
}
}
...
@@ -642,14 +642,14 @@ public class LockedOrderProcessorService {
...
@@ -642,14 +642,14 @@ public class LockedOrderProcessorService {
chromosome
.
getGlobalOpList
().
add
(
info
);
chromosome
.
getGlobalOpList
().
add
(
info
);
log
.
info
(
"添加锁定期Entry到globalOpList: GlobalOpId={}, EntryId={}, OrderCode={}, GroupId={}, Sequence={}, EquipCode={}"
,
log
.
debug
(
"添加锁定期Entry到globalOpList: GlobalOpId={}, EntryId={}, OrderCode={}, GroupId={}, Sequence={}, EquipCode={}"
,
nextGlobalOpId
,
lockedEntry
.
getId
(),
lockedEntry
.
getOrderCode
(),
nextGlobalOpId
,
lockedEntry
.
getId
(),
lockedEntry
.
getOrderCode
(),
lockedEntry
.
getGroupId
(),
lockedEntry
.
getSequence
(),
lockedEntry
.
getEquipCode
());
lockedEntry
.
getGroupId
(),
lockedEntry
.
getSequence
(),
lockedEntry
.
getEquipCode
());
nextGlobalOpId
++;
nextGlobalOpId
++;
}
}
log
.
info
(
"成功添加 {} 个锁定期Entry到globalOpList中,globalOpList大小变为{}"
,
log
.
debug
(
"成功添加 {} 个锁定期Entry到globalOpList中,globalOpList大小变为{}"
,
sortedEntries
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
sortedEntries
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
}
}
...
@@ -669,11 +669,11 @@ public class LockedOrderProcessorService {
...
@@ -669,11 +669,11 @@ public class LockedOrderProcessorService {
// 锁定期工序的机器已经确定,machineSelection设为1(索引从1开始)
// 锁定期工序的机器已经确定,machineSelection设为1(索引从1开始)
machineSelection
.
add
(
1
);
machineSelection
.
add
(
1
);
log
.
info
(
"添加锁定期Entry的机器选择: EntryId={}, OrderCode={}, EquipCode={}, MachineSelectionIndex=1"
,
log
.
debug
(
"添加锁定期Entry的机器选择: EntryId={}, OrderCode={}, EquipCode={}, MachineSelectionIndex=1"
,
lockedEntry
.
getId
(),
lockedEntry
.
getOrderCode
(),
lockedEntry
.
getEquipCode
());
lockedEntry
.
getId
(),
lockedEntry
.
getOrderCode
(),
lockedEntry
.
getEquipCode
());
}
}
log
.
info
(
"成功添加 {} 个锁定期Entry的机器选择到machineSelection中,machineSelection大小变为{}"
,
log
.
debug
(
"成功添加 {} 个锁定期Entry的机器选择到machineSelection中,machineSelection大小变为{}"
,
sortedEntries
.
size
(),
machineSelection
.
size
());
sortedEntries
.
size
(),
machineSelection
.
size
());
// 验证:确保machineSelection长度与globalOpList长度一致
// 验证:确保machineSelection长度与globalOpList长度一致
...
@@ -681,7 +681,7 @@ public class LockedOrderProcessorService {
...
@@ -681,7 +681,7 @@ public class LockedOrderProcessorService {
log
.
error
(
"警告:machineSelection长度({})与globalOpList长度({})不一致!"
,
log
.
error
(
"警告:machineSelection长度({})与globalOpList长度({})不一致!"
,
machineSelection
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
machineSelection
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
}
else
{
}
else
{
log
.
info
(
"验证通过:machineSelection长度({})与globalOpList长度({})一致"
,
log
.
debug
(
"验证通过:machineSelection长度({})与globalOpList长度({})一致"
,
machineSelection
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
machineSelection
.
size
(),
chromosome
.
getGlobalOpList
().
size
());
}
}
}
}
...
@@ -707,7 +707,7 @@ public class LockedOrderProcessorService {
...
@@ -707,7 +707,7 @@ public class LockedOrderProcessorService {
.
filter
(
Objects:
:
nonNull
)
.
filter
(
Objects:
:
nonNull
)
.
collect
(
Collectors
.
toSet
());
.
collect
(
Collectors
.
toSet
());
log
.
info
(
"需要复制的锁定期订单ID: {}"
,
lockedOrderIds
);
log
.
debug
(
"需要复制的锁定期订单ID: {}"
,
lockedOrderIds
);
// 用于存储OrderId到新Order.id的映射
// 用于存储OrderId到新Order.id的映射
Map
<
String
,
Integer
>
orderIdToNewGroupId
=
new
HashMap
<>();
Map
<
String
,
Integer
>
orderIdToNewGroupId
=
new
HashMap
<>();
...
@@ -715,14 +715,14 @@ public class LockedOrderProcessorService {
...
@@ -715,14 +715,14 @@ public class LockedOrderProcessorService {
try
{
try
{
// 查询锁定期Dispatch记录
// 查询锁定期Dispatch记录
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
log
.
info
(
"查询到 {} 个锁定期Dispatch记录"
,
frozenDispatches
.
size
());
log
.
debug
(
"查询到 {} 个锁定期Dispatch记录"
,
frozenDispatches
.
size
());
Set
<
String
>
dispatchSceneIds
=
frozenDispatches
.
stream
()
Set
<
String
>
dispatchSceneIds
=
frozenDispatches
.
stream
()
.
map
(
Dispatch:
:
getSceneId
)
.
map
(
Dispatch:
:
getSceneId
)
.
filter
(
id
->
id
!=
null
&&
!
id
.
isEmpty
())
.
filter
(
id
->
id
!=
null
&&
!
id
.
isEmpty
())
.
collect
(
Collectors
.
toSet
());
.
collect
(
Collectors
.
toSet
());
log
.
info
(
"锁定期Dispatch记录来自 {} 个场景: {}"
,
dispatchSceneIds
.
size
(),
dispatchSceneIds
);
log
.
debug
(
"锁定期Dispatch记录来自 {} 个场景: {}"
,
dispatchSceneIds
.
size
(),
dispatchSceneIds
);
// 从每个场景复制订单,并收集Order ID映射
// 从每个场景复制订单,并收集Order ID映射
for
(
String
sceneId
:
dispatchSceneIds
)
{
for
(
String
sceneId
:
dispatchSceneIds
)
{
...
@@ -730,7 +730,7 @@ public class LockedOrderProcessorService {
...
@@ -730,7 +730,7 @@ public class LockedOrderProcessorService {
orderIdToNewGroupId
.
putAll
(
sceneMapping
);
orderIdToNewGroupId
.
putAll
(
sceneMapping
);
}
}
log
.
info
(
"Order ID映射: {}"
,
orderIdToNewGroupId
);
log
.
debug
(
"Order ID映射: {}"
,
orderIdToNewGroupId
);
// 更新Entry的groupId
// 更新Entry的groupId
updateEntryGroupIds
(
data
,
orderIdToNewGroupId
);
updateEntryGroupIds
(
data
,
orderIdToNewGroupId
);
...
@@ -742,7 +742,7 @@ public class LockedOrderProcessorService {
...
@@ -742,7 +742,7 @@ public class LockedOrderProcessorService {
log
.
error
(
"复制锁定期订单失败: {}"
,
e
.
getMessage
(),
e
);
log
.
error
(
"复制锁定期订单失败: {}"
,
e
.
getMessage
(),
e
);
}
}
log
.
info
(
"成功复制锁定期订单到Orders列表,大小从{}变为{}"
,
beforeOrderSize
,
chromosome
.
getOrders
().
size
());
log
.
debug
(
"成功复制锁定期订单到Orders列表,大小从{}变为{}"
,
beforeOrderSize
,
chromosome
.
getOrders
().
size
());
}
}
/**
/**
* 从场景复制订单,并返回OrderId到新Order.id的映射
* 从场景复制订单,并返回OrderId到新Order.id的映射
...
@@ -752,7 +752,7 @@ public class LockedOrderProcessorService {
...
@@ -752,7 +752,7 @@ public class LockedOrderProcessorService {
Map
<
String
,
Integer
>
orderIdToNewGroupId
=
new
HashMap
<>();
Map
<
String
,
Integer
>
orderIdToNewGroupId
=
new
HashMap
<>();
try
{
try
{
log
.
info
(
"开始从场景 {} 加载Chromosome"
,
sceneId
);
log
.
debug
(
"开始从场景 {} 加载Chromosome"
,
sceneId
);
Chromosome
dispatchChromosome
=
sceneService
.
loadChromosomeFromFile
(
sceneId
);
Chromosome
dispatchChromosome
=
sceneService
.
loadChromosomeFromFile
(
sceneId
);
if
(
dispatchChromosome
==
null
)
{
if
(
dispatchChromosome
==
null
)
{
...
@@ -760,7 +760,7 @@ public class LockedOrderProcessorService {
...
@@ -760,7 +760,7 @@ public class LockedOrderProcessorService {
return
orderIdToNewGroupId
;
return
orderIdToNewGroupId
;
}
}
log
.
info
(
"场景 {} 加载成功,Orders数量: {}"
,
sceneId
,
log
.
debug
(
"场景 {} 加载成功,Orders数量: {}"
,
sceneId
,
dispatchChromosome
.
getOrders
()
!=
null
?
dispatchChromosome
.
getOrders
().
size
()
:
0
);
dispatchChromosome
.
getOrders
()
!=
null
?
dispatchChromosome
.
getOrders
().
size
()
:
0
);
if
(
dispatchChromosome
.
getOrders
()
==
null
)
{
if
(
dispatchChromosome
.
getOrders
()
==
null
)
{
...
@@ -773,7 +773,7 @@ public class LockedOrderProcessorService {
...
@@ -773,7 +773,7 @@ public class LockedOrderProcessorService {
.
filter
(
order
->
lockedOrderIds
.
contains
(
order
.
getOrderId
()))
.
filter
(
order
->
lockedOrderIds
.
contains
(
order
.
getOrderId
()))
.
collect
(
Collectors
.
toList
());
.
collect
(
Collectors
.
toList
());
log
.
info
(
"场景 {} 中找到 {} 个匹配的锁定期订单"
,
sceneId
,
lockedOrders
.
size
());
log
.
debug
(
"场景 {} 中找到 {} 个匹配的锁定期订单"
,
sceneId
,
lockedOrders
.
size
());
// 获取当前最大的Order ID
// 获取当前最大的Order ID
int
maxOrderId
=
chromosome
.
getOrders
().
stream
()
int
maxOrderId
=
chromosome
.
getOrders
().
stream
()
...
@@ -781,7 +781,7 @@ public class LockedOrderProcessorService {
...
@@ -781,7 +781,7 @@ public class LockedOrderProcessorService {
.
max
()
.
max
()
.
orElse
(
0
);
.
orElse
(
0
);
log
.
info
(
"当前最大Order ID: {}"
,
maxOrderId
);
log
.
debug
(
"当前最大Order ID: {}"
,
maxOrderId
);
// 复制订单(避免重复)
// 复制订单(避免重复)
for
(
Order
lockedOrder
:
lockedOrders
)
{
for
(
Order
lockedOrder
:
lockedOrders
)
{
...
@@ -797,7 +797,7 @@ public class LockedOrderProcessorService {
...
@@ -797,7 +797,7 @@ public class LockedOrderProcessorService {
// 记录映射关系
// 记录映射关系
orderIdToNewGroupId
.
put
(
lockedOrder
.
getOrderId
(),
newOrderId
);
orderIdToNewGroupId
.
put
(
lockedOrder
.
getOrderId
(),
newOrderId
);
log
.
info
(
"从场景 {} 复制锁定期订单: OrderId={}, OrderCode={}, 旧Order.id={}, 新Order.id={}"
,
log
.
debug
(
"从场景 {} 复制锁定期订单: OrderId={}, OrderCode={}, 旧Order.id={}, 新Order.id={}"
,
sceneId
,
lockedOrder
.
getOrderId
(),
lockedOrder
.
getOrderCode
(),
oldOrderId
,
newOrderId
);
sceneId
,
lockedOrder
.
getOrderId
(),
lockedOrder
.
getOrderCode
(),
oldOrderId
,
newOrderId
);
chromosome
.
getOrders
().
add
(
lockedOrder
);
chromosome
.
getOrders
().
add
(
lockedOrder
);
...
@@ -820,7 +820,7 @@ public class LockedOrderProcessorService {
...
@@ -820,7 +820,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"开始更新Entry的groupId,映射数量: {}"
,
orderIdToNewGroupId
.
size
());
log
.
debug
(
"开始更新Entry的groupId,映射数量: {}"
,
orderIdToNewGroupId
.
size
());
for
(
Entry
entry
:
data
.
entries
.
values
())
{
for
(
Entry
entry
:
data
.
entries
.
values
())
{
String
orderId
=
entry
.
getOrderId
();
String
orderId
=
entry
.
getOrderId
();
...
@@ -828,12 +828,12 @@ public class LockedOrderProcessorService {
...
@@ -828,12 +828,12 @@ public class LockedOrderProcessorService {
int
oldGroupId
=
entry
.
getGroupId
();
int
oldGroupId
=
entry
.
getGroupId
();
int
newGroupId
=
orderIdToNewGroupId
.
get
(
orderId
);
int
newGroupId
=
orderIdToNewGroupId
.
get
(
orderId
);
entry
.
setGroupId
(
newGroupId
);
entry
.
setGroupId
(
newGroupId
);
log
.
info
(
"更新Entry的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}"
,
log
.
debug
(
"更新Entry的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}"
,
entry
.
getExecId
(),
orderId
,
oldGroupId
,
newGroupId
);
entry
.
getExecId
(),
orderId
,
oldGroupId
,
newGroupId
);
}
}
}
}
log
.
info
(
"Entry的groupId更新完成"
);
log
.
debug
(
"Entry的groupId更新完成"
);
}
}
/**
/**
...
@@ -844,7 +844,7 @@ public class LockedOrderProcessorService {
...
@@ -844,7 +844,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"开始更新GAScheduleResult的groupId,映射数量: {}"
,
orderIdToNewGroupId
.
size
());
log
.
debug
(
"开始更新GAScheduleResult的groupId,映射数量: {}"
,
orderIdToNewGroupId
.
size
());
for
(
GAScheduleResult
result
:
data
.
results
)
{
for
(
GAScheduleResult
result
:
data
.
results
)
{
String
orderId
=
result
.
getOrderId
();
String
orderId
=
result
.
getOrderId
();
...
@@ -852,12 +852,12 @@ public class LockedOrderProcessorService {
...
@@ -852,12 +852,12 @@ public class LockedOrderProcessorService {
int
oldGroupId
=
result
.
getGroupId
();
int
oldGroupId
=
result
.
getGroupId
();
int
newGroupId
=
orderIdToNewGroupId
.
get
(
orderId
);
int
newGroupId
=
orderIdToNewGroupId
.
get
(
orderId
);
result
.
setGroupId
(
newGroupId
);
result
.
setGroupId
(
newGroupId
);
log
.
info
(
"更新GAScheduleResult的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}"
,
log
.
debug
(
"更新GAScheduleResult的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}"
,
result
.
getExecId
(),
orderId
,
oldGroupId
,
newGroupId
);
result
.
getExecId
(),
orderId
,
oldGroupId
,
newGroupId
);
}
}
}
}
log
.
info
(
"GAScheduleResult的groupId更新完成"
);
log
.
debug
(
"GAScheduleResult的groupId更新完成"
);
}
}
/**
/**
...
@@ -880,7 +880,7 @@ public class LockedOrderProcessorService {
...
@@ -880,7 +880,7 @@ public class LockedOrderProcessorService {
return
;
return
;
}
}
log
.
info
(
"锁定期工单使用的设备不在本次排产中,需要从已下发场景获取设备信息: {}"
,
missingMachineIds
);
log
.
debug
(
"锁定期工单使用的设备不在本次排产中,需要从已下发场景获取设备信息: {}"
,
missingMachineIds
);
try
{
try
{
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
List
<
Dispatch
>
frozenDispatches
=
queryFrozenDispatches
(
config
);
...
@@ -912,7 +912,7 @@ public class LockedOrderProcessorService {
...
@@ -912,7 +912,7 @@ public class LockedOrderProcessorService {
*/
*/
private
void
loadMachinesFromScene
(
Chromosome
chromosome
,
String
sceneId
,
Set
<
Long
>
missingMachineIds
)
{
private
void
loadMachinesFromScene
(
Chromosome
chromosome
,
String
sceneId
,
Set
<
Long
>
missingMachineIds
)
{
try
{
try
{
log
.
info
(
"从场景 {} 获取设备信息"
,
sceneId
);
log
.
debug
(
"从场景 {} 获取设备信息"
,
sceneId
);
Chromosome
dispatchChromosome
=
loadSceneChromosome
(
sceneId
);
Chromosome
dispatchChromosome
=
loadSceneChromosome
(
sceneId
);
if
(
dispatchChromosome
==
null
||
dispatchChromosome
.
getInitMachines
()
==
null
)
{
if
(
dispatchChromosome
==
null
||
dispatchChromosome
.
getInitMachines
()
==
null
)
{
...
@@ -924,7 +924,7 @@ public class LockedOrderProcessorService {
...
@@ -924,7 +924,7 @@ public class LockedOrderProcessorService {
.
collect
(
Collectors
.
toList
());
.
collect
(
Collectors
.
toList
());
if
(!
foundMachines
.
isEmpty
())
{
if
(!
foundMachines
.
isEmpty
())
{
log
.
info
(
"从场景 {} 的排产结果中找到 {} 个锁定期设备"
,
sceneId
,
foundMachines
.
size
());
log
.
debug
(
"从场景 {} 的排产结果中找到 {} 个锁定期设备"
,
sceneId
,
foundMachines
.
size
());
chromosome
.
getInitMachines
().
addAll
(
foundMachines
);
chromosome
.
getInitMachines
().
addAll
(
foundMachines
);
Set
<
Long
>
foundIds
=
foundMachines
.
stream
()
Set
<
Long
>
foundIds
=
foundMachines
.
stream
()
...
@@ -1014,14 +1014,14 @@ public class LockedOrderProcessorService {
...
@@ -1014,14 +1014,14 @@ public class LockedOrderProcessorService {
machine
.
setName
(
planResource
.
getTitle
());
machine
.
setName
(
planResource
.
getTitle
());
machine
.
setDepartment
(
planResource
.
getDepartTitle
());
machine
.
setDepartment
(
planResource
.
getDepartTitle
());
log
.
info
(
"为设备 {} 查询班次信息,workSchedId: {}"
,
machineId
,
planResource
.
getWorkSchedId
());
log
.
debug
(
"为设备 {} 查询班次信息,workSchedId: {}"
,
machineId
,
planResource
.
getWorkSchedId
());
// 查询设备的真实班次信息
// 查询设备的真实班次信息
List
<
MesShiftWorkSched
>
shiftWorkScheds
=
allShiftWorkScheds
.
stream
()
List
<
MesShiftWorkSched
>
shiftWorkScheds
=
allShiftWorkScheds
.
stream
()
.
filter
(
t
->
(
long
)
t
.
getWeekWorkSchedId
()
==
planResource
.
getWorkSchedId
())
.
filter
(
t
->
(
long
)
t
.
getWeekWorkSchedId
()
==
planResource
.
getWorkSchedId
())
.
collect
(
Collectors
.
toList
());
.
collect
(
Collectors
.
toList
());
log
.
info
(
"设备 {} 找到 {} 个班次记录"
,
machineId
,
shiftWorkScheds
.
size
());
log
.
debug
(
"设备 {} 找到 {} 个班次记录"
,
machineId
,
shiftWorkScheds
.
size
());
if
(!
shiftWorkScheds
.
isEmpty
())
{
if
(!
shiftWorkScheds
.
isEmpty
())
{
// 使用真实的班次信息
// 使用真实的班次信息
...
@@ -1033,7 +1033,7 @@ public class LockedOrderProcessorService {
...
@@ -1033,7 +1033,7 @@ public class LockedOrderProcessorService {
shift
.
setEndDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
shift
.
setEndDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
}
}
machine
.
setShifts
(
shifts
);
machine
.
setShifts
(
shifts
);
log
.
info
(
"为设备 {} 设置真实班次信息,共 {} 个班次"
,
machineId
,
shifts
.
size
());
log
.
debug
(
"为设备 {} 设置真实班次信息,共 {} 个班次"
,
machineId
,
shifts
.
size
());
}
else
{
}
else
{
// 如果没有找到班次信息,使用默认24小时班次
// 如果没有找到班次信息,使用默认24小时班次
machine
.
setShifts
(
createDefault24HourShift
(
machineId
));
machine
.
setShifts
(
createDefault24HourShift
(
machineId
));
...
@@ -1050,7 +1050,7 @@ public class LockedOrderProcessorService {
...
@@ -1050,7 +1050,7 @@ public class LockedOrderProcessorService {
chromosome
.
getInitMachines
().
add
(
machine
);
chromosome
.
getInitMachines
().
add
(
machine
);
}
}
log
.
info
(
"成功创建 {} 个默认锁定期设备"
,
machineIds
.
size
());
log
.
debug
(
"成功创建 {} 个默认锁定期设备"
,
machineIds
.
size
());
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"创建默认设备信息失败: {}"
,
e
.
getMessage
(),
e
);
log
.
error
(
"创建默认设备信息失败: {}"
,
e
.
getMessage
(),
e
);
}
}
...
@@ -1193,6 +1193,7 @@ public class LockedOrderProcessorService {
...
@@ -1193,6 +1193,7 @@ public class LockedOrderProcessorService {
/**
/**
* 在排产前标记锁定期工单占用的设备时间段
* 在排产前标记锁定期工单占用的设备时间段
* 将锁定期工单占用的设备时间段标记为不可用,避免新工单与锁定期工单冲突
* 将锁定期工单占用的设备时间段标记为不可用,避免新工单与锁定期工单冲突
* 核心逻辑:拆分设备的可用时间段,将锁定期工单占用的部分标记为isUsed=true
*
*
* @param machines 设备列表
* @param machines 设备列表
* @param baseTime 基准时间
* @param baseTime 基准时间
...
@@ -1202,11 +1203,11 @@ public class LockedOrderProcessorService {
...
@@ -1202,11 +1203,11 @@ public class LockedOrderProcessorService {
// 1. 获取时间配置
// 1. 获取时间配置
LockPeriodConfig
config
=
getLockPeriodConfig
();
LockPeriodConfig
config
=
getLockPeriodConfig
();
if
(
config
==
null
)
{
if
(
config
==
null
)
{
log
.
warn
(
"未找到锁定期配置,跳过标记锁定期设备占用"
);
log
.
debug
(
"未找到锁定期配置,跳过标记锁定期设备占用"
);
return
;
return
;
}
}
log
.
info
(
"开始标记锁定期设备占用时间段,锁定期范围: {} 到 {}"
,
config
.
lockStartTime
,
config
.
lockEndTime
);
log
.
debug
(
"开始标记锁定期设备占用时间段,锁定期范围: {} 到 {}"
,
config
.
lockStartTime
,
config
.
lockEndTime
);
// 2. 从Dispatch表查询锁定期内的工单
// 2. 从Dispatch表查询锁定期内的工单
List
<
Dispatch
>
frozenDispatches
=
dispatchService
.
lambdaQuery
()
List
<
Dispatch
>
frozenDispatches
=
dispatchService
.
lambdaQuery
()
...
@@ -1219,11 +1220,11 @@ public class LockedOrderProcessorService {
...
@@ -1219,11 +1220,11 @@ public class LockedOrderProcessorService {
.
list
();
.
list
();
if
(
frozenDispatches
.
isEmpty
())
{
if
(
frozenDispatches
.
isEmpty
())
{
log
.
info
(
"没有锁定期工单需要标记设备占用"
);
log
.
debug
(
"没有锁定期工单需要标记设备占用"
);
return
;
return
;
}
}
log
.
info
(
"查询到 {} 个锁定期工单,开始标记设备占用"
,
frozenDispatches
.
size
());
log
.
debug
(
"查询到 {} 个锁定期工单,开始标记设备占用"
,
frozenDispatches
.
size
());
// 3. 按设备分组
// 3. 按设备分组
Map
<
Long
,
List
<
Dispatch
>>
dispatchByMachine
=
frozenDispatches
.
stream
()
Map
<
Long
,
List
<
Dispatch
>>
dispatchByMachine
=
frozenDispatches
.
stream
()
...
@@ -1257,20 +1258,17 @@ public class LockedOrderProcessorService {
...
@@ -1257,20 +1258,17 @@ public class LockedOrderProcessorService {
LocalDateTime
occupyStart
=
dispatchStart
.
isBefore
(
baseTime
)
?
baseTime
:
dispatchStart
;
LocalDateTime
occupyStart
=
dispatchStart
.
isBefore
(
baseTime
)
?
baseTime
:
dispatchStart
;
LocalDateTime
occupyEnd
=
dispatchEnd
;
LocalDateTime
occupyEnd
=
dispatchEnd
;
// 创建一个不可用的时间段
// 初始化设备的可用时间段列表
TimeSegment
occupiedSegment
=
new
TimeSegment
();
occupiedSegment
.
setStart
(
occupyStart
);
occupiedSegment
.
setEnd
(
occupyEnd
);
occupiedSegment
.
setType
(
SegmentType
.
MAINTENANCE
);
// 标记为不可用
occupiedSegment
.
setUsed
(
true
);
// 标记为已占用
occupiedSegment
.
setHoliday
(
false
);
occupiedSegment
.
setEfficiency
(
1.0
);
// 添加到设备的可用时间段列表中
if
(
machine
.
getAvailability
()
==
null
)
{
if
(
machine
.
getAvailability
()
==
null
)
{
machine
.
setAvailability
(
new
CopyOnWriteArrayList
<>());
machine
.
setAvailability
(
new
CopyOnWriteArrayList
<>());
}
}
machine
.
getAvailability
().
add
(
occupiedSegment
);
// 关键逻辑:拆分设备的可用时间段
// 将与锁定期工单重叠的时间段拆分成三部分:
// 1. 锁定期之前的部分(isUsed=false)
// 2. 锁定期占用的部分(isUsed=true)
// 3. 锁定期之后的部分(isUsed=false)
splitAndMarkAvailabilitySegments
(
machine
,
occupyStart
,
occupyEnd
);
markedCount
++;
markedCount
++;
log
.
debug
(
"标记设备 {} 的锁定期占用时间段: {} 到 {}, 订单: {}"
,
log
.
debug
(
"标记设备 {} 的锁定期占用时间段: {} 到 {}, 订单: {}"
,
...
@@ -1279,13 +1277,106 @@ public class LockedOrderProcessorService {
...
@@ -1279,13 +1277,106 @@ public class LockedOrderProcessorService {
}
}
}
}
log
.
info
(
"成功标记 {} 个锁定期工单的设备占用时间段"
,
markedCount
);
log
.
debug
(
"成功标记 {} 个锁定期工单的设备占用时间段"
,
markedCount
);
// 5. 打印设备的可用时间段信息用于调试
for
(
Machine
machine
:
machines
)
{
if
(
machine
.
getAvailability
()
!=
null
&&
!
machine
.
getAvailability
().
isEmpty
())
{
log
.
debug
(
"设备 {} 的availability中有 {} 个时间段,前3个:"
,
machine
.
getId
(),
machine
.
getAvailability
().
size
());
for
(
int
i
=
0
;
i
<
Math
.
min
(
3
,
machine
.
getAvailability
().
size
());
i
++)
{
TimeSegment
seg
=
machine
.
getAvailability
().
get
(
i
);
log
.
debug
(
" [{}] 类型={}, 开始={}, 结束={}, isUsed={}"
,
i
,
seg
.
getType
(),
seg
.
getStart
(),
seg
.
getEnd
(),
seg
.
isUsed
());
}
}
}
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"标记锁定期设备占用时间段失败: {}"
,
e
.
getMessage
(),
e
);
log
.
error
(
"标记锁定期设备占用时间段失败: {}"
,
e
.
getMessage
(),
e
);
}
}
}
}
/**
* 拆分并标记设备的可用时间段
* 将与锁定期工单重叠的时间段拆分,并标记占用部分为isUsed=true
*
* @param machine 设备对象
* @param occupyStart 锁定期工单开始时间
* @param occupyEnd 锁定期工单结束时间
*/
private
void
splitAndMarkAvailabilitySegments
(
Machine
machine
,
LocalDateTime
occupyStart
,
LocalDateTime
occupyEnd
)
{
if
(
machine
.
getAvailability
()
==
null
||
machine
.
getAvailability
().
isEmpty
())
{
// 如果没有可用时间段,直接添加占用段
TimeSegment
occupiedSegment
=
new
TimeSegment
();
occupiedSegment
.
setStart
(
occupyStart
);
occupiedSegment
.
setEnd
(
occupyEnd
);
occupiedSegment
.
setType
(
SegmentType
.
MAINTENANCE
);
occupiedSegment
.
setUsed
(
true
);
occupiedSegment
.
setHoliday
(
false
);
occupiedSegment
.
setEfficiency
(
1.0
);
machine
.
getAvailability
().
add
(
occupiedSegment
);
return
;
}
// 处理现有的可用时间段
List
<
TimeSegment
>
segmentsToProcess
=
new
ArrayList
<>(
machine
.
getAvailability
());
machine
.
getAvailability
().
clear
();
for
(
TimeSegment
segment
:
segmentsToProcess
)
{
// 检查时间段与锁定期工单是否有重叠
if
(
segment
.
getStart
().
isBefore
(
occupyEnd
)
&&
segment
.
getEnd
().
isAfter
(
occupyStart
))
{
// 有重叠,需要拆分
// 1. 前半部分(锁定期之前)
if
(
segment
.
getStart
().
isBefore
(
occupyStart
))
{
TimeSegment
beforeSegment
=
new
TimeSegment
();
beforeSegment
.
setStart
(
segment
.
getStart
());
beforeSegment
.
setEnd
(
occupyStart
);
beforeSegment
.
setType
(
segment
.
getType
());
beforeSegment
.
setUsed
(
false
);
// 未被占用
beforeSegment
.
setHoliday
(
segment
.
isHoliday
());
beforeSegment
.
setEfficiency
(
segment
.
getEfficiency
());
beforeSegment
.
setKey
(
segment
.
getKey
());
machine
.
getAvailability
().
add
(
beforeSegment
);
log
.
debug
(
"添加前半部分时间段: {} 到 {}, isUsed=false"
,
beforeSegment
.
getStart
(),
beforeSegment
.
getEnd
());
}
// 2. 中间部分(锁定期占用)
TimeSegment
occupiedSegment
=
new
TimeSegment
();
occupiedSegment
.
setStart
(
occupyStart
);
occupiedSegment
.
setEnd
(
occupyEnd
);
occupiedSegment
.
setType
(
SegmentType
.
MAINTENANCE
);
occupiedSegment
.
setUsed
(
true
);
// 被占用
occupiedSegment
.
setHoliday
(
false
);
occupiedSegment
.
setEfficiency
(
segment
.
getEfficiency
());
machine
.
getAvailability
().
add
(
occupiedSegment
);
log
.
debug
(
"添加占用部分时间段: {} 到 {}, isUsed=true"
,
occupiedSegment
.
getStart
(),
occupiedSegment
.
getEnd
());
// 3. 后半部分(锁定期之后)
if
(
segment
.
getEnd
().
isAfter
(
occupyEnd
))
{
TimeSegment
afterSegment
=
new
TimeSegment
();
afterSegment
.
setStart
(
occupyEnd
);
afterSegment
.
setEnd
(
segment
.
getEnd
());
afterSegment
.
setType
(
segment
.
getType
());
afterSegment
.
setUsed
(
false
);
// 未被占用
afterSegment
.
setHoliday
(
segment
.
isHoliday
());
afterSegment
.
setEfficiency
(
segment
.
getEfficiency
());
afterSegment
.
setKey
(
segment
.
getKey
());
machine
.
getAvailability
().
add
(
afterSegment
);
log
.
debug
(
"添加后半部分时间段: {} 到 {}, isUsed=false"
,
afterSegment
.
getStart
(),
afterSegment
.
getEnd
());
}
}
else
{
// 没有重叠,保持原样
segment
.
setUsed
(
false
);
// 确保未被占用的段标记为false
machine
.
getAvailability
().
add
(
segment
);
log
.
debug
(
"保持原有时间段: {} 到 {}, isUsed=false"
,
segment
.
getStart
(),
segment
.
getEnd
());
}
}
// 按开始时间排序
machine
.
getAvailability
().
sort
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
));
}
/**
/**
* 锁定期配置类
* 锁定期配置类
*/
*/
...
...
src/main/java/com/aps/service/plan/PlanResultService.java
View file @
9a024f03
...
@@ -266,7 +266,7 @@ public class PlanResultService {
...
@@ -266,7 +266,7 @@ public class PlanResultService {
//
//
// // 如果freezeSeconds为0,则不添加锁定期工单
// // 如果freezeSeconds为0,则不添加锁定期工单
// if (freezeSeconds <= 0) {
// if (freezeSeconds <= 0) {
// log.
info
("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds);
// log.
debug
("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds);
// return;
// return;
// }
// }
//
//
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment