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
d1891608
Commit
d1891608
authored
Jan 15, 2026
by
Tong Li
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
138726ae
bc3adbc4
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
597 additions
and
29 deletions
+597
-29
SwaggerMapParamConfig.java
src/main/java/com/aps/config/SwaggerMapParamConfig.java
+0
-5
ChromosomeDataController.java
...a/com/aps/controller/common/ChromosomeDataController.java
+228
-0
ResourceGanttController.java
...ava/com/aps/controller/gantt/ResourceGanttController.java
+28
-1
Entry.java
src/main/java/com/aps/entity/basic/Entry.java
+2
-2
GeneticAlgorithm.java
...main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
+9
-9
ScheduleOperationService.java
...a/com/aps/service/Algorithm/ScheduleOperationService.java
+73
-0
ChromosomeDataService.java
...in/java/com/aps/service/common/ChromosomeDataService.java
+150
-5
PlanResultService.java
src/main/java/com/aps/service/plan/PlanResultService.java
+107
-7
No files found.
src/main/java/com/aps/config/SwaggerMapParamConfig.java
View file @
d1891608
...
...
@@ -380,11 +380,6 @@ public class SwaggerMapParamConfig {
examples
.
put
(
"订单更新示例"
,
createExample
(
"更新订单数据"
,
"{\n"
+
" \"sceneId\": \"SCENE001\",\n"
+
" \"data\": {\n"
+
" \"id\": \"123\",\n"
+
" \"name\": \"updated name\"\n"
+
" }\n"
+
"}"
));
break
;
...
...
src/main/java/com/aps/controller/common/ChromosomeDataController.java
View file @
d1891608
package
com
.
aps
.
controller
.
common
;
import
com.aps.common.util.R
;
import
com.aps.entity.Algorithm.Chromosome
;
import
com.aps.entity.basic.Entry
;
import
com.aps.entity.basic.MachineOption
;
import
com.aps.entity.common.Paged
;
import
com.aps.service.common.ChromosomeDataService
;
import
com.aps.service.plan.PlanResultService
;
import
com.aps.service.plan.SceneService
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.Parameter
;
import
io.swagger.v3.oas.annotations.tags.Tag
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -18,6 +27,10 @@ public class ChromosomeDataController {
@Autowired
private
ChromosomeDataService
chromosomeDataService
;
@Autowired
private
SceneService
sceneService
;
@Autowired
private
PlanResultService
planResultService
;
/**
* 通用接口,根据实体名称查询Chromosome中的数据,支持分页和条件过滤
...
...
@@ -122,7 +135,222 @@ public class ChromosomeDataController {
}
/**
* 通用接口,根据实体名称更新Chromosome中的数据
* 支持文件实体(通过sceneId)和数据库实体的更新
* 示例:
* - 文件实体: PUT /queryChromosome/order/update?sceneId=xxx
* Body: { "id": 123, "fieldName": "newValue", ... }
* - 数据库实体: PUT /queryChromosome/user/update
* Body: { "id": 123, "fieldName": "newValue", ... }
*
* @param sceneId 场景ID (文件实体必需,数据库实体可选)
* @param entityName 实体名称
* @param data 要更新的数据 (必须包含id字段)
* @return 更新结果
*/
@PostMapping
(
"/{entityName}/update"
)
@Operation
(
summary
=
"更新实体数据"
,
description
=
"根据实体名称和ID更新数据,支持文件实体和数据库实体"
)
public
R
<
String
>
updateChromosomeData
(
@Parameter
(
description
=
"场景ID (文件实体必需,数据库实体可选)"
,
required
=
false
)
@RequestParam
(
required
=
false
)
String
sceneId
,
@Parameter
(
description
=
"taskID (文件实体必需,数据库实体可选)"
,
required
=
false
)
@RequestParam
(
required
=
false
)
String
taskId
,
@Parameter
(
description
=
"实体名称"
,
required
=
true
)
@PathVariable
String
entityName
,
@Parameter
(
description
=
"要更新的数据 (必须包含id字段)"
,
required
=
true
)
@RequestBody
Map
<
String
,
Object
>
data
)
{
// 文件实体必须要有sceneId
if
(
isFileEntity
(
entityName
)
&&
(
sceneId
==
null
||
sceneId
.
isEmpty
()))
{
return
R
.
failed
(
"文件实体更新时sceneId不能为空"
);
}
if
(
entityName
.
equalsIgnoreCase
(
"machineOption"
)){
return
updateMachineOption
(
sceneId
,
taskId
,
data
);
}
try
{
boolean
success
=
chromosomeDataService
.
updateChromosomeData
(
sceneId
,
entityName
,
data
);
if
(
success
)
{
return
R
.
ok
(
"更新成功"
);
}
else
{
return
R
.
failed
(
"更新失败"
);
}
}
catch
(
Exception
e
)
{
return
R
.
failed
(
"更新失败: "
+
e
.
getMessage
());
}
}
private
R
<
String
>
updateMachineOption
(
String
sceneId
,
String
taskId
,
Map
<
String
,
Object
>
data
)
{
// 验证taskId不能为空
if
(
taskId
==
null
||
taskId
.
isEmpty
())
{
return
R
.
failed
(
"更新machineOption时taskId不能为空"
);
}
try
{
// 1. 加载Chromosome对象
Chromosome
chromosome
=
sceneService
.
loadChromosomeFromFile
(
sceneId
);
if
(
chromosome
==
null
)
{
return
R
.
failed
(
"未找到场景ID为 "
+
sceneId
+
" 的Chromosome数据"
);
}
// 2. 根据taskId找到对应的entry
Entry
targetEntry
=
null
;
for
(
Entry
entry
:
chromosome
.
getAllOperations
())
{
if
(
String
.
valueOf
(
entry
.
getId
()).
equals
(
taskId
))
{
targetEntry
=
entry
;
break
;
}
}
if
(
targetEntry
==
null
)
{
return
R
.
failed
(
"未找到taskId为 "
+
taskId
+
" 的entry数据"
);
}
// 3. 获取machineOption的id
String
machineOptionId
=
String
.
valueOf
(
data
.
get
(
"machineId"
));
// 4. 在entry的machineOptions列表中找到对应的machineOption
MachineOption
targetMachineOption
=
null
;
for
(
MachineOption
machineOption
:
targetEntry
.
getMachineOptions
())
{
if
(
String
.
valueOf
(
machineOption
.
getMachineId
()).
equals
(
machineOptionId
))
{
targetMachineOption
=
machineOption
;
break
;
}
}
if
(
targetMachineOption
==
null
)
{
return
R
.
failed
(
"未找到id为 "
+
machineOptionId
+
" 的machineOption数据"
);
}
// 5. 更新machineOption的字段
ObjectMapper
objectMapper
=
new
ObjectMapper
();
MachineOption
updatedMachineOption
=
objectMapper
.
convertValue
(
data
,
MachineOption
.
class
);
// 6. 替换原来的machineOption
int
index
=
targetEntry
.
getMachineOptions
().
indexOf
(
targetMachineOption
);
targetEntry
.
getMachineOptions
().
set
(
index
,
updatedMachineOption
);
planResultService
.
editMachine
(
chromosome
,
sceneId
,
targetEntry
);
// 7. 保存更新后的Chromosome
boolean
saved
=
sceneService
.
saveChromosomeToFile
(
chromosome
,
sceneId
);
if
(
saved
)
{
return
R
.
ok
(
"更新成功"
);
}
else
{
return
R
.
failed
(
"更新失败"
);
}
}
catch
(
Exception
e
)
{
return
R
.
failed
(
"更新machineOption失败: "
+
e
.
getMessage
());
}
}
/**
* 同一entry下的多个machineOption更新
*/
private
R
<
String
>
updateMultipleMachineOptionsInEntry
(
String
sceneId
,
String
taskId
,
Map
<
String
,
Object
>
data
)
{
try
{
// 1. 加载Chromosome对象
Chromosome
chromosome
=
sceneService
.
loadChromosomeFromFile
(
sceneId
);
if
(
chromosome
==
null
)
{
return
R
.
failed
(
"未找到场景ID为 "
+
sceneId
+
" 的Chromosome数据"
);
}
// 2. 根据taskId找到对应的entry
Entry
targetEntry
=
null
;
for
(
Entry
entry
:
chromosome
.
getAllOperations
())
{
if
(
String
.
valueOf
(
entry
.
getId
()).
equals
(
taskId
))
{
targetEntry
=
entry
;
break
;
}
}
if
(
targetEntry
==
null
)
{
return
R
.
failed
(
"未找到taskId为 "
+
taskId
+
" 的entry数据"
);
}
// 3. 获取machineOptions列表
Object
machineOptionsObj
=
data
.
get
(
"machineOptions"
);
if
(!(
machineOptionsObj
instanceof
List
))
{
return
R
.
failed
(
"machineOptions必须是数组格式"
);
}
List
<?>
machineOptionsList
=
(
List
<?>)
machineOptionsObj
;
if
(
machineOptionsList
.
isEmpty
())
{
return
R
.
failed
(
"machineOptions数组不能为空"
);
}
// 4. 更新当前entry下的所有machineOption
ObjectMapper
objectMapper
=
new
ObjectMapper
();
boolean
allSuccess
=
true
;
List
<
String
>
errorMessages
=
new
ArrayList
<>();
for
(
Object
optionObj
:
machineOptionsList
)
{
if
(!(
optionObj
instanceof
Map
))
{
allSuccess
=
false
;
errorMessages
.
add
(
"machineOptions中的元素必须是对象格式"
);
continue
;
}
Map
<
String
,
Object
>
optionMap
=
(
Map
<
String
,
Object
>)
optionObj
;
// 获取machineOption的machineId
String
machineOptionId
=
String
.
valueOf
(
optionMap
.
get
(
"machineId"
));
if
(
machineOptionId
==
null
)
{
allSuccess
=
false
;
errorMessages
.
add
(
"machineOption必须包含machineId字段"
);
continue
;
}
// 在entry的machineOptions列表中找到对应的machineOption
MachineOption
targetMachineOption
=
null
;
for
(
MachineOption
machineOption
:
targetEntry
.
getMachineOptions
())
{
if
(
String
.
valueOf
(
machineOption
.
getMachineId
()).
equals
(
machineOptionId
))
{
targetMachineOption
=
machineOption
;
break
;
}
}
if
(
targetMachineOption
==
null
)
{
allSuccess
=
false
;
errorMessages
.
add
(
"未找到machineId为 "
+
machineOptionId
+
" 的machineOption数据"
);
continue
;
}
// 更新machineOption的字段
MachineOption
updatedMachineOption
=
objectMapper
.
convertValue
(
optionMap
,
MachineOption
.
class
);
// 替换原来的machineOption
int
index
=
targetEntry
.
getMachineOptions
().
indexOf
(
targetMachineOption
);
targetEntry
.
getMachineOptions
().
set
(
index
,
updatedMachineOption
);
}
if
(!
allSuccess
)
{
return
R
.
failed
(
"部分更新失败: "
+
String
.
join
(
"; "
,
errorMessages
));
}
// 5. 调用editMachine方法处理entry更新
planResultService
.
editMachine
(
chromosome
,
sceneId
,
targetEntry
);
// 6. 保存更新后的Chromosome
boolean
saved
=
sceneService
.
saveChromosomeToFile
(
chromosome
,
sceneId
);
if
(
saved
)
{
return
R
.
ok
(
"批量更新成功"
);
}
else
{
return
R
.
failed
(
"批量更新失败: 保存Chromosome数据失败"
);
}
}
catch
(
Exception
e
)
{
return
R
.
failed
(
"批量更新machineOption失败: "
+
e
.
getMessage
());
}
}
/**
* 判断是否为文件实体
*/
...
...
src/main/java/com/aps/controller/gantt/ResourceGanttController.java
View file @
d1891608
...
...
@@ -252,7 +252,7 @@ public class ResourceGanttController {
@PostMapping
(
"/
operationEdit
"
)
@PostMapping
(
"/
editOperation
"
)
@Operation
(
summary
=
"修改工单"
,
description
=
"修改工单"
)
public
R
<
Chromosome
>
operationEdit
(
@RequestBody
Map
<
String
,
Object
>
params
)
{
log
.
info
(
"operationEdit 请求参数: {}"
,
params
);
...
...
@@ -267,6 +267,33 @@ public class ResourceGanttController {
return
R
.
ok
(
result
);
}
@PostMapping
(
"/editMachineOption"
)
@Operation
(
summary
=
"修改机器选项"
,
description
=
"修改工序的机器选项"
,
requestBody
=
@io
.
swagger
.
v3
.
oas
.
annotations
.
parameters
.
RequestBody
(
description
=
"修改机器选项参数"
,
content
=
@io
.
swagger
.
v3
.
oas
.
annotations
.
media
.
Content
(
mediaType
=
"application/json"
,
examples
=
@io
.
swagger
.
v3
.
oas
.
annotations
.
media
.
ExampleObject
(
name
=
"修改机器选项示例"
,
value
=
"{\n \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n \"entry\": {\n \"id\": 1,\n \"groupId\": 1,\n \"sequence\": 1,\n \"orderId\": \"ORDER001\",\n \"orderCode\": \"订单编号\",\n \"productId\": 1,\n \"productName\": \"产品名称\",\n \"productCode\": \"产品编号\",\n \"routingId\": 1,\n \"routingDetailId\": 1,\n \"execId\": \"EXEC001\",\n \"orderId\": \"ORDER001\",\n \"orderCode\": \"订单编号\",\n \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n \"mainId\": \"MAIN001\",\n \"priority\": 1,\n \"quantity\": 100,\n \"sequence\": 1,\n \"machineOptions\": [],\n \"selectMachineID\": 1,\n \"prevEntryIds\": [],\n \"nextEntryIds\": [],\n \"state\": 1,\n \"isInterrupt\": 1,\n \"materialRequirements\": []\n },\n \"newMachineId\": 123\n}"
)
)
)
)
public
R
<
Chromosome
>
editMachineOption
(
@RequestBody
Map
<
String
,
Object
>
params
)
{
log
.
info
(
"editMachineOption 请求参数: {}"
,
params
);
String
sceneId
=
ParamValidator
.
getString
(
params
,
"sceneId"
,
"场景ID"
);
ParamValidator
.
validateSceneExists
(
sceneService
,
sceneId
);
// 使用BeanUtil转换LinkedHashMap为Entry对象
Entry
entry
=
BeanUtil
.
toBean
(
params
.
get
(
"entry"
),
Entry
.
class
);
Long
newMachineId
=
ParamValidator
.
getLong
(
params
,
"newMachineId"
,
"新机器ID"
);
Chromosome
result
=
planResultService
.
editMachineOption
(
sceneId
,
entry
,
newMachineId
);
return
R
.
ok
(
result
);
}
@PostMapping
(
"/changebasetime"
)
@Operation
(
summary
=
"修改基础时间"
,
description
=
"修改基础时间"
)
public
R
<
String
>
changeBaseTime
(
@RequestBody
Map
<
String
,
Object
>
params
)
{
...
...
src/main/java/com/aps/entity/basic/Entry.java
View file @
d1891608
...
...
@@ -78,12 +78,12 @@ public class Entry {
/**
* 可选设备列表
*/
p
ublic
List
<
MachineOption
>
MachineOptions
;
p
rivate
List
<
MachineOption
>
MachineOptions
;
/**
* 选择的设备
*/
p
ublic
Long
SelectMachineID
;
p
rivate
Long
SelectMachineID
;
/**
* 前工单ID
...
...
src/main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
View file @
d1891608
...
...
@@ -298,15 +298,15 @@ return population;
population
=
population
.
stream
()
.
collect
(
Collectors
.
toMap
(
Chromosome:
:
getGeneStr
,
// key:去重的字段(GeneStr)
u
->
u
,
// value:Chromosome对象
(
u1
,
u2
)
->
u1
// 重复时保留第一个元素
))
.
values
()
// 获取去重后的
.
stream
()
.
collect
(
Collectors
.
toList
());
//
population = population.stream()
//
.collect(Collectors.toMap(
//
Chromosome::getGeneStr, // key:去重的字段(GeneStr)
//
u -> u, // value:Chromosome对象
//
(u1, u2) -> u1 // 重复时保留第一个元素
//
))
//
.values() // 获取去重后的
//
.stream()
//
.collect(Collectors.toList());
return
population
;
}
...
...
src/main/java/com/aps/service/Algorithm/ScheduleOperationService.java
View file @
d1891608
...
...
@@ -1035,4 +1035,77 @@ if(targetOp.getSequence()>1) {
// }
}
public
void
editMachineOption
(
Chromosome
chromosome
,
Entry
operation
,
Long
newMachineId
,
GlobalParam
globalParam
)
{
List
<
Entry
>
allOperations
=
chromosome
.
getAllOperations
();
Map
<
Integer
,
Integer
>
opTimeMap
=
chromosome
.
getResult
().
stream
()
.
collect
(
Collectors
.
toMap
(
GAScheduleResult:
:
getOperationId
,
r
->
r
.
getStartTime
()
));
Integer
newMachineId1
=
newMachineId
.
intValue
();
int
opId
=
operation
.
getId
();
// 获取目标结果和工序
GAScheduleResult
targetResult
=
chromosome
.
getResult
().
stream
()
.
filter
(
r
->
r
.
getOperationId
()
==
opId
)
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
Entry
targetOp
=
allOperations
.
stream
()
.
filter
(
o
->
o
.
getId
()
==
opId
)
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
if
(
newMachineId1
!=
0
)
{
int
machineOptionIndex
=
targetOp
.
getMachineOptions
().
stream
()
.
map
(
MachineOption:
:
getMachineId
)
.
collect
(
Collectors
.
toList
())
.
indexOf
(
newMachineId
)
+
1
;
if
(
machineOptionIndex
==
0
)
{
throw
new
NoSuchElementException
(
"Machine not found: "
+
newMachineId
);
}
// 更新设备选择序列
int
globalOpIndex
=
chromosome
.
getGlobalOpList
().
stream
()
.
filter
(
g
->
g
.
getOp
().
getId
()
==
opId
)
.
findFirst
()
.
map
(
GlobalOperationInfo:
:
getGlobalOpId
)
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Global operation not found: "
+
opId
));
chromosome
.
getMachineSelection
().
set
(
globalOpIndex
,
machineOptionIndex
);
targetResult
.
setForcedMachineId
(
newMachineId
);
}
List
<
Integer
>
operationSequencing
=
allOperations
.
stream
()
.
sorted
((
op1
,
op2
)
->
{
int
time1
=
opTimeMap
.
getOrDefault
(
op1
.
getId
(),
Integer
.
MAX_VALUE
);
int
time2
=
opTimeMap
.
getOrDefault
(
op2
.
getId
(),
Integer
.
MAX_VALUE
);
if
(
time1
!=
time2
)
{
return
Integer
.
compare
(
time1
,
time2
);
}
else
{
return
Integer
.
compare
(
op1
.
getSequence
(),
op2
.
getSequence
());
}
})
.
map
(
Entry:
:
getGroupId
)
.
collect
(
Collectors
.
toList
());
chromosome
.
setOperationSequencing
(
operationSequencing
);
// 重新解码
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
}
}
src/main/java/com/aps/service/common/ChromosomeDataService.java
View file @
d1891608
package
com
.
aps
.
service
.
common
;
import
cn.hutool.core.bean.BeanUtil
;
import
com.aps.entity.Algorithm.Chromosome
;
import
com.aps.entity.ProdProcessExec
;
import
com.aps.entity.basic.Entry
;
import
com.aps.entity.basic.MachineOption
;
import
com.aps.entity.basic.Order
;
import
com.aps.entity.common.*
;
import
com.aps.service.plan.PlanResultService
;
import
com.aps.service.plan.SceneService
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.SerializationFeature
;
import
com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.core.namedparam.MapSqlParameterSource
;
import
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
...
...
@@ -24,12 +32,21 @@ public class ChromosomeDataService {
@Autowired
private
DatabaseQueryService
databaseQueryService
;
@Autowired
private
NamedParameterJdbcTemplate
namedParameterJdbcTemplate
;
@Autowired
private
Map
<
String
,
EntityConfig
>
entityConfigMap
;
@Autowired
private
PlanResultService
planResultService
;
/**
* 根据场景ID和实体名称查询Chromosome中的数据
*/
ObjectMapper
objectMapper
=
new
ObjectMapper
()
.
registerModule
(
new
JavaTimeModule
())
.
configure
(
SerializationFeature
.
WRITE_DATES_AS_TIMESTAMPS
,
false
);
public
Object
queryChromosomeData
(
String
sceneId
,
String
entityName
)
{
EntityConfig
config
=
getEntityConfig
(
entityName
);
...
...
@@ -793,14 +810,27 @@ public class ChromosomeDataService {
return
result
.
toString
();
}
/**
* 更新Chromosome中的数据(
仅支持文件
实体)
* 更新Chromosome中的数据(
支持文件实体和数据库
实体)
*/
public
boolean
updateChromosomeData
(
String
sceneId
,
String
entityName
,
Map
<
String
,
Object
>
data
)
{
EntityConfig
config
=
getEntityConfig
(
entityName
);
if
(
config
.
getDataSource
()
==
DataSourceType
.
DATABASE
)
{
throw
new
RuntimeException
(
"数据库实体暂不支持更新操作"
);
if
(
config
.
getDataSource
()
==
DataSourceType
.
FILE
)
{
if
(
"entry"
.
equalsIgnoreCase
(
entityName
))
{
convertNestedObjects
(
data
);
}
return
updateFileEntity
(
sceneId
,
entityName
,
data
);
}
else
{
// 数据库实体更新
return
updateDatabaseEntity
(
entityName
,
data
);
}
}
/**
* 更新文件实体数据
*/
private
boolean
updateFileEntity
(
String
sceneId
,
String
entityName
,
Map
<
String
,
Object
>
data
)
{
EntityConfig
config
=
getEntityConfig
(
entityName
);
// 从文件中加载Chromosome对象
Chromosome
chromosome
=
sceneService
.
loadChromosomeFromFile
(
sceneId
);
...
...
@@ -853,8 +883,36 @@ public class ChromosomeDataService {
}
}
}
else
{
// 直接更新整个字段
field
.
set
(
chromosome
,
data
);
// 如果不是列表类型或没有id字段,抛出异常提示
throw
new
RuntimeException
(
"更新文件实体时必须提供id字段以标识要更新的具体对象"
);
}
if
(
entityName
.
equals
(
"order"
))
{
chromosome
=
planResultService
.
editOrder
(
chromosome
,
sceneId
,
BeanUtil
.
toBean
(
data
,
Order
.
class
));
System
.
out
.
println
(
"test1123"
);
}
else
if
(
entityName
.
equals
(
"entry"
))
{
System
.
out
.
println
(
"5757"
);
Entry
entry
=
objectMapper
.
convertValue
(
data
,
Entry
.
class
);
// 2. 手动转换machineOptions字段
if
(
data
.
containsKey
(
"machineOptions"
))
{
List
<?>
machineOptionsList
=
(
List
<?>)
data
.
get
(
"machineOptions"
);
List
<
MachineOption
>
convertedOptions
=
new
ArrayList
<>();
for
(
Object
item
:
machineOptionsList
)
{
// 手动转换每个MachineOption对象
MachineOption
option
=
objectMapper
.
convertValue
(
item
,
MachineOption
.
class
);
convertedOptions
.
add
(
option
);
}
// 设置转换后的machineOptions
entry
.
setMachineOptions
(
convertedOptions
);
}
chromosome
=
planResultService
.
editOperation
(
chromosome
,
sceneId
,
entry
);
}
else
if
(
entityName
.
equals
(
"machineOption"
))
{
// chromosome =planResultService.editMachine(chromosome, sceneId, BeanUtil.toBean(data, MachineOption.class));
}
// 保存更新后的Chromosome到文件
...
...
@@ -865,6 +923,57 @@ public class ChromosomeDataService {
throw
new
RuntimeException
(
"访问Chromosome字段失败: "
+
e
.
getMessage
(),
e
);
}
}
/**
* 更新数据库实体数据
*/
private
boolean
updateDatabaseEntity
(
String
entityName
,
Map
<
String
,
Object
>
data
)
{
EntityConfig
config
=
getEntityConfig
(
entityName
);
String
tableName
=
config
.
getTableName
();
if
(
data
==
null
||
!
data
.
containsKey
(
"id"
))
{
throw
new
RuntimeException
(
"更新数据库实体时必须提供id字段"
);
}
String
id
=
data
.
get
(
"id"
).
toString
();
// 构建更新SQL
StringBuilder
sql
=
new
StringBuilder
();
sql
.
append
(
"UPDATE "
).
append
(
tableName
).
append
(
" SET "
);
List
<
String
>
setParts
=
new
ArrayList
<>();
MapSqlParameterSource
params
=
new
MapSqlParameterSource
();
// 遍历要更新的字段,排除id字段
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
data
.
entrySet
())
{
String
fieldName
=
entry
.
getKey
();
Object
fieldValue
=
entry
.
getValue
();
if
(!
"id"
.
equalsIgnoreCase
(
fieldName
))
{
// 将驼峰命名转换为下划线大写格式
String
dbFieldName
=
camelCaseToUnderScoreUpperCase
(
fieldName
).
toUpperCase
();
setParts
.
add
(
dbFieldName
+
" = :"
+
fieldName
);
params
.
addValue
(
fieldName
,
fieldValue
);
}
}
if
(
setParts
.
isEmpty
())
{
throw
new
RuntimeException
(
"没有有效的字段用于更新"
);
}
sql
.
append
(
String
.
join
(
", "
,
setParts
));
// 添加WHERE条件
sql
.
append
(
" WHERE ID = :idParam"
);
params
.
addValue
(
"idParam"
,
id
);
try
{
int
rowsAffected
=
namedParameterJdbcTemplate
.
update
(
sql
.
toString
(),
params
);
return
rowsAffected
>
0
;
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"数据库更新失败: "
+
e
.
getMessage
(),
e
);
}
}
/**
* 批量操作Chromosome中的数据(仅支持文件实体)
...
...
@@ -1057,6 +1166,16 @@ public class ChromosomeDataService {
field
.
set
(
obj
,
Double
.
parseDouble
(
fieldValue
.
toString
()));
}
else
if
(
fieldType
==
Boolean
.
class
||
fieldType
==
boolean
.
class
)
{
field
.
set
(
obj
,
Boolean
.
parseBoolean
(
fieldValue
.
toString
()));
}
else
if
(
fieldType
==
List
.
class
)
{
// 特殊处理List类型字段,特别是MachineOption列表
List
<?>
valueList
=
(
List
<?>)
fieldValue
;
if
(!
valueList
.
isEmpty
()
&&
valueList
.
get
(
0
)
instanceof
Map
)
{
// 如果列表中的元素是Map(如JSON反序列化结果),需要特殊处理
// 对于MachineOption这类复杂对象,我们暂时直接赋值
field
.
set
(
obj
,
fieldValue
);
}
else
{
field
.
set
(
obj
,
fieldValue
);
}
}
else
{
field
.
set
(
obj
,
fieldValue
);
}
...
...
@@ -1155,4 +1274,30 @@ public class ChromosomeDataService {
return
new
ArrayList
<>();
// 如果不是Entry类型,返回空列表
}
private
void
convertNestedObjects
(
Map
<
String
,
Object
>
data
)
{
// 转换machineOptions(支持大小写)
convertListField
(
data
,
"MachineOptions"
,
MachineOption
.
class
);
// 可以添加其他需要转换的字段
}
private
<
T
>
void
convertListField
(
Map
<
String
,
Object
>
data
,
String
fieldName
,
Class
<
T
>
targetClass
)
{
if
(
data
.
containsKey
(
fieldName
))
{
Object
fieldValue
=
data
.
get
(
fieldName
);
if
(
fieldValue
instanceof
List
)
{
List
<?>
list
=
(
List
<?>)
fieldValue
;
List
<
T
>
convertedList
=
new
ArrayList
<>();
for
(
Object
item
:
list
)
{
if
(
item
instanceof
LinkedHashMap
)
{
T
convertedItem
=
BeanUtil
.
toBean
((
Map
<?,
?>)
item
,
targetClass
);
convertedList
.
add
(
convertedItem
);
}
}
data
.
put
(
fieldName
,
convertedList
);
}
}
}
}
\ No newline at end of file
src/main/java/com/aps/service/plan/PlanResultService.java
View file @
d1891608
...
...
@@ -323,7 +323,43 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
}
public
Chromosome
editMachineOption
(
String
SceneId
,
Entry
operation
,
Long
newMachineId
)
{
Chromosome
chromosome
=
_sceneService
.
loadChromosomeFromFile
(
SceneId
);
if
(
chromosome
==
null
||
chromosome
.
getAllOperations
()
==
null
)
{
return
chromosome
;
}
List
<
Entry
>
operations
=
chromosome
.
getAllOperations
();
int
position
=
IntStream
.
range
(
0
,
operations
.
size
())
.
filter
(
i
->
operations
.
get
(
i
).
getId
()
==
operation
.
getId
())
.
findFirst
()
.
orElse
(-
1
);
if
(
position
!=
-
1
)
{
Entry
oldEntry
=
operations
.
set
(
position
,
operation
);
List
<
GlobalOperationInfo
>
globalOpList
=
chromosome
.
getGlobalOpList
();
if
(
globalOpList
!=
null
)
{
globalOpList
.
stream
()
.
filter
(
opInfo
->
opInfo
.
getOp
()
!=
null
&&
opInfo
.
getOp
().
getId
()
==
oldEntry
.
getId
())
.
forEach
(
opInfo
->
opInfo
.
setOp
(
operation
));
}
}
GlobalParam
globalParam
=
new
GlobalParam
();
// Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId);
// WriteScheduleSummary(chromosome);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
WriteScheduleSummary
(
chromosome
);
ScheduleOperation
.
editMachineOption
(
chromosome
,
operation
,
newMachineId
,
globalParam
);
WriteScheduleSummary
(
chromosome
);
_sceneService
.
saveChromosomeToFile
(
chromosome
,
SceneId
);
return
chromosome
;
}
public
Chromosome
EditOperation
(
String
SceneId
,
Entry
operation
)
{
...
...
@@ -344,12 +380,12 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
List
<
GlobalOperationInfo
>
globalOpList
=
chromosome
.
getGlobalOpList
();
if
(
globalOpList
!=
null
)
{
globalOpList
.
stream
()
.
filter
(
opInfo
->
opInfo
.
getOp
()
==
oldEntry
)
.
filter
(
opInfo
->
opInfo
.
getOp
()
!=
null
&&
opInfo
.
getOp
().
getId
()
==
oldEntry
.
getId
()
)
.
forEach
(
opInfo
->
opInfo
.
setOp
(
operation
));
}
}
return
redecodeChromosome
(
chromosome
);
// _sceneService.saveChromosomeToFile(chromosome, SceneId);
return
redecodeChromosome
(
chromosome
,
SceneId
);
}
public
Chromosome
EditOrder
(
String
SceneId
,
Order
order
)
{
...
...
@@ -373,10 +409,73 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
orderSortService
.
assignPriority
(
orders
,
rule
);
updateOrderRelatedEntries
(
chromosome
,
order
);
return
redecodeChromosome
(
chromosome
);
// _sceneService.saveChromosomeToFile(chromosome, SceneId);
return
redecodeChromosome
(
chromosome
,
SceneId
);
}
public
Chromosome
editOrder
(
Chromosome
chromosome
,
String
SceneId
,
Order
order
)
{
List
<
Order
>
orders
=
chromosome
.
getOrders
();
orderSortService
.
initializeFieldExtractors
();
OrderSortRule
rule
=
createMultiConditionRule
(
orders
);
orderSortService
.
assignPriority
(
orders
,
rule
);
updateOrderRelatedEntries
(
chromosome
,
order
);
// _sceneService.saveChromosomeToFile(chromosome, SceneId);
return
redecodeChromosome
(
chromosome
,
SceneId
);
}
public
Chromosome
editOperation
(
Chromosome
chromosome
,
String
SceneId
,
Entry
operation
)
{
List
<
GlobalOperationInfo
>
globalOpList
=
chromosome
.
getGlobalOpList
();
if
(
globalOpList
!=
null
)
{
globalOpList
.
stream
()
.
filter
(
opInfo
->
opInfo
.
getOp
()
!=
null
&&
opInfo
.
getOp
().
getId
()
==
operation
.
getId
())
.
forEach
(
opInfo
->
opInfo
.
setOp
(
operation
));
}
GlobalParam
globalParam
=
new
GlobalParam
();
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
System
.
out
.
println
(
operation
.
getSelectMachineID
());
ScheduleOperation
.
editMachineOption
(
chromosome
,
operation
,
operation
.
getSelectMachineID
(),
globalParam
);
return
redecodeChromosome
(
chromosome
,
SceneId
);
}
public
Chromosome
editMachine
(
Chromosome
chromosome
,
String
SceneId
,
Entry
operation
)
{
List
<
GlobalOperationInfo
>
globalOpList
=
chromosome
.
getGlobalOpList
();
if
(
globalOpList
!=
null
)
{
globalOpList
.
stream
()
.
filter
(
opInfo
->
opInfo
.
getOp
()
!=
null
&&
opInfo
.
getOp
().
getId
()
==
operation
.
getId
())
.
forEach
(
opInfo
->
opInfo
.
setOp
(
operation
));
}
// _sceneService.saveChromosomeToFile(chromosome, SceneId);
return
redecodeChromosome
(
chromosome
,
SceneId
);
}
/**
* 更新订单相关的所有Entry的数量和优先级
*/
...
...
@@ -408,10 +507,11 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
/**
* 重新解码染色体
*/
private
Chromosome
redecodeChromosome
(
Chromosome
chromosome
)
{
private
Chromosome
redecodeChromosome
(
Chromosome
chromosome
,
String
SceneId
)
{
GlobalParam
globalParam
=
new
GlobalParam
();
ScheduleOperationService
scheduleOperation
=
new
ScheduleOperationService
();
scheduleOperation
.
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
// _sceneService.saveChromosomeToFile(chromosome, SceneId);
return
chromosome
;
}
...
...
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