forked from wts/wts
公开完整前后端的代码
This commit is contained in:
96
back/src/handler/logic/trace.go
Normal file
96
back/src/handler/logic/trace.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
hutil "zsxyww.com/wts/handler/handlerUtilities"
|
||||
"zsxyww.com/wts/model/sqlc"
|
||||
)
|
||||
|
||||
// 可能返回的错误:
|
||||
// ErrNoSuchTicket: 无此工单
|
||||
// ErrNoSuchStaff: 无此网维成员
|
||||
// ErrNewStatusInvalid: 工单新状态不符合逻辑
|
||||
// ErrDataInconsistent: 数据库返回数据前后不一致
|
||||
func AppendTrace(c *hutil.WtsCtx, op string, r AppendTraceParam) error {
|
||||
|
||||
ctx := c.Request().Context()
|
||||
|
||||
var opwid string
|
||||
|
||||
err := c.DB.DoQuery(ctx, op, func(q *sqlc.Queries) error {
|
||||
|
||||
//确认工单存在
|
||||
t, err := q.GetTicket(ctx, r.Tid)
|
||||
if err != nil {
|
||||
if errors.Is(err, pgx.ErrNoRows) {
|
||||
return hutil.NewWtsErr(ErrNoSuchTicket, err)
|
||||
}
|
||||
return hutil.NewUnknownErr(fmt.Errorf("AppendTrace::GetTicket数据库操作失败: %w", err))
|
||||
}
|
||||
|
||||
//确认记录添加人的信息和有效性
|
||||
w, err := q.GetUserByWX(ctx, op)
|
||||
if err != nil {
|
||||
if errors.Is(err, pgx.ErrNoRows) {
|
||||
return hutil.NewWtsErr(ErrNoSuchStaff, err)
|
||||
}
|
||||
return hutil.NewUnknownErr(fmt.Errorf("AppendTrace::GetUserByWX数据库操作失败: %w", err))
|
||||
}
|
||||
if !w.Op {
|
||||
opwid = "-2"
|
||||
} else {
|
||||
opw, err := q.GetStaffBySid(ctx, w.Sid.String)
|
||||
if err != nil {
|
||||
return hutil.NewUnknownErr(fmt.Errorf("AppendTrace::GetStaffBySid数据库操作失败: %w", err))
|
||||
}
|
||||
opwid = opw.Wid
|
||||
}
|
||||
|
||||
//确认新状态是合乎逻辑的...
|
||||
if r.NewStatus != "" {
|
||||
if !isNewStatusValid(t.Status, r.NewStatus) {
|
||||
return hutil.NewWtsErr(ErrNewStatusInvalid, nil)
|
||||
}
|
||||
}
|
||||
|
||||
tr, err := q.CreateTicketTrace(ctx, sqlc.CreateTicketTraceParams{
|
||||
Tid: r.Tid,
|
||||
UpdatedAt: timestamptzOpt(time.Now()),
|
||||
Op: opwid,
|
||||
NewStatus: wtsStatusOpt(string(r.NewStatus)),
|
||||
NewPriority: wtsPriorityOpt(string(r.NewPriority)),
|
||||
NewAppointment: dateOpt(r.NewAppointment),
|
||||
NewCategory: wtsCategoryOpt(string(r.NewCategory)),
|
||||
Remark: r.Remark,
|
||||
})
|
||||
if err != nil {
|
||||
return hutil.NewUnknownErr(fmt.Errorf("AppendTrace::CreateTicketTrace数据库操作失败: %w", err))
|
||||
}
|
||||
if !((tr.Tid == r.Tid) &&
|
||||
(tr.Op == opwid) &&
|
||||
(tr.Remark == r.Remark) &&
|
||||
((r.NewStatus == "" && !tr.NewStatus.Valid) || (tr.NewStatus.WtsStatus == r.NewStatus)) &&
|
||||
((r.NewPriority == "" && !tr.NewPriority.Valid) || (tr.NewPriority.WtsPriority == r.NewPriority)) &&
|
||||
((r.NewCategory == "" && !tr.NewCategory.Valid) || (tr.NewCategory.WtsCategory == r.NewCategory)) &&
|
||||
((r.NewAppointment.IsZero() && !tr.NewAppointment.Valid) || (tr.NewAppointment.Time.Format(time.DateOnly) == r.NewAppointment.Format(time.DateOnly)))) {
|
||||
return hutil.NewWtsErr(ErrDataInconsistent, nil)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
type AppendTraceParam struct {
|
||||
Tid int32
|
||||
NewStatus sqlc.WtsStatus
|
||||
NewPriority sqlc.WtsPriority
|
||||
NewAppointment time.Time
|
||||
NewCategory sqlc.WtsCategory
|
||||
Remark string
|
||||
}
|
||||
Reference in New Issue
Block a user