feat:完善项目

This commit is contained in:
henry
2021-11-08 17:42:23 +08:00
parent 1cc95fb5ca
commit 08083d26d3
7 changed files with 315 additions and 125 deletions

View File

@ -3,8 +3,14 @@ package work
import (
model2 "ArmedPolice/app/common/model"
"ArmedPolice/app/controller/basic"
"ArmedPolice/app/handle"
"ArmedPolice/app/model"
"ArmedPolice/app/service"
"ArmedPolice/serve/orm"
"ArmedPolice/utils"
"errors"
"gorm.io/gorm"
"time"
)
type Instance struct{ *service.Session }
@ -17,8 +23,40 @@ type (
basic.CommonIDString
*model.WorkInstanceInfo
}
// InstanceLaunchParams 发起参数信息
InstanceLaunchParams struct {
ID uint64
Kind int // 类型
Title string
EquipmentID uint64 // 装备ID
Breakdowns []uint64 // 故障类型
PlateNumber string // 车牌号
Priority, IsAssist int // 优先级,是否需要上级审批
Remark string // 备注信息
Material []*InstanceLaunchParamsForMaterial
Distribution *InstanceLaunchParamsForDistribution
}
// InstanceLaunchParamsForMaterial 配件信息
InstanceLaunchParamsForMaterial struct {
}
// InstanceLaunchParamsForDistribution 配送信息
InstanceLaunchParamsForDistribution struct {
Name, Mobile, Address string
}
)
func (c *Instance) publish(reviewer []string) {
utils.TryCatch(func() {
for _, v := range reviewer {
// Socket通知
service.HubMessage.EmitHandle(&service.HubEmit{
ID: v,
Msg: handle.NewWorkNotice("你有一条待办事项"),
})
}
})
}
// List 列表信息
func (c *Instance) List(materialID uint64, kind, page, pageSize int) (*basic.PageDataResponse, error) {
mWorkInstance := model.NewWorkInstance()
@ -55,7 +93,164 @@ func (c *Instance) ToDo() {
}
// Launch 发起工单申请
func (c *Instance) Launch() error {
func (c *Instance) Launch(params *InstanceLaunchParams) error {
// 查询产品信息是否存在
mManageEquipment := model.NewManageEquipment()
var count int64
err := model2.Count(mManageEquipment.ManageEquipment, &count, model2.NewWhere("id", params.EquipmentID))
if err != nil {
return err
} else if count <= 0 {
return errors.New("操作错误,该装备信息不存在或已被删除")
}
// 工单信息
mWorkInstance := model.NewWorkInstance()
mWorkInstance.Kind = model2.WorkInstanceKind(params.Kind)
mWorkInstance.Title = params.Title
mWorkInstance.EquipmentID = params.EquipmentID
mWorkInstance.PlateNumber = params.PlateNumber
mWorkInstance.Priority = model2.WorkInstancePriority(params.Priority)
mWorkInstance.IsAssist = model2.WorkInstanceAssist(params.IsAssist)
mWorkInstance.SetBreakdownAttribute(params.Breakdowns)
mWorkInstance.SetDistributionAttribute(&model2.WorkInstanceDistribution{
Name: params.Distribution.Name, Mobile: params.Distribution.Mobile, Address: params.Distribution.Address,
})
mWorkInstance.Remark = params.Remark
// 工单流程信息
mWorkProgress := model.NewWorkProgress()
// 查询工单进度流程
// TODO工单流程
// 第一阶段:创建工单,默认创建时,直接完成
mWorkSchedule := model.NewWorkSchedule()
isExist := false
if isExist, err = mWorkSchedule.FirstSchedule(); err != nil {
return err
} else if !isExist {
return errors.New("操作错误,无工单流程信息,请先核实数据")
}
mWorkInstance.Schedule = mWorkSchedule.ID
// 下一流程
nextWorkSchedule := new(model.WorkScheduleInfo)
if nextWorkSchedule, err = mWorkSchedule.NextSchedule(mWorkInstance.IsAssist == model2.WorkInstanceAssistForYes); err != nil {
return err
}
if nextWorkSchedule == nil {
mWorkInstance.Status = model2.WorkInstanceStatusForComplete
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Create(mWorkInstance.WorkInstance, tx); err != nil {
return err
}
mWorkProgress.UID = c.UID
mWorkProgress.WorkID = mWorkInstance.ID
mWorkProgress.ScheduleID = mWorkInstance.Schedule
mWorkProgress.Status = model2.WorkProgressStatusForAgree
mWorkProgress.Remark = "发起工单"
if err = model2.Create(mWorkProgress.WorkProgress, tx); err != nil {
return err
}
// 创建维修工单
mWorkRepair := model.NewWorkRepair()
mWorkRepair.WorkID = mWorkInstance.ID
if err = model2.Create(mWorkRepair.WorkRepair, tx); err != nil {
return err
}
return nil
})
}
// Examine 审核操作
func (c *Instance) Examine(id uint64, status int, remark string, isAssist int) error {
_status := model2.WorkProgressStatus(status)
if _status != model2.WorkProgressStatusForAgree && _status != model2.WorkProgressStatusForRefuse {
return errors.New("操作错误,审核状态异常")
}
mWorkInstance := model.NewWorkInstance()
mWorkInstance.ID = id
isExist, err := model2.FirstField(mWorkInstance.WorkInstance, []string{"id", "schedule", "status"})
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,工单信息不存在")
} else if mWorkInstance.Status == model2.WorkInstanceStatusForComplete {
return errors.New("操作错误,当前工单信息已结束")
}
// 查询当前工单所在流程的信息
mWorkSchedule := model.NewWorkSchedule()
mWorkSchedule.ID = mWorkInstance.Schedule
if isExist, err = model2.First(mWorkSchedule); err != nil {
return err
} else if !isExist {
return errors.New("操作错误,未知的工单流程")
}
// 验证审核权限
isAuth := false
if isAuth, err = mWorkSchedule.ValidateAuth(c.UID); err != nil {
return err
} else if !isAuth {
return errors.New("操作错误,无权限审批")
}
if err = orm.GetDB().Transaction(func(tx *gorm.DB) error {
// 工单流程记录
mWorkProgress := model.NewWorkProgress()
mWorkProgress.UID = c.UID
mWorkProgress.WorkID = id
mWorkProgress.ScheduleID = mWorkSchedule.ID
mWorkProgress.Status = _status
mWorkProgress.Remark = remark
if err = model2.Create(mWorkProgress.WorkProgress, tx); err != nil {
return err
}
workUpdates := map[string]interface{}{
"status": model2.WorkInstanceStatusForComplete, "updated_at": time.Now(),
}
// 下一流程
newNextScheduleInfo := new(model.WorkScheduleInfo)
// 拒绝审批,工单直接结束
if _status == model2.WorkProgressStatusForRefuse {
goto FINISH
}
// 下一流程信息
if newNextScheduleInfo, err = mWorkSchedule.NextSchedule(model2.WorkInstanceAssist(isAssist) == model2.WorkInstanceAssistForYes); err != nil {
return err
}
// 无下一流程,工单直接完成
if newNextScheduleInfo == nil || newNextScheduleInfo.ID <= 0 {
goto FINISH
}
workUpdates["status"] = model2.WorkInstanceStatusForOngoing
workUpdates["schedule"] = newNextScheduleInfo.ID
if newNextScheduleInfo.IsNext {
workUpdates["is_assist"] = isAssist
}
// 推送通知
go c.publish(newNextScheduleInfo.Reviewer)
FINISH:
if err = model2.Updates(mWorkInstance.WorkInstance, workUpdates, tx); err != nil {
return err
}
return nil
}); err != nil {
return err
}
return nil
}

View File

@ -1,16 +1,8 @@
package work
import (
model2 "ArmedPolice/app/common/model"
"ArmedPolice/app/controller/basic"
"ArmedPolice/app/handle"
"ArmedPolice/app/model"
"ArmedPolice/app/service"
"ArmedPolice/serve/orm"
"ArmedPolice/utils"
"errors"
"gorm.io/gorm"
"time"
)
type Person struct{ *service.Session }
@ -21,99 +13,6 @@ func (c *Person) List() (*basic.PageDataResponse, error) {
return &basic.PageDataResponse{Data: nil, Count: 0}, nil
}
// Examine 审核操作
func (c *Person) Examine(id uint64, status int, remark string, isAssist int) error {
_status := model2.WorkProgressStatus(status)
if _status != model2.WorkProgressStatusForAgree && _status != model2.WorkProgressStatusForRefuse {
return errors.New("操作错误,审核状态异常")
}
mWorkInstance := model.NewWorkInstance()
mWorkInstance.ID = id
isExist, err := model2.FirstField(mWorkInstance.WorkInstance, []string{"id", "schedule", "status"})
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,工单信息不存在")
} else if mWorkInstance.Status == model2.WorkInstanceStatusForComplete {
return errors.New("操作错误,当前工单信息已结束")
}
// 查询当前工单所在流程的信息
mWorkSchedule := model.NewWorkSchedule()
mWorkSchedule.ID = mWorkInstance.Schedule
if isExist, err = model2.First(mWorkSchedule); err != nil {
return err
} else if !isExist {
return errors.New("操作错误,未知的工单流程")
}
// 验证审核权限
isAuth := false
if isAuth, err = mWorkSchedule.ValidateAuth(c.UID); err != nil {
return err
} else if !isAuth {
return errors.New("操作错误,无权限审批")
}
if err = orm.GetDB().Transaction(func(tx *gorm.DB) error {
// 工单流程记录
mWorkProgress := model.NewWorkProgress()
mWorkProgress.UID = c.UID
mWorkProgress.WorkID = id
mWorkProgress.ScheduleID = mWorkSchedule.ID
mWorkProgress.Status = _status
mWorkProgress.Remark = remark
if err = model2.Create(mWorkProgress.WorkProgress, tx); err != nil {
return err
}
workUpdates := map[string]interface{}{
"status": model2.WorkInstanceStatusForComplete, "updated_at": time.Now(),
}
// 下一流程
newNextScheduleInfo := new(model.WorkScheduleInfo)
// 拒绝审批,工单直接结束
if _status == model2.WorkProgressStatusForRefuse {
goto FINISH
}
// 下一流程信息
if newNextScheduleInfo, err = mWorkSchedule.NextSchedule(model2.WorkInstanceAssist(isAssist) == model2.WorkInstanceAssistForYes); err != nil {
return err
}
// 无下一流程,工单直接完成
if newNextScheduleInfo == nil || newNextScheduleInfo.ID <= 0 {
goto FINISH
}
workUpdates["status"] = model2.WorkInstanceStatusForOngoing
workUpdates["schedule"] = newNextScheduleInfo.ID
if newNextScheduleInfo.IsNext {
workUpdates["is_assist"] = isAssist
}
// 推送通知
go utils.TryCatch(func() {
for _, v := range newNextScheduleInfo.Reviewer {
// Socket通知
service.HubMessage.EmitHandle(&service.HubEmit{
ID: v,
Msg: handle.NewWorkNotice("你有一条待办事项"),
})
}
})
FINISH:
if err = model2.Updates(mWorkInstance.WorkInstance, workUpdates, tx); err != nil {
return err
}
return nil
}); err != nil {
return err
}
return nil
}
func NewPerson() PersonHandle {
return func(session *service.Session) *Person {
return &Person{session}