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
a448dbf7
Commit
a448dbf7
authored
Dec 26, 2025
by
Tong Li
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
遗传算法-设备日历缓存
parent
2ac79222
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
402 additions
and
54 deletions
+402
-54
pom.xml
pom.xml
+6
-0
RangeSubtractUtil.java
src/main/java/com/aps/common/util/RangeSubtractUtil.java
+55
-0
ResourceGanttController.java
...ava/com/aps/controller/gantt/ResourceGanttController.java
+10
-0
DateRange.java
src/main/java/com/aps/entity/Algorithm/DateRange.java
+78
-0
Shift.java
src/main/java/com/aps/entity/basic/Shift.java
+1
-1
MaterialRequirementService.java
...com/aps/service/Algorithm/MaterialRequirementService.java
+9
-9
RoutingDataService.java
...in/java/com/aps/service/Algorithm/RoutingDataService.java
+80
-35
ScheduleOperationService.java
...a/com/aps/service/Algorithm/ScheduleOperationService.java
+76
-5
PlanResultService.java
src/main/java/com/aps/service/plan/PlanResultService.java
+83
-3
application.yml
src/main/resources/application.yml
+1
-1
PlanResultServiceTest.java
src/test/java/com/aps/demo/PlanResultServiceTest.java
+3
-0
No files found.
pom.xml
View file @
a448dbf7
...
...
@@ -100,6 +100,12 @@
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
com.fasterxml.jackson.datatype
</groupId>
<artifactId>
jackson-datatype-jsr310
</artifactId>
<version>
2.15.2
</version>
<!-- 建议与jackson-databind版本一致 -->
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/aps/common/util/RangeSubtractUtil.java
0 → 100644
View file @
a448dbf7
package
com
.
aps
.
common
.
util
;
import
com.aps.entity.Algorithm.DateRange
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
public
class
RangeSubtractUtil
{
// 主方法:返回数组1与数组2无交集的区间列表
public
static
List
<
DateRange
>
getNonOverlappingRanges
(
List
<
DateRange
>
list1
,
List
<
DateRange
>
list2
)
{
List
<
DateRange
>
result
=
new
ArrayList
<>(
list1
);
// 先复制数组1的所有区间
// 遍历数组2的每个区间,依次切割结果中的区间
for
(
DateRange
target
:
list2
)
{
List
<
DateRange
>
temp
=
new
ArrayList
<>();
for
(
DateRange
current
:
result
)
{
// 切割当前区间,排除与target重叠的部分
temp
.
addAll
(
current
.
subtract
(
target
));
}
result
=
temp
;
// 更新结果为切割后的区间
}
// 过滤无效区间(start > end的情况)
result
.
removeIf
(
range
->
!
range
.
isValid
());
return
result
;
}
// 测试示例
public
static
void
test
()
{
// 构造数组1
List
<
DateRange
>
list1
=
new
ArrayList
<>();
list1
.
add
(
new
DateRange
(
"2025/10/01 00:00:00"
,
"2025/10/08 23:59:59"
));
list1
.
add
(
new
DateRange
(
"2025/11/01 00:00:00"
,
"2025/11/03 23:59:59"
));
// 构造数组2
List
<
DateRange
>
list2
=
new
ArrayList
<>();
list2
.
add
(
new
DateRange
(
"2025/10/03 00:00:00"
,
"2025/10/03 23:59:59"
));
list2
.
add
(
new
DateRange
(
"2025/10/06 00:00:00"
,
"2025/10/07 23:59:59"
));
// 计算无交集区间
List
<
DateRange
>
nonOverlapping
=
getNonOverlappingRanges
(
list1
,
list2
);
// 输出结果(与题目示例一致)
System
.
out
.
println
(
"无交集区间:"
);
nonOverlapping
.
forEach
(
range
->
System
.
out
.
println
(
DateTimeUtil
.
format
(
range
.
getStartDate
(),
"yyyy/MM/dd"
)
+
" ~ "
+
DateTimeUtil
.
format
(
range
.
getEndDate
(),
"yyyy/MM/dd"
))
);
}
}
src/main/java/com/aps/controller/gantt/ResourceGanttController.java
View file @
a448dbf7
...
...
@@ -146,6 +146,16 @@ public class ResourceGanttController {
}
@GetMapping
(
"/SyncMachines"
)
@Operation
(
summary
=
"更新设备信息缓存"
,
description
=
"更新设备信息缓存"
)
public
void
SyncMachines
()
{
// 调用 PlanResultService 获取 ScheduleChromosome 列表
planResultService
.
InitCalendarToAllMachines
();
}
@PostMapping
(
"/operationMove"
)
...
...
src/main/java/com/aps/entity/Algorithm/DateRange.java
0 → 100644
View file @
a448dbf7
package
com
.
aps
.
entity
.
Algorithm
;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.List
;
// 时间区间实体类
public
class
DateRange
{
private
LocalDateTime
startDate
;
private
LocalDateTime
endDate
;
private
static
final
DateTimeFormatter
FORMATTER
=
DateTimeFormatter
.
ofPattern
(
"yyyy/MM/dd HH:mm:ss"
);
// 构造方法(支持字符串日期)
public
DateRange
(
String
start
,
String
end
)
{
this
.
startDate
=
LocalDateTime
.
parse
(
start
,
FORMATTER
);
this
.
endDate
=
LocalDateTime
.
parse
(
end
,
FORMATTER
);
}
// 构造方法(支持LocalDate)
public
DateRange
(
LocalDateTime
start
,
LocalDateTime
end
)
{
this
.
startDate
=
start
;
this
.
endDate
=
end
;
}
// 判断当前区间是否有效(start <= end)
public
boolean
isValid
()
{
return
!
startDate
.
isAfter
(
endDate
);
}
// 切割当前区间,排除与targetRange重叠的部分,返回无交集的子区间列表
public
List
<
DateRange
>
subtract
(
DateRange
targetRange
)
{
List
<
DateRange
>
result
=
new
ArrayList
<>();
// 1. 当前区间在targetRange之前:无交集,直接保留当前区间
if
(
this
.
endDate
.
isBefore
(
targetRange
.
startDate
))
{
result
.
add
(
this
);
return
result
;
}
// 2. 当前区间在targetRange之后:无交集,直接保留当前区间
if
(
this
.
startDate
.
isAfter
(
targetRange
.
endDate
))
{
result
.
add
(
this
);
return
result
;
}
// 3. 部分重叠:切割出无交集的子区间
// 左半部分(当前start ~ target的start前一天)
if
(
this
.
startDate
.
isBefore
(
targetRange
.
startDate
))
{
result
.
add
(
new
DateRange
(
this
.
startDate
,
targetRange
.
startDate
.
minusSeconds
(
1
)));
}
// 右半部分(target的end后一天 ~ 当前end)
if
(
this
.
endDate
.
isAfter
(
targetRange
.
endDate
))
{
result
.
add
(
new
DateRange
(
targetRange
.
endDate
.
plusSeconds
(
1
),
this
.
endDate
));
}
return
result
;
}
// 转换为字符串格式(方便输出)
@Override
public
String
toString
()
{
return
startDate
.
format
(
FORMATTER
)
+
" ~ "
+
endDate
.
format
(
FORMATTER
);
}
// getter
public
LocalDateTime
getStartDate
()
{
return
startDate
;
}
public
LocalDateTime
getEndDate
()
{
return
endDate
;
}
}
// 核心方法实现
src/main/java/com/aps/entity/basic/Shift.java
View file @
a448dbf7
...
...
@@ -15,7 +15,7 @@ public class Shift {
private
LocalDateTime
shiftDate
;
private
LocalDateTime
startDate
;
private
LocalDateTime
endDate
;
private
boolean
isTemporaryShift
;
private
boolean
isTemporaryShift
=
false
;
private
int
priority
;
private
boolean
isSpecial
;
private
Integer
status
;
//0:正常班次 1:临时班次 2:维修
...
...
src/main/java/com/aps/service/Algorithm/MaterialRequirementService.java
View file @
a448dbf7
...
...
@@ -153,7 +153,7 @@ if(routingIds.size()==0)
allRequirements
.
addAll
(
result
.
getMaterialRequirements
());
childorders
.
addAll
(
result
.
getChildOrders
());
_newEntrys
.
addAll
(
result
.
getNewEntrys
());
_newMachines
.
addAll
(
result
.
getNewMachines
());
//
_newMachines.addAll(result.getNewMachines());
}
...
...
@@ -163,9 +163,9 @@ if(routingIds.size()==0)
orders
.
addAll
(
childorders
);
// _allOperations.addAll(_newEntrys);
Set
<
Long
>
existIds
=
new
HashSet
<>();
_Machines
.
addAll
(
_newMachines
.
stream
()
.
filter
(
t
->
existIds
.
add
(
t
.
getId
()))
//HashSet.add() 方法:添加成功返回 true,重复返回 false;
.
collect
(
Collectors
.
toList
()));
//
_Machines.addAll(_newMachines.stream()
//
.filter(t->existIds.add(t.getId()))//HashSet.add() 方法:添加成功返回 true,重复返回 false;
//
.collect(Collectors.toList()));
}
...
...
@@ -219,7 +219,7 @@ if(routingIds.size()==0)
materialRequirements
.
addAll
(
operationResult
.
getMaterialRequirements
());
childorders2
.
addAll
(
operationResult
.
getChildOrders
());
_newEntrys
.
addAll
(
operationResult
.
getNewEntrys
());
_newMachines
.
addAll
(
operationResult
.
getNewMachines
());
//
_newMachines.addAll(operationResult.getNewMachines());
}
}
}
...
...
@@ -361,7 +361,7 @@ if(routingIds.size()==0)
Map
<
Integer
,
Object
>
list
=
_routingDataService
.
CreateEntry
(
sceneId
,
ProdEquipmentList
,
ProdLaunchOrders
,
routingDiscreteParams
,
ProdOrderProcesslist
,
processExecList
,
_entryRel
);
List
<
Machine
>
machines
=
_routingDataService
.
InitCalendarToAllMachines
(
sceneId
,
ProdEquipmentList
,
machineScheduler
,
globalParam
.
isIsUseCalendar
());
//
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(sceneId,ProdEquipmentList,machineScheduler, globalParam.isIsUseCalendar());
if
(
list
.
get
(
1
)!=
null
)
...
...
@@ -371,7 +371,7 @@ if(routingIds.size()==0)
}
Map
<
Integer
,
Object
>
rest
=
new
HashMap
<>();
rest
.
put
(
1
,
list
.
get
(
1
));
rest
.
put
(
2
,
machines
);
//
rest.put(2,machines);
return
rest
;
}
...
...
@@ -590,7 +590,7 @@ if(routingIds.size()==0)
_childorders
.
add
(
childorder
);
List
<
Entry
>
newentrys
=(
List
<
Entry
>)
list
.
get
(
1
);
_newEntrys
.
addAll
(
newentrys
);
_newMachines
.
addAll
((
List
<
Machine
>)
list
.
get
(
2
));
//
_newMachines.addAll((List<Machine>)list.get(2));
orderMaterial
.
getProductOrderID
().
add
(
childorder
.
getId
());
operation
.
getDependentOnOrderIds
().
add
(
childorder
.
getId
());
// 递归构建BOM
...
...
@@ -601,7 +601,7 @@ if(routingIds.size()==0)
materialRequirements
.
addAll
(
childResult
.
getMaterialRequirements
());
_childorders
.
addAll
(
childResult
.
getChildOrders
());
_newEntrys
.
addAll
(
childResult
.
getNewEntrys
());
_newMachines
.
addAll
(
childResult
.
getNewMachines
());
//
_newMachines.addAll(childResult.getNewMachines());
}
}
}
...
...
src/main/java/com/aps/service/Algorithm/RoutingDataService.java
View file @
a448dbf7
package
com
.
aps
.
service
.
Algorithm
;
import
com.aps.common.util.RangeSubtractUtil
;
import
com.aps.entity.*
;
import
com.aps.entity.Algorithm.DateRange
;
import
com.aps.entity.Algorithm.DependencyType
;
import
com.aps.entity.Algorithm.IDAndChildID.GroupResult
;
import
com.aps.entity.Algorithm.IDAndChildID.NodeInfo
;
...
...
@@ -57,6 +59,12 @@ public class RoutingDataService {
@Autowired
private
EquipMaintainTaskService
_equipMaintainTaskService
;
@Autowired
private
SpecialCalendarService
_specialCalendarService
;
@Autowired
private
SpecialCalendarDetailService
_specialCalendarDetailService
;
@Autowired
private
MesShiftWorkSchedService
_MesShiftWorkSchedService
;
...
...
@@ -379,7 +387,7 @@ public class RoutingDataService {
}
public
List
<
Machine
>
InitCalendarToAllMachines
(
MachineSchedulerService
machineScheduler
,
boolean
IsUseCalendar
)
{
public
List
<
Machine
>
InitCalendarToAllMachines
(
MachineSchedulerService
machineScheduler
,
boolean
IsUseCalendar
,
LocalDateTime
baseTime
)
{
// 按设备分组
...
...
@@ -391,7 +399,7 @@ public class RoutingDataService {
List
<
MesShiftWorkSched
>
MesShiftWorkScheds
=
_MesShiftWorkSchedService
.
lambdaQuery
()
.
eq
(
MesShiftWorkSched:
:
getIsdeleted
,
0
).
list
();
//
特殊日历
//
设备能力
LambdaQueryWrapper
<
EquipCapacityDef
>
EquipSpecialCalWrapper
=
new
LambdaQueryWrapper
<>();
EquipSpecialCalWrapper
.
eq
(
EquipCapacityDef:
:
getIsDeleted
,
0
);
...
...
@@ -402,9 +410,21 @@ public class RoutingDataService {
LambdaQueryWrapper
<
EquipMaintainTask
>
EquipMaintainTaskWrapper
=
new
LambdaQueryWrapper
<>();
EquipMaintainTaskWrapper
.
eq
(
EquipMaintainTask:
:
getIsdeleted
,
0
);
EquipMaintainTaskWrapper
.
eq
(
EquipMaintainTask:
:
getStatus
,
0
);
EquipMaintainTaskWrapper
.
ge
(
EquipMaintainTask:
:
getPlanFinishTime
,
baseTime
);
List
<
EquipMaintainTask
>
EquipMaintainTasks
=
_equipMaintainTaskService
.
list
(
EquipMaintainTaskWrapper
);
//特殊日历
LambdaQueryWrapper
<
SpecialCalendar
>
SpecialCalendarWrapper
=
new
LambdaQueryWrapper
<>();
SpecialCalendarWrapper
.
eq
(
SpecialCalendar:
:
getIsDeleted
,
0
);
List
<
SpecialCalendar
>
SpecialCalendars
=
_specialCalendarService
.
list
(
SpecialCalendarWrapper
);
//特殊日历
LambdaQueryWrapper
<
SpecialCalendarDetail
>
SpecialCalendarDetailWrapper
=
new
LambdaQueryWrapper
<>();
SpecialCalendarDetailWrapper
.
eq
(
SpecialCalendarDetail:
:
getIsDeleted
,
0
);
// SpecialCalendarDetailWrapper.ge(SpecialCalendarDetail::getEndTime, baseTime);
List
<
SpecialCalendarDetail
>
SpecialCalendarDetails
=
_specialCalendarDetailService
.
list
(
SpecialCalendarDetailWrapper
);
for
(
PlanResource
resource
:
PlanResources
)
{
...
...
@@ -415,7 +435,7 @@ public class RoutingDataService {
if
(!
IsUseCalendar
)
{
List
<
EquipCapacityDef
>
machineProdEquipSpecialCals
=
ProdEquipSpecialCals
.
stream
()
.
filter
(
t
->
t
.
getPlanResourceId
()
!=
null
&&
t
.
getPlanResourceId
()
==
machine
.
getId
()
&&
t
.
getReferenceType
()
==
1
)
.
filter
(
t
->
t
.
getPlanResourceId
()
!=
null
&&
t
.
getReferenceId
()
!=
null
&&
t
.
getPlanResourceId
()
==
machine
.
getId
()
&&
t
.
getReferenceType
()
==
1
)
.
collect
(
Collectors
.
toList
());
List
<
Shift
>
shifts1
=
new
ArrayList
<>();
for
(
EquipCapacityDef
machineProdEquipSpecialCal
:
machineProdEquipSpecialCals
)
{
...
...
@@ -434,29 +454,75 @@ public class RoutingDataService {
}
List
<
MesShiftWorkSched
>
ShiftWorkScheds
=
MesShiftWorkScheds
.
stream
()
.
filter
(
t
->
(
long
)
t
.
getWeekWorkSchedId
()
==
resource
.
getWorkSchedId
())
.
collect
(
Collectors
.
toList
());
List
<
Shift
>
Shifts
=
mergeShiftData
(
ShiftWorkScheds
);
for
(
Shift
shift
:
Shifts
)
{
shift
.
setMachineId
(
machine
.
getId
());
if
(
resource
.
getWorkSchedId
()!=
null
)
{
List
<
MesShiftWorkSched
>
ShiftWorkScheds
=
MesShiftWorkScheds
.
stream
()
.
filter
(
t
->
(
long
)
t
.
getWeekWorkSchedId
()
==
resource
.
getWorkSchedId
())
.
collect
(
Collectors
.
toList
());
List
<
Shift
>
Shifts
=
mergeShiftData
(
ShiftWorkScheds
);
for
(
Shift
shift
:
Shifts
)
{
shift
.
setMachineId
(
machine
.
getId
());
shift
.
setStartDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
shift
.
setEndDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
shifts1
.
add
(
shift
);
}
}
else
{
Shift
shift
=
new
Shift
();
shift
.
setMachineId
(
machine
.
getId
());
shift
.
setStartTime
(
LocalTime
.
of
(
0
,
0
,
0
));
shift
.
setEndTime
(
LocalTime
.
of
(
23
,
59
,
59
));
HashSet
days
=
new
HashSet
<>();
days
.
add
(
1
);
days
.
add
(
2
);
days
.
add
(
3
);
days
.
add
(
4
);
days
.
add
(
5
);
days
.
add
(
6
);
days
.
add
(
0
);
shift
.
setDays
(
days
);
shift
.
setStartDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
shift
.
setEndDate
(
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
));
shifts1
.
add
(
shift
);
}
machine
.
setShifts
(
shifts1
);
//加班
List
<
EquipCapacityDef
>
machineProdEquipSpecialCals2
=
ProdEquipSpecialCals
.
stream
()
.
filter
(
t
->
t
.
getPlanResourceId
()
!=
null
&&
t
.
getPlanResourceId
()
==
machine
.
getId
()
&&
t
.
getReferenceType
()
==
3
)
.
collect
(
Collectors
.
toList
());
List
<
DateRange
>
shifts2
=
new
ArrayList
<>();
for
(
EquipCapacityDef
machineProdEquipSpecialCal
:
machineProdEquipSpecialCals2
)
{
List
<
SpecialCalendarDetail
>
SpecialCalendarDetails1
=
SpecialCalendarDetails
.
stream
()
.
filter
(
t
->
(
long
)
t
.
getSpecialCalendarId
()
==
machineProdEquipSpecialCal
.
getReferenceId
())
.
collect
(
Collectors
.
toList
());
for
(
SpecialCalendarDetail
cald
:
SpecialCalendarDetails1
)
{
DateRange
shift
=
new
DateRange
(
cald
.
getStartTime
(),
cald
.
getEndTime
());
shifts2
.
add
(
shift
);
}
}
List
<
EquipCapacityDef
>
Holidays
=
ProdEquipSpecialCals
.
stream
()
.
filter
(
t
->
t
.
getPlanResourceId
()
!=
null
&&
t
.
getPlanResourceId
()
==
machine
.
getId
()
&&
t
.
getReferenceType
()
==
2
)
.
collect
(
Collectors
.
toList
());
List
<
Holiday
>
Holidays1
=
new
ArrayList
<>();
List
<
DateRange
>
shifts3
=
new
ArrayList
<>();
for
(
EquipCapacityDef
machineProdEquipSpecialCal
:
Holidays
)
{
DateRange
shift
=
new
DateRange
(
machineProdEquipSpecialCal
.
getEffectiveStartTime
(),
machineProdEquipSpecialCal
.
getEffectiveEndTime
());
shifts3
.
add
(
shift
);
}
List
<
DateRange
>
Holidaysn
=
RangeSubtractUtil
.
getNonOverlappingRanges
(
shifts3
,
shifts2
);
List
<
Holiday
>
Holidays1
=
new
ArrayList
<>();
for
(
DateRange
cal
:
Holidaysn
)
{
Holiday
holiday
=
new
Holiday
();
holiday
.
setStart
(
machineProdEquipSpecialCal
.
getEffectiveStartTim
e
());
holiday
.
setEnd
(
machineProdEquipSpecialCal
.
getEffectiveEndTim
e
());
holiday
.
setStart
(
cal
.
getStartDat
e
());
holiday
.
setEnd
(
cal
.
getEndDat
e
());
Holidays1
.
add
(
holiday
);
}
machine
.
setHolidays
(
Holidays1
);
...
...
@@ -499,31 +565,9 @@ public class RoutingDataService {
}
machines
.
add
(
machine
);
}
//节假日
// List<MesHoliday> holidays= _MesHolidayService.list();
if
(
IsUseCalendar
)
{
if
(
machines
==
null
)
{
return
null
;
}
for
(
Machine
machine
:
machines
)
{
// 确保维护窗口列表不为null
if
(
machine
.
getMaintenanceWindows
()
==
null
)
{
machine
.
setMaintenanceWindows
(
new
ArrayList
<>());
}
}
}
// 4. 初始化机器时间线
for
(
Machine
machine
:
machines
)
{
MachineTimeline
timeline
=
machineScheduler
.
getOrCreateTimeline
(
machine
);
...
...
@@ -534,6 +578,7 @@ public class RoutingDataService {
}
/**
* 合并重复的ShiftData,将serialNumber收集为列表
* @param originalList 原始数据列表
...
...
src/main/java/com/aps/service/Algorithm/ScheduleOperationService.java
View file @
a448dbf7
...
...
@@ -4,10 +4,7 @@ import com.aps.common.util.ProductionDeepCopyUtil;
import
com.aps.entity.Algorithm.*
;
import
com.aps.entity.Algorithm.IDAndChildID.GroupResult
;
import
com.aps.entity.Algorithm.IDAndChildID.NodeInfo
;
import
com.aps.entity.basic.Entry
;
import
com.aps.entity.basic.GlobalParam
;
import
com.aps.entity.basic.MachineOption
;
import
com.aps.entity.basic.Order
;
import
com.aps.entity.basic.*
;
import
com.aps.service.plan.MachineSchedulerService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.context.annotation.ScopeMetadata
;
...
...
@@ -145,7 +142,81 @@ Integer newMachineId1=newMachineId.intValue();
}
public
void
SpiltOperation
(
Chromosome
chromosome
,
int
opId
,
Double
[]
splitCounts
,
GlobalParam
globalParam
)
/**
* 增加设备维修保养
* @param chromosome 染色体对象
*/
public
void
AddMaintenanceWindow
(
Chromosome
chromosome
,
Long
machineId
,
MaintenanceWindow
maintenanceWindow
,
GlobalParam
globalParam
)
{
Machine
machine
=
chromosome
.
getMachines
().
stream
().
filter
(
t
->
t
.
getId
()==
machineId
)
.
findFirst
().
orElse
(
null
);
if
(
machine
!=
null
)
{
maintenanceWindow
.
setId
(
UUID
.
randomUUID
().
toString
());
machine
.
getMaintenanceWindows
().
add
(
maintenanceWindow
);
}
else
{
throw
new
RuntimeException
(
"未找到设备"
);
}
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
}
public
List
<
MaintenanceWindow
>
GetMaintenanceWindow
(
Chromosome
chromosome
,
Long
machineId
)
{
if
(
machineId
==
0
)
{
return
chromosome
.
getMachines
().
stream
()
// 过滤掉null的机器对象
.
filter
(
machine
->
machine
!=
null
)
// 过滤掉维护窗口为null的机器(避免后续空指针)
.
filter
(
machine
->
machine
.
getMaintenanceWindows
()
!=
null
)
// 提取维护窗口列表(此时流是 Stream<List<MaintenanceWindow>>)
.
map
(
Machine:
:
getMaintenanceWindows
)
// 扁平化为 Stream<MaintenanceWindow>(核心:将嵌套列表“拍平”)
.
flatMap
(
List:
:
stream
)
// 收集为最终的List结果
.
collect
(
Collectors
.
toList
());
}
Machine
machine
=
chromosome
.
getMachines
().
stream
().
filter
(
t
->
t
.
getId
()==
machineId
)
.
findFirst
().
orElse
(
null
);
if
(
machine
!=
null
)
{
return
machine
.
getMaintenanceWindows
();
}
else
{
throw
new
RuntimeException
(
"未找到设备"
);
}
}
public
void
DelMaintenanceWindow
(
Chromosome
chromosome
,
Long
machineId
,
String
maintenanceId
,
GlobalParam
globalParam
)
{
Machine
machine
=
chromosome
.
getMachines
().
stream
().
filter
(
t
->
t
.
getId
()==
machineId
)
.
findFirst
().
orElse
(
null
);
if
(
machine
!=
null
)
{
List
<
MaintenanceWindow
>
maintenanceWindows
=
machine
.
getMaintenanceWindows
();
OptionalInt
index
=
IntStream
.
range
(
0
,
maintenanceWindows
.
size
())
.
filter
(
i
->
maintenanceId
.
equals
(
maintenanceWindows
.
get
(
i
).
getId
()))
.
findFirst
();
machine
.
getMaintenanceWindows
().
remove
(
index
);
}
else
{
throw
new
RuntimeException
(
"未找到设备"
);
}
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
}
public
void
SpiltOperation
(
Chromosome
chromosome
,
int
opId
,
Double
[]
splitCounts
,
GlobalParam
globalParam
)
{
List
<
Entry
>
allOperations
=
chromosome
.
getAllOperations
();
...
...
src/main/java/com/aps/service/plan/PlanResultService.java
View file @
a448dbf7
...
...
@@ -320,6 +320,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
.
eq
(
ProdLaunchOrder:
:
getSceneId
,
SceneId
)
.
list
();
GlobalParam
globalParam
=
InitGlobalParam
();
// 3. 创建调度服务
MachineSchedulerService
machineScheduler
=
new
MachineSchedulerService
(
param
.
getBaseTime
());
...
...
@@ -521,17 +522,65 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
return
chromosome
;
}
public
Chromosome
AddMaintenanceWindow
(
String
SceneId
,
Long
machineId
,
MaintenanceWindow
maintenanceWindow
)
{
GlobalParam
globalParam
=
new
GlobalParam
();
Chromosome
chromosome
=
_sceneService
.
loadChromosomeFromFile
(
SceneId
);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
ScheduleOperation
.
AddMaintenanceWindow
(
chromosome
,
machineId
,
maintenanceWindow
,
globalParam
);
// WriteScheduleSummary(chromosome);
_sceneService
.
saveChromosomeToFile
(
chromosome
,
SceneId
);
return
chromosome
;
}
public
Chromosome
DelMaintenanceWindow
(
String
SceneId
,
Long
machineId
,
String
maintenanceId
)
{
GlobalParam
globalParam
=
new
GlobalParam
();
Chromosome
chromosome
=
_sceneService
.
loadChromosomeFromFile
(
SceneId
);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
ScheduleOperation
.
DelMaintenanceWindow
(
chromosome
,
machineId
,
maintenanceId
,
globalParam
);
// WriteScheduleSummary(chromosome);
_sceneService
.
saveChromosomeToFile
(
chromosome
,
SceneId
);
return
chromosome
;
}
public
List
<
MaintenanceWindow
>
GetMaintenanceWindow
(
String
SceneId
,
Long
machineId
,
MaintenanceWindow
maintenanceWindow
)
{
GlobalParam
globalParam
=
new
GlobalParam
();
Chromosome
chromosome
=
_sceneService
.
loadChromosomeFromFile
(
SceneId
);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
public
Chromosome
schedule
(
String
SceneId
)
{
List
<
MaintenanceWindow
>
maintenanceWindowList
=
ScheduleOperation
.
GetMaintenanceWindow
(
chromosome
,
machineId
);
// WriteScheduleSummary(chromosome);
return
maintenanceWindowList
;
}
public
Chromosome
schedule
(
String
SceneId
)
{
try
{
ScheduleParams
param
=
InitScheduleParams
();
...
...
@@ -699,12 +748,43 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// 按设备分组
FileHelper
.
writeLogFile
(
"初始化设备日历-----------开始-------"
);
List
<
Machine
>
machines
=
_routingDataService
.
InitCalendarToAllMachines
(
SceneId
,
ProdEquipments
,
machineScheduler
,
IsUseCalendar
);
// List<Machine> machines = _routingDataService.InitCalendarToAllMachines(SceneId, ProdEquipments, machineScheduler, IsUseCalendar);
List
<
Machine
>
machines
=
(
List
<
Machine
>)
GlobalCacheUtil
.
get
(
"machines"
);
if
(
machines
!=
null
)
{
return
machines
;
}
machines
=
(
List
<
Machine
>)
redisUtils
.
get
(
"machines"
);
if
(
machines
!=
null
)
{
return
machines
;
}
machines
=
InitCalendarToAllMachines
();
FileHelper
.
writeLogFile
(
"初始化设备日历-----------结束-------"
);
GlobalCacheUtil
.
put
(
"machines"
,
machines
,
10
,
TimeUnit
.
MINUTES
);
return
machines
;
}
return
machines
;
public
List
<
Machine
>
InitCalendarToAllMachines
()
{
FileHelper
.
writeLogFile
(
"初始化Redis设备日历-----------开始-------"
);
GlobalParam
globalParam
=
InitGlobalParam
();
ScheduleParams
param
=
InitScheduleParams
();
MachineSchedulerService
machineScheduler
=
new
MachineSchedulerService
(
param
.
getBaseTime
());
List
<
Machine
>
machines
=
_routingDataService
.
InitCalendarToAllMachines
(
machineScheduler
,
globalParam
.
isIsUseCalendar
(),
param
.
getBaseTime
());
redisUtils
.
set
(
"machines"
,
machines
);
FileHelper
.
writeLogFile
(
"初始化Redis设备日历-----------结束-------"
);
return
machines
;
}
private
ScheduleParams
InitScheduleParams
()
...
...
src/main/resources/application.yml
View file @
a448dbf7
...
...
@@ -37,7 +37,7 @@ spring:
# Oracle数据源
oracle
:
driver-class-name
:
oracle.jdbc.OracleDriver
url
:
jdbc:oracle:thin:@//
192.168.0.181:152
2/ORCLPDB1
# ORCL为你的Oracle实例名
url
:
jdbc:oracle:thin:@//
39.100.78.207:700
2/ORCLPDB1
# ORCL为你的Oracle实例名
username
:
mes
# 替换为你的Oracle用户名
password
:
root_mes123456
# 替换为你的Oracle密码
# sqlserver:
...
...
src/test/java/com/aps/demo/PlanResultServiceTest.java
View file @
a448dbf7
package
com
.
aps
.
demo
;
import
com.aps.ApsApplication
;
import
com.aps.common.util.RangeSubtractUtil
;
import
com.aps.entity.Algorithm.Chromosome
;
import
com.aps.entity.Gantt.ProductGanttVO
;
import
com.aps.entity.basic.Machine
;
...
...
@@ -26,6 +27,8 @@ public class PlanResultServiceTest {
@Test
public
void
testExecute
()
{
// planResultService.getMaterials();
// RangeSubtractUtil.test();
planResultService
.
execute2
(
"8835EF6E1C8A491D99B16DE59160ED64"
);
// planResultService.execute2("BE037838EF074B07B87D7DE763107398");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11);
...
...
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