Commit 88a79605 by 张晓

批次创建增加事务支持

1 parent a7a5faab
......@@ -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
......
......@@ -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/solveTest/{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);
......
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;
......
......@@ -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 = LocalDateTime.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.execute(sqlEngineer, batchNo, groupId);
int engCount = jdbcTemplate.update(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;
}
......
......@@ -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();
......
......@@ -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:
......
......@@ -5,6 +5,7 @@
</encoder>
</appender>
<root level="INFO">
<!-- <root level="DEBUG">-->
<appender-ref ref="CONSOLE" />
</root>
</configuration>
......@@ -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);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!