forked from wts/wts
添加一个自动脚本任务:每晚九点自动取消当天预约但是没人去修的单子
This commit is contained in:
@@ -25,11 +25,12 @@ func main() {
|
|||||||
//设置微信SDK
|
//设置微信SDK
|
||||||
wx := wechat.Setup(cfg)
|
wx := wechat.Setup(cfg)
|
||||||
|
|
||||||
//启动守护进程
|
|
||||||
daemon.Setup()
|
|
||||||
|
|
||||||
//然后,启动服务器
|
//然后,启动服务器
|
||||||
app := server.Setup(cfg, dbx, wx)
|
app := server.Setup(cfg, dbx, wx)
|
||||||
|
|
||||||
|
//启动守护进程(因为有的服务需要用到上下文,所以现在修改在server.Setup被执行的后面启动)
|
||||||
|
daemon.Setup()
|
||||||
|
|
||||||
err := app.Start("127.0.0.1:" + strconv.Itoa(cfg.ListenPort))
|
err := app.Start("127.0.0.1:" + strconv.Itoa(cfg.ListenPort))
|
||||||
|
|
||||||
println("Server exited." + err.Error())
|
println("Server exited." + err.Error())
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ package daemon
|
|||||||
|
|
||||||
func Setup() {
|
func Setup() {
|
||||||
regExitSigs()
|
regExitSigs()
|
||||||
|
scheduledAutoCancel()
|
||||||
}
|
}
|
||||||
|
|||||||
117
back/src/daemon/scheduledAutoCancel.go
Normal file
117
back/src/daemon/scheduledAutoCancel.go
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
package daemon
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
"zsxyww.com/wts/model"
|
||||||
|
"zsxyww.com/wts/model/sqlc"
|
||||||
|
"zsxyww.com/wts/server"
|
||||||
|
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 在每天值班结束的时候,自动取消(改日修)预约在今天但是状态今天没有更新的工单
|
||||||
|
func scheduledAutoCancel() {
|
||||||
|
go func() {
|
||||||
|
var first = true
|
||||||
|
var duration time.Duration
|
||||||
|
var jobID int
|
||||||
|
for {
|
||||||
|
jobID = rand.Int()
|
||||||
|
//暂时在每晚的9点执行逻辑
|
||||||
|
now := time.Now()
|
||||||
|
next := time.Date(now.Year(), now.Month(), now.Day(), 21, 0, 0, 0, now.Location())
|
||||||
|
|
||||||
|
// 如果程序启动时已经过了9点,那么就立即执行
|
||||||
|
if (!now.Before(next)) && (first == true) {
|
||||||
|
first = false
|
||||||
|
goto do
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果当前时间已经过了9点,比如程序执行完上一次了,就设置为明天9点的定时
|
||||||
|
if !now.Before(next) {
|
||||||
|
next = next.AddDate(0, 0, 1)
|
||||||
|
}
|
||||||
|
first = false //这里防止程序在9点前启动的时候会跑两次逻辑...
|
||||||
|
|
||||||
|
duration = next.Sub(now)
|
||||||
|
slog.Info("下一次取消程序安排上了", "duration", duration, "nextTime", next)
|
||||||
|
time.Sleep(duration)
|
||||||
|
|
||||||
|
// 醒来后执行取消工单的操作
|
||||||
|
do:
|
||||||
|
if err := doCancelJob(jobID); err != nil {
|
||||||
|
slog.Error("自动预约处理程序执行失败", "error", err, "ID", jobID)
|
||||||
|
} else {
|
||||||
|
slog.Info("自动取消程序执行完毕", "ID", jobID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func doCancelJob(jobID int) error {
|
||||||
|
slog.Info("开始执行每日预约处理程序", "ID", jobID)
|
||||||
|
ctx := context.Background()
|
||||||
|
err := server.DB.DoQuery(context.Background(), "system", func(q *sqlc.Queries) error {
|
||||||
|
//1.获取今日(实际上获取所有过去的预约单来保险)预约
|
||||||
|
allZone, _ := model.BlocksInZone("all")
|
||||||
|
var beforeScheduledTickets = []sqlc.WtsVTicket{}
|
||||||
|
t, err := q.FilterTickets(ctx, sqlc.FilterTicketsParams{
|
||||||
|
Blocks: allZone,
|
||||||
|
Status: []sqlc.WtsStatus{"scheduled"},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("在获取工单时失败了:%w", err)
|
||||||
|
}
|
||||||
|
for _, a := range t {
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
var date time.Time
|
||||||
|
if a.AppointedAt.Valid {
|
||||||
|
date = a.AppointedAt.Time
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if date.Before(now) {
|
||||||
|
beforeScheduledTickets = append(beforeScheduledTickets, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//2.将所有工单改为“已取消”
|
||||||
|
var ticketIDSlice []int32
|
||||||
|
for _, a := range beforeScheduledTickets {
|
||||||
|
ticketIDSlice = append(ticketIDSlice, a.Tid)
|
||||||
|
}
|
||||||
|
slog.Info("本次操作共涉及如下工单", "t", ticketIDSlice)
|
||||||
|
for _, a := range ticketIDSlice {
|
||||||
|
_, err := q.CreateTicketTrace(ctx, sqlc.CreateTicketTraceParams{
|
||||||
|
Tid: a,
|
||||||
|
UpdatedAt: pgtype.Timestamptz{
|
||||||
|
Time: time.Now(),
|
||||||
|
Valid: true,
|
||||||
|
},
|
||||||
|
Op: "-1",
|
||||||
|
NewStatus: sqlc.NullWtsStatus{
|
||||||
|
WtsStatus: "canceled",
|
||||||
|
Valid: true,
|
||||||
|
},
|
||||||
|
NewPriority: sqlc.NullWtsPriority{
|
||||||
|
WtsPriority: "mainline",
|
||||||
|
Valid: true,
|
||||||
|
},
|
||||||
|
Remark: "系统检测到预约已过期,似乎是我们爽约了,我们非常抱歉为您造成的不便,您可以再次提交报修预约,我们会努力做得更好。",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("在增加记录时失败了:%w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//3.如果没有问题就提交事务
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package daemon
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
@@ -21,6 +22,7 @@ func regExitSigs() {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
sig := <-sigs
|
sig := <-sigs
|
||||||
|
slog.Info("收到退出信号", "signal", sig)
|
||||||
fmt.Printf("\n===== %s,roger that! =====\n", sig)
|
fmt.Printf("\n===== %s,roger that! =====\n", sig)
|
||||||
|
|
||||||
err := runCleanup()
|
err := runCleanup()
|
||||||
|
|||||||
Reference in New Issue
Block a user