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 2dbde634
authored
Jul 12, 2023
by
张晓
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cutoff写confirm
1 parent
7bd427a3
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
101 additions
and
43 deletions
.gitignore
project-dispatch/src/main/java/com/dituhui/pea/dispatch/dao/DispatchBatchRepository.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/dao/OrderAppointmentRepository.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/entity/DispatchBatch.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/scheduler/BatchScheduler.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/BatchService.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/ExtractService.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/impl/BatchServiceImpl.java
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/impl/ExtractServiceImpl.java
project-dispatch/src/main/resources/application-dev.yaml
.gitignore
View file @
2dbde63
...
...
@@ -8,4 +8,5 @@
/*/.classpath
/*/.project
/*/logs/
/*/.gitignore
\ No newline at end of file
/*/.gitignore
dispatchSolution-*.json
\ No newline at end of file
project-dispatch/src/main/java/com/dituhui/pea/dispatch/dao/DispatchBatchRepository.java
View file @
2dbde63
...
...
@@ -20,7 +20,7 @@ public interface DispatchBatchRepository extends CrudRepository<DispatchBatch, L
Optional
<
DispatchBatch
>
findByGroupIdAndBatchDate
(
String
groupId
,
String
batchDay
);
@Query
(
value
=
"from DispatchBatch where groupId = ?1 and batchNo=?2 "
)
List
<
DispatchBatch
>
findLatestGroup
(
String
groupId
,
String
batchNo
);
Optional
<
DispatchBatch
>
findByGroupIdAndBatchNo
(
String
groupId
,
String
batchNo
);
}
\ No newline at end of file
project-dispatch/src/main/java/com/dituhui/pea/dispatch/dao/OrderAppointmentRepository.java
View file @
2dbde63
package
com
.
dituhui
.
pea
.
dispatch
.
dao
;
import
com.dituhui.pea.dispatch.entity.OrderAppointment
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.repository.CrudRepository
;
import
java.util.Optional
;
public
interface
OrderAppointmentRepository
extends
CrudRepository
<
OrderAppointment
,
Long
>
{
@Query
(
value
=
"SELECT * FROM order_appointment WHERE order_id=:orderId ORDER BY id DESC LIMIT 1"
,
nativeQuery
=
true
)
Optional
<
OrderAppointment
>
findByOrderId
(
String
orderId
);
}
project-dispatch/src/main/java/com/dituhui/pea/dispatch/entity/DispatchBatch.java
View file @
2dbde63
...
...
@@ -72,6 +72,12 @@ public class DispatchBatch implements Serializable {
@Column
(
name
=
"status"
)
private
String
status
;
@JsonDeserialize
(
using
=
LocalDateTimeDeserializer
.
class
)
@JsonSerialize
(
using
=
LocalDateTimeSerializer
.
class
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
@Column
(
name
=
"cutoffed_time"
)
private
LocalDateTime
cutoffedTime
;
@Column
(
name
=
"memo"
)
private
String
memo
;
...
...
project-dispatch/src/main/java/com/dituhui/pea/dispatch/scheduler/BatchScheduler.java
View file @
2dbde63
package
com
.
dituhui
.
pea
.
dispatch
.
scheduler
;
import
com.dituhui.pea.dispatch.constraint.DispatchConstraintProvider
;
import
com.dituhui.pea.dispatch.entity.DispatchBatch
;
import
com.dituhui.pea.dispatch.pojo.Customer
;
import
com.dituhui.pea.dispatch.pojo.DispatchSolution
;
import
com.dituhui.pea.dispatch.pojo.Technician
;
...
...
@@ -21,6 +22,8 @@ import java.io.File;
import
java.sql.SQLException
;
import
java.time.Duration
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.LocalTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Arrays
;
import
java.util.UUID
;
...
...
@@ -69,6 +72,32 @@ public class BatchScheduler {
String
currDay
=
LocalDate
.
now
().
plusDays
(
i
).
format
(
DateTimeFormatter
.
ISO_LOCAL_DATE
);
log
.
info
(
"dispatchRun begin----- group:{}, day:{}"
,
groupId
,
currDay
);
LocalTime
currentTime
=
LocalTime
.
now
();
LocalTime
cutoffTime
=
LocalTime
.
parse
(
"16:00:00"
,
DateTimeFormatter
.
ISO_LOCAL_TIME
);
if
(
currentTime
.
isAfter
(
cutoffTime
))
{
log
.
info
(
"dispatchRun 已过cutoff时间,更新pre状态为confirm----- group:{}, day:{}"
,
groupId
,
currDay
);
DispatchBatch
dispatchBatch
=
batchService
.
queryBatchInfoByDay
(
groupId
,
currDay
);
if
(
null
==
dispatchBatch
.
getBatchNo
())
{
log
.
info
(
"dispatchRun 未查询到批次信息跳过----- group:{}, day:{}"
,
groupId
,
currDay
);
continue
;
}
if
(
null
==
dispatchBatch
.
getCutoffedTime
())
{
log
.
info
(
"dispatchRun 已过cutoff时间,更新pre状态为confirm, 执行首次confirm----- group:{}, day:{}"
,
groupId
,
currDay
);
try
{
this
.
extractService
.
extractDispatchToOrder
(
groupId
,
dispatchBatch
.
getBatchNo
(),
true
);
dispatchBatch
.
setCutoffedTime
(
LocalDateTime
.
now
());
batchService
.
saveDispatchBatch
(
dispatchBatch
);
}
catch
(
SQLException
e
)
{
log
.
error
(
"dispatchRun 已过cutoff时间,更新pre状态为confirm 异常 %s"
,
e
);
throw
new
RuntimeException
(
e
);
}
}
else
{
log
.
info
(
"dispatchRun 已过cutoff时间,更新pre状态为confirm, 已经执行confirm,跳过当次计算 ----- group:{}, day:{}"
,
groupId
,
currDay
);
}
continue
;
}
String
batchNo
=
batchService
.
buildBatchData
(
groupId
,
currDay
);
UUID
problemId
=
solveService
.
generateProblemId
(
groupId
,
batchNo
);
log
.
info
(
"dispatchRun group:{}, day:{}, batch:{}, problemId:{}"
,
groupId
,
currDay
,
batchNo
,
problemId
);
...
...
@@ -81,13 +110,11 @@ public class BatchScheduler {
}
log
.
info
(
"dispatchRun prepare done, group:{}, day:{}, batch:{}, problemId:{}"
,
groupId
,
currDay
,
batchNo
,
problemId
);
DispatchSolution
solution
=
solver
.
solve
(
problem
);
log
.
info
(
"dispatchRun run done, group:{}, day:{}, batch:{}, problemId:{}, score:{}"
,
groupId
,
currDay
,
batchNo
,
problemId
,
solution
.
getScore
().
toShortString
());
log
.
info
(
"dispatchRun run done, group:{}, day:{}, batch:{}, problemId:{}, score:{}"
,
groupId
,
currDay
,
batchNo
,
problemId
,
solution
.
getScore
().
toShortString
());
this
.
extractService
.
saveAndExtractSolution
(
solution
);
log
.
info
(
"dispatchRun done ------ group:{}, day:{}"
,
groupId
,
currDay
);
JacksonSolutionFileIO
<
DispatchSolution
>
exporter
=
new
JacksonSolutionFileIO
<
DispatchSolution
>(
DispatchSolution
.
class
);
JacksonSolutionFileIO
<
DispatchSolution
>
exporter
=
new
JacksonSolutionFileIO
<
DispatchSolution
>(
DispatchSolution
.
class
);
// Set the output file.
...
...
@@ -98,11 +125,10 @@ public class BatchScheduler {
}
}
catch
(
SQLException
e
)
{
}
catch
(
InterruptedException
e
)
{
log
.
info
(
"error %s"
,
e
);
throw
new
RuntimeException
(
e
);
}
catch
(
Interrupted
Exception
e
)
{
}
catch
(
SQL
Exception
e
)
{
log
.
info
(
"error %s"
,
e
);
throw
new
RuntimeException
(
e
);
}
...
...
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/BatchService.java
View file @
2dbde63
...
...
@@ -23,4 +23,6 @@ public interface BatchService {
String
queryBatchNoByDay
(
String
groupId
,
String
day
);
void
saveDispatchBatch
(
DispatchBatch
batchInfo
);
}
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/ExtractService.java
View file @
2dbde63
...
...
@@ -2,6 +2,7 @@ package com.dituhui.pea.dispatch.service;
import
com.dituhui.pea.dispatch.pojo.DispatchSolution
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.sql.SQLException
;
...
...
@@ -31,7 +32,8 @@ public interface ExtractService {
* order_appointment(新增、更新)
* order_request(主要更新状态)
* */
void
extractDispatchToOrder
(
String
groupId
,
String
batchNo
)
throws
SQLException
;
@Transactional
void
extractDispatchToOrder
(
String
groupId
,
String
batchNo
,
boolean
isConfirm
)
throws
SQLException
;
}
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/impl/BatchServiceImpl.java
View file @
2dbde63
...
...
@@ -80,6 +80,7 @@ public class BatchServiceImpl implements BatchService {
// int engCount = queryEnginerCount(groupId);
// int orderCount = queryOrderCount(groupId, batchDay);
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
);
...
...
@@ -94,14 +95,14 @@ public class BatchServiceImpl implements BatchService {
" order by a.engineer_code asc"
;
int
engCount
=
jdbcTemplate
.
update
(
sqlEngineer
,
batchNo
,
groupId
);
// 未派过的工单
// 未派过的工单
(虚拟指派不更改order_request.appointment_status,所以也包含在当前条件中)
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"
+
" a.expect_time_begin, a.expect_time_end, a.tags, a.priority , concat(a.brand, a.type, a.skill) skills , b.take_time \n"
+
" from order_request a left join product_category b on (a.brand=b.brand and a.type=b.type and a.skill=b.skill )\n"
+
" where a.org_group_id=? and a.status='OPEN' "
+
" and a.dt = ? "
+
" and appointment_status ='NOT_ASSIGNED' and appointment_method like 'AUTO%' \n"
+
" and a
.a
ppointment_status ='NOT_ASSIGNED' and appointment_method like 'AUTO%' \n"
+
" order by a.expect_time_begin asc "
;
int
orderCount
=
jdbcTemplate
.
update
(
sqlOrder
,
batchNo
,
groupId
,
batchDay
);
...
...
@@ -119,8 +120,9 @@ public class BatchServiceImpl implements BatchService {
" order by a.expect_time_begin asc "
;
int
orderCountPre
=
jdbcTemplate
.
update
(
sqlOrderPre
,
batchNo
,
groupId
,
batchDay
);
log
.
info
(
"准备批次数据 order1 :{}"
,
orderCount
);
log
.
info
(
"准备批次数据 order2 :{}"
,
orderCountPre
);
log
.
info
(
"准备批次数据 orderCount :{}"
,
orderCount
);
log
.
info
(
"准备批次数据 orderCountPre :{}"
,
orderCountPre
);
jdbcTemplate
.
update
(
"update dispatch_batch set engineer_num=? , order_num=?, start_time=?, end_time=null, status='RUNNING' where group_id=? and batch_no=?"
,
...
...
@@ -148,5 +150,9 @@ public class BatchServiceImpl implements BatchService {
return
optional
.
orElseGet
(
DispatchBatch:
:
new
);
}
@Override
public
void
saveDispatchBatch
(
DispatchBatch
batchInfo
)
{
batchRepository
.
save
(
batchInfo
);
}
}
project-dispatch/src/main/java/com/dituhui/pea/dispatch/service/impl/ExtractServiceImpl.java
View file @
2dbde63
...
...
@@ -4,10 +4,7 @@ import cn.hutool.core.date.DateField;
import
cn.hutool.core.date.DateTime
;
import
cn.hutool.core.date.DateUtil
;
import
com.dituhui.pea.dispatch.dao.*
;
import
com.dituhui.pea.dispatch.entity.DispatchOrder
;
import
com.dituhui.pea.dispatch.entity.EngineerInfo
;
import
com.dituhui.pea.dispatch.entity.OrderAppointment
;
import
com.dituhui.pea.dispatch.entity.OrderRequest
;
import
com.dituhui.pea.dispatch.entity.*
;
import
com.dituhui.pea.dispatch.pojo.DispatchSolution
;
import
com.dituhui.pea.dispatch.service.ExtractService
;
import
com.mysql.cj.util.StringUtils
;
...
...
@@ -45,6 +42,9 @@ public class ExtractServiceImpl implements ExtractService {
@Autowired
DispatchBatchRepository
batchRepository
;
@Autowired
EngineerInfoRepository
engineerInfoRepo
;
...
...
@@ -64,6 +64,7 @@ public class ExtractServiceImpl implements ExtractService {
/*
* 将计算结果回写到dispatch2个表、以及order两个表
* */
@Transactional
@Override
public
void
saveAndExtractSolution
(
DispatchSolution
solution
)
throws
RuntimeException
{
String
groupId
=
solution
.
getGroupId
();
...
...
@@ -71,7 +72,7 @@ public class ExtractServiceImpl implements ExtractService {
log
.
info
(
"算法结果回写包装方法, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
this
.
saveSolutionToDispatch
(
groupId
,
batchNo
,
solution
);
try
{
this
.
extractDispatchToOrder
(
solution
.
getGroupId
(),
solution
.
getBatchNo
());
this
.
extractDispatchToOrder
(
solution
.
getGroupId
(),
solution
.
getBatchNo
()
,
false
);
}
catch
(
SQLException
e
)
{
log
.
error
(
"算法结果回写包装方法异常, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
,
e
);
throw
new
RuntimeException
(
e
);
...
...
@@ -81,7 +82,6 @@ public class ExtractServiceImpl implements ExtractService {
/**
* 将计算结果回写到dispatch_order表(更新补充技术员工号、上门时间)
*/
@Transactional
@Override
public
void
saveSolutionToDispatch
(
String
groupId
,
String
batchNo
,
DispatchSolution
solution
)
throws
RuntimeException
{
log
.
info
(
"算法结果回写dispatch, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
...
...
@@ -161,7 +161,7 @@ public class ExtractServiceImpl implements ExtractService {
*/
@Transactional
@Override
public
void
extractDispatchToOrder
(
String
groupId
,
String
batchNo
)
throws
SQLException
{
public
void
extractDispatchToOrder
(
String
groupId
,
String
batchNo
,
boolean
isConfirm
)
throws
SQLException
{
log
.
info
(
"算法结果更新到工单, groupId:{}, batchNo:{}"
,
groupId
,
batchNo
);
Map
<
String
,
EngineerInfo
>
engineerInfoMap
=
engineerInfoRepo
.
findByGroupId
(
groupId
).
stream
().
collect
(
Collectors
.
toMap
(
EngineerInfo:
:
getEngineerCode
,
y
->
y
));
...
...
@@ -186,7 +186,8 @@ public class ExtractServiceImpl implements ExtractService {
}
OrderRequest
orderRequest
=
orderOpt
.
get
();
if
(!(
"OPEN"
.
equals
(
orderRequest
.
getStatus
())
&&
(
"ASSIGNED"
.
equals
(
orderRequest
.
getAppointmentStatus
())
||
"NOT_ASSIGNED"
.
equals
(
orderRequest
.
getAppointmentStatus
()))))
{
if
(!(
"OPEN"
.
equals
(
orderRequest
.
getStatus
())
&&
Set
.
of
(
"ASSIGNED"
,
"NOT_ASSIGNED"
).
contains
(
orderRequest
.
getAppointmentStatus
())))
{
log
.
warn
(
"算法结果更新到工单, step1.1-loop, 工单状态异常, groupId:{}, batchNo:{}, orderId:{}, status:{}, appointment-status:{}"
,
groupId
,
batchNo
,
orderId
,
orderRequest
.
getStatus
(),
orderRequest
.
getAppointmentStatus
());
return
;
...
...
@@ -213,24 +214,9 @@ public class ExtractServiceImpl implements ExtractService {
// 会有多次上门情况( pre_status='PRE' and status in ('NOT_ASSIGNED', 'ASSIGNED') ,直接更新,其它情况新增)
Optional
<
OrderAppointment
>
appointmentOpt
=
orderAppointmentRepo
.
findByOrderId
(
orderId
);
if
(
appointmentOpt
.
isPresent
()
&&
"PRE"
.
equals
(
appointmentOpt
.
get
().
getPreStatus
())
&&
(
"NOT_ASSIGNED"
.
equals
(
appointmentOpt
.
get
().
getStatus
())
||
"ASSIGNED"
.
equals
(
appointmentOpt
.
get
().
getStatus
())))
{
OrderAppointment
appointment
=
appointmentOpt
.
get
();
appointment
.
setStatus
(
"ASSIGNED"
);
appointment
.
setPreStatus
(
"PRE"
);
appointment
.
setEngineerCode
(
engCode
);
appointment
.
setEngineerName
(
engName
);
appointment
.
setEngineerPhone
(
phone
);
appointment
.
setEngineerAge
(
age
);
appointment
.
setDt
(
orderRequest
.
getDt
());
appointment
.
setExpectStartTime
(
dispatchOrder
.
getTimeBegin
());
appointment
.
setExpectEndTime
(
dispatchOrder
.
getTimeEnd
());
appointment
.
setUpdateTime
(
LocalDateTime
.
now
());
orderAppointmentRepo
.
save
(
appointment
);
}
else
{
if
(
appointmentOpt
.
isEmpty
())
{
// 没有则插入一条
OrderAppointment
appointment
=
new
OrderAppointment
();
appointment
.
setOrderId
(
dispatchOrder
.
getOrderId
());
String
subId
=
String
.
format
(
"%s_%s"
,
dispatchOrder
.
getOrderId
(),
DateUtil
.
format
(
LocalDateTime
.
now
(),
"yyyyMMddHHmmss"
));
...
...
@@ -244,12 +230,38 @@ public class ExtractServiceImpl implements ExtractService {
appointment
.
setDt
(
orderRequest
.
getDt
());
appointment
.
setExpectStartTime
(
dispatchOrder
.
getTimeBegin
());
appointment
.
setExpectEndTime
(
dispatchOrder
.
getTimeEnd
());
appointment
.
setPreStatus
(
"PRE"
);
appointment
.
setPreStatus
(
isConfirm
?
"CONFIRM"
:
"PRE"
);
appointment
.
setStatus
(
"ASSIGNED"
);
appointment
.
setMemo
(
""
);
appointment
.
setCreateTime
(
LocalDateTime
.
now
());
appointment
.
setUpdateTime
(
LocalDateTime
.
now
());
orderAppointmentRepo
.
save
(
appointment
);
}
else
{
// 如果有记录:1虚拟指派 2排量预派 3
if
(
Set
.
of
(
"PRE"
,
"VIRTUAL"
).
contains
(
appointmentOpt
.
get
().
getPreStatus
())
&&
Set
.
of
(
"NOT_ASSIGNED"
,
"ASSIGNED"
).
contains
(
appointmentOpt
.
get
().
getStatus
()))
{
OrderAppointment
appointment
=
appointmentOpt
.
get
();
appointment
.
setStatus
(
"ASSIGNED"
);
appointment
.
setPreStatus
(
isConfirm
?
"CONFIRM"
:
"PRE"
);
appointment
.
setEngineerCode
(
engCode
);
appointment
.
setEngineerName
(
engName
);
appointment
.
setEngineerPhone
(
phone
);
appointment
.
setEngineerAge
(
age
);
appointment
.
setDt
(
orderRequest
.
getDt
());
appointment
.
setExpectStartTime
(
dispatchOrder
.
getTimeBegin
());
appointment
.
setExpectEndTime
(
dispatchOrder
.
getTimeEnd
());
appointment
.
setUpdateTime
(
LocalDateTime
.
now
());
orderAppointmentRepo
.
save
(
appointment
);
}
else
{
// 其它情况待补充(改约) todo
if
(
Set
.
of
(
"CONFIRM"
).
contains
(
appointmentOpt
.
get
().
getPreStatus
())
&&
Set
.
of
(
"TODO"
,
"???"
).
contains
(
appointmentOpt
.
get
().
getStatus
()))
{
}
}
}
});
...
...
project-dispatch/src/main/resources/application-dev.yaml
View file @
2dbde63
...
...
@@ -3,8 +3,8 @@ server:
dispatch
:
cron
:
expr
:
0
36
8-18 * * ?
next-day-limit
:
3
expr
:
0
43
8-18 * * ?
next-day-limit
:
2
# expr: 0 */10 8-18 * * ?
spring
:
...
...
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