Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
yangxiujun
/
paidan_demo
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 88a79605
authored
Jul 03, 2023
by
张晓
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
批次创建增加事务支持
1 parent
a7a5faab
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
49 additions
and
32 deletions
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/Application.java
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/controller/PrepareController.java
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/BatchService.java
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/impl/BatchServiceImpl.java
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/impl/SolveServiceImpl.java
project-pre-dispatch/src/main/resources/application.yaml
project-pre-dispatch/src/main/resources/logback.xml
project-pre-dispatch/src/test/java/com/dituhui/pea/pre/BatchServiceTest.java
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/Application.java
View file @
88a7960
...
...
@@ -3,6 +3,7 @@ package com.dituhui.pea.pre;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.transaction.annotation.EnableTransactionManagement
;
/**
* @author zhangx
...
...
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/controller/PrepareController.java
View file @
88a7960
...
...
@@ -41,13 +41,14 @@ public class PrepareController {
private
SolverManager
<
VehicleRoutingSolution
,
UUID
>
solverManager
;
public
PrepareController
()
{
SolverConfig
solverConfig
=
new
SolverConfig
();
solverConfig
.
withSolutionClass
(
VehicleRoutingSolution
.
class
);
solverConfig
.
withEntityClasses
(
Vehicle
.
class
);
solverConfig
.
withConstraintProviderClass
(
VehicleRoutingConstraintProvider
.
class
);
// solverConfig.with
solverManager
=
SolverManager
.
create
(
solverConfig
,
new
SolverManagerConfig
());
solverManager
=
SolverManager
.
create
(
solverConfig
,
new
SolverManagerConfig
());
}
...
...
@@ -55,7 +56,7 @@ public class PrepareController {
/*
* 检查指定日期的小组是否有在运行的批次任务,有则返回,没有则创建后返回批次码
*/
@GetMapping
(
"/prepare/solve/{groupId}/{batchNo}"
)
@GetMapping
(
"/prepare/solve
Test
/{groupId}/{batchNo}"
)
public
Result
<?>
prepareAndSolve
(
@PathVariable
String
groupId
,
@PathVariable
String
batchNo
)
{
log
.
info
(
"prepareSolve, groupId:{}, day:{}"
,
groupId
,
batchNo
);
VehicleRoutingSolution
solution
=
solveService
.
prepareAndSolveSolution
(
groupId
,
batchNo
);
...
...
@@ -75,7 +76,7 @@ public class PrepareController {
log
.
info
(
"调用引擎处理-异步处理, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
UUID
problemId
=
solveService
.
generateProblemId
(
groupId
,
batchNo
);
// 提交问题开始求解
VehicleRoutingSolution
problem
=
solveService
.
prepareSolution
(
groupId
,
batchNo
);
VehicleRoutingSolution
problem
=
solveService
.
prepareSolution
(
groupId
,
batchNo
);
solverManager
.
solveAndListen
(
problemId
,
id
->
problem
,
this
.
prepareService
::
saveAndExtractSolution
);
...
...
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/BatchService.java
View file @
88a7960
package
com
.
dituhui
.
pea
.
pre
.
service
;
import
com.dituhui.pea.pre.entity.DispatchBatch
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.sql.SQLException
;
...
...
@@ -9,9 +10,13 @@ import java.sql.SQLException;
* <p>
* 批次排班数据准备
*/
public
interface
BatchService
{
// 检查指定日期的小组是否有在运行的批次任务,有则返回,没有则创建后返回批次码
@Transactional
String
buildBatchNo
(
String
groupId
,
String
day
)
throws
SQLException
;
...
...
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/impl/BatchServiceImpl.java
View file @
88a7960
...
...
@@ -7,14 +7,21 @@ import lombok.extern.slf4j.Slf4j;
import
org.apache.commons.dbutils.QueryRunner
;
import
org.apache.commons.dbutils.handlers.ScalarHandler
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.PlatformTransactionManager
;
import
org.springframework.transaction.TransactionStatus
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.support.DefaultTransactionDefinition
;
import
org.springframework.transaction.support.TransactionTemplate
;
import
javax.sql.DataSource
;
import
java.sql.Connection
;
import
java.sql.SQLException
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.LocalTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.List
;
import
java.util.Optional
;
...
...
@@ -34,26 +41,21 @@ public class BatchServiceImpl implements BatchService {
private
QueryRunner
queryRunner
;
@Autowired
private
JdbcTemplate
jdbcTemplate
;
public
BatchServiceImpl
(
DataSource
dataSource
)
{
this
.
queryRunner
=
new
QueryRunner
(
dataSource
);
}
// 生成最新批次日期
private
String
calcBatchDay
()
{
// 定义日期时间格式
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
String
result
=
LocalDate
.
now
().
format
(
formatter
);
return
result
;
}
// 生成最新批次号
private
String
calcBatchNo
()
{
private
String
calcBatchNo
(
String
day
)
{
// 定义日期时间格式
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"
yyyyMMdd-
HHmm"
);
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"HHmm"
);
// 将当前时间转换为字符串
String
result
=
Local
Date
Time
.
now
().
format
(
formatter
);
return
result
;
String
result
=
LocalTime
.
now
().
format
(
formatter
);
return
day
.
replaceAll
(
"-"
,
""
)
+
"-"
+
result
;
}
// 查询当前小组内已配置有中心点的技术员数量
...
...
@@ -93,19 +95,23 @@ public class BatchServiceImpl implements BatchService {
@Transactional
@Override
public
String
buildBatchNo
(
String
groupId
,
String
day
)
throws
SQLException
{
public
String
buildBatchNo
(
String
groupId
,
String
day
)
{
log
.
info
(
"准备批次数据, groupId:{}, day:{}"
,
groupId
,
day
);
String
batchNo
=
""
;
String
batchDay
=
""
;
Optional
<
DispatchBatch
>
optional
=
batchRepository
.
findByGroupIdAndBatchDate
(
groupId
,
day
);
if
(!
optional
.
isPresent
())
{
batchNo
=
calcBatchNo
();
batchDay
=
calcBatchDay
()
;
batchNo
=
calcBatchNo
(
day
);
batchDay
=
day
;
// 执行数据库操作
String
sqlInsert
=
"INSERT INTO `dispatch_batch` ( `group_id`, `batch_no`, `batch_date`, `engineer_num`, `order_num`, `start_time`, `end_time`, `status`) "
+
" VALUES(?, ?, ?, ?, ?, ?, ?, ?)"
;
queryRunner
.
execute
(
sqlInsert
,
groupId
,
batchNo
,
batchDay
,
0
,
0
,
LocalDateTime
.
now
(),
null
,
"RUNNING"
);
log
.
info
(
"生成新批次, groupId:{}, day:{}"
,
groupId
,
day
);
jdbcTemplate
.
update
(
sqlInsert
,
groupId
,
batchNo
,
batchDay
,
0
,
0
,
LocalDateTime
.
now
(),
null
,
"RUNNING"
);
// queryRunner.execute(sqlInsert, groupId, batchNo, batchDay, 0, 0, LocalDateTime.now(), null, "RUNNING");
log
.
info
(
"生成新批次, groupId:{}, day:{}"
,
groupId
,
batchDay
);
}
else
{
batchNo
=
optional
.
get
().
getBatchNo
();
batchDay
=
optional
.
get
().
getBatchDate
();
...
...
@@ -114,20 +120,19 @@ public class BatchServiceImpl implements BatchService {
// int engCount = queryEnginerCount(groupId);
// int orderCount = queryOrderCount(groupId, batchDay);
log
.
info
(
"清理原批次数据, groupId:{}, day:{}"
,
groupId
,
day
);
queryRunner
.
execute
(
"delete from dispatch_engineer where group_id=? and batch_no=?"
,
groupId
,
batchNo
);
queryRunner
.
execute
(
"delete from dispatch_order where group_id=? and batch_no=?"
,
groupId
,
batchNo
);
log
.
info
(
"清理原批次数据, groupId:{}, day:{}, batchNo:{}"
,
groupId
,
batchDay
,
batchNo
);
jdbcTemplate
.
update
(
"delete from dispatch_engineer where group_id=? and batch_no=?"
,
groupId
,
batchNo
);
jdbcTemplate
.
update
(
"delete from dispatch_order where group_id=? and batch_no=?"
,
groupId
,
batchNo
);
log
.
info
(
"写入新批次技术员、工单数据, groupId:{}, day:{}
"
,
groupId
,
day
);
log
.
info
(
"写入新批次技术员、工单数据, groupId:{}, day:{}
, batchNo:{}"
,
groupId
,
batchDay
,
batchNo
);
String
sqlEngineer
=
"INSERT INTO dispatch_engineer (group_id, batch_no, engineer_code, engineer_name, x, y, max_num, max_minute, max_distance)\n"
+
"select a.group_id, ? , a.engineer_code, a.name , b.x, b.y , max_num, max_minute, max_distance from \n"
+
" engineer_info a left join engineer_business b \n"
+
" on a.engineer_code=b.engineer_code \n"
+
" where a.group_id=? and b.x is not null and b.x !=''\n"
+
" order by a.engineer_code asc"
;
int
engCount
=
queryRunner
.
execu
te
(
sqlEngineer
,
batchNo
,
groupId
);
int
engCount
=
jdbcTemplate
.
upda
te
(
sqlEngineer
,
batchNo
,
groupId
);
String
sqlOrder
=
"INSERT INTO dispatch_order (group_id, batch_no, order_id , x, y, expect_time_begin, expect_time_end, tags, priority , skills , take_time )\n"
+
" select a.org_group_id, ? , a.order_id, a.x, a.y , \n"
+
...
...
@@ -136,11 +141,12 @@ public class BatchServiceImpl implements BatchService {
" where a.org_group_id=? and status='OPEN' and appointment_status='NOT_ASSIGNED' and appointment_method like 'AUTO%' \n"
+
" and expect_time_begin between ? and ? \n"
+
" order by a.expect_time_begin asc "
;
int
orderCount
=
queryRunner
.
execute
(
sqlOrder
,
batchNo
,
groupId
,
batchDay
+
" 00:00:00"
,
batchDay
+
" 23:59:59"
);
int
orderCount
=
jdbcTemplate
.
update
(
sqlOrder
,
batchNo
,
groupId
,
batchDay
+
" 00:00:00"
,
batchDay
+
" 23:59:59"
);
jdbcTemplate
.
update
(
"update dispatch_batch set engineer_num=? , order_num=? where group_id=? and batch_no=?"
,
engCount
,
orderCount
,
groupId
,
batchNo
);
queryRunner
.
execute
(
"update dispatch_batch set engineer_num=? , order_num=? where group_id=? and batch_no=?"
,
engCount
,
orderCount
,
groupId
,
batchNo
);
log
.
info
(
"准备批次数据完成, groupId:{}, day:{}
"
,
groupId
,
day
);
log
.
info
(
"准备批次数据完成, groupId:{}, day:{}
, batchNo:{}"
,
groupId
,
batchDay
,
batchNo
);
return
batchNo
;
}
...
...
project-pre-dispatch/src/main/java/com/dituhui/pea/pre/service/impl/SolveServiceImpl.java
View file @
88a7960
...
...
@@ -125,12 +125,13 @@ public class SolveServiceImpl implements SolveService {
@Override
public
VehicleRoutingSolution
prepareAndSolveSolution
(
String
groupId
,
String
batchNo
)
{
log
.
info
(
"组织问题对象/调用引擎处理, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
SolverConfig
solverConfig
=
new
SolverConfig
().
withSolutionClass
(
VehicleRoutingSolution
.
class
).
withEntityClasses
(
Vehicle
.
class
).
withConstraintProviderClass
(
VehicleRoutingConstraintProvider
.
class
).
withTerminationSpentLimit
(
Duration
.
ofSeconds
(
10
));
SolverFactory
<
VehicleRoutingSolution
>
solverFactory
=
SolverFactory
.
create
(
solverConfig
);
// Load the problem
VehicleRoutingSolution
problem
=
prepareSolution
(
groupId
,
batchNo
);
SolverConfig
solverConfig
=
new
SolverConfig
().
withSolutionClass
(
VehicleRoutingSolution
.
class
).
withEntityClasses
(
Vehicle
.
class
).
withConstraintProviderClass
(
VehicleRoutingConstraintProvider
.
class
).
withTerminationSpentLimit
(
Duration
.
ofSeconds
(
10
));
SolverFactory
<
VehicleRoutingSolution
>
solverFactory
=
SolverFactory
.
create
(
solverConfig
);
// Solve the problem
log
.
info
(
"调用引擎处理-开始, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
Solver
<
VehicleRoutingSolution
>
solver
=
solverFactory
.
buildSolver
();
...
...
project-pre-dispatch/src/main/resources/application.yaml
View file @
88a7960
...
...
@@ -10,7 +10,7 @@ spring:
name
:
project-pre-dispatch
jackson
:
default-property-inclusion
:
NON_NULL
time-zone
:
GMT+8
#
time-zone: GMT+8
date-format
:
yyyy-MM-dd HH:mm:ss
cloud
:
...
...
project-pre-dispatch/src/main/resources/logback.xml
View file @
88a7960
...
...
@@ -5,6 +5,7 @@
</encoder>
</appender>
<root
level=
"INFO"
>
<!-- <root level="DEBUG">-->
<appender-ref
ref=
"CONSOLE"
/>
</root>
</configuration>
project-pre-dispatch/src/test/java/com/dituhui/pea/pre/BatchServiceTest.java
View file @
88a7960
...
...
@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import
org.junit.jupiter.api.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
//import JpaTransactionManager;
import
java.sql.SQLException
;
...
...
@@ -22,6 +23,7 @@ public class BatchServiceTest {
@Test
public
void
test1
()
{
log
.
info
(
"init"
);
try
{
batchService
.
buildBatchNo
(
groupId
,
day
);
...
...
Write
Preview
Markdown
is supported
Attach a file
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 post a comment