feat:完善项目
This commit is contained in:
@ -100,6 +100,21 @@ func (*Config) Breakdown(c *gin.Context) {
|
|||||||
APIResponse(err, data)(c)
|
APIResponse(err, data)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Config) BreakdownAdd() {
|
func (*Config) BreakdownAdd(c *gin.Context) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*Config) BreakdownEdit(c *gin.Context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Config) BreakdownDelete(c *gin.Context) {
|
||||||
|
form := new(IDStringForm)
|
||||||
|
|
||||||
|
if err := bind(form)(c); err != nil {
|
||||||
|
APIFailure(err.(error))(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := config.NewBreakdown()(getSession()(c).(*service.Session)).Delete(form.Convert())
|
||||||
|
APIResponse(err)(c)
|
||||||
|
}
|
||||||
|
@ -71,10 +71,25 @@ func (*Work) Instance(c *gin.Context) {
|
|||||||
APIResponse(err, data)(c)
|
APIResponse(err, data)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*Work) ToDo(c *gin.Context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (*Work) Launch(c *gin.Context) {
|
func (*Work) Launch(c *gin.Context) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Work) Examine(c *gin.Context) {
|
func (*Work) Examine(c *gin.Context) {
|
||||||
|
form := &struct {
|
||||||
|
IDStringForm
|
||||||
|
Status int `json:"status" form:"status" binding:"required"`
|
||||||
|
Remark string `json:"remark" form:"remark"`
|
||||||
|
IsAssist int `json:"is_assist" form:"is_assist"`
|
||||||
|
}{}
|
||||||
|
if err := bind(form)(c); err != nil {
|
||||||
|
APIFailure(err.(error))(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := work.NewPerson()(getSession()(c).(*service.Session)).Examine(form.Convert(), form.Status, form.Remark, form.IsAssist)
|
||||||
|
APIResponse(err)
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ type WorkInstance struct {
|
|||||||
PlateNumber string `gorm:"column:plate_number;type:varchar(10);default:null;comment:车牌号" json:"plate_number"`
|
PlateNumber string `gorm:"column:plate_number;type:varchar(10);default:null;comment:车牌号" json:"plate_number"`
|
||||||
Breakdown string `gorm:"column:breakdown;type:varchar(150);default:null;comment:故障" json:"breakdown"`
|
Breakdown string `gorm:"column:breakdown;type:varchar(150);default:null;comment:故障" json:"breakdown"`
|
||||||
Priority WorkInstancePriority `gorm:"column:priority;type:tinyint(1);default:1;comment:工单优先级" json:"priority"`
|
Priority WorkInstancePriority `gorm:"column:priority;type:tinyint(1);default:1;comment:工单优先级" json:"priority"`
|
||||||
Progress int `gorm:"column:progress;type:tinyint(1);default:1;comment:工单进度" json:"progress"`
|
Schedule uint64 `gorm:"column:schedule;type:int(11);default:1;comment:工单进度" json:"schedule"`
|
||||||
Status WorkInstanceStatus `gorm:"column:status;type:tinyint(1);default:0;comment:工单状态" json:"status"`
|
Status WorkInstanceStatus `gorm:"column:status;type:tinyint(1);default:0;comment:工单状态" json:"status"`
|
||||||
Remark string `gorm:"column:remark;type:varchar(255);default:null;comment:备注信息" json:"remark"`
|
Remark string `gorm:"column:remark;type:varchar(255);default:null;comment:备注信息" json:"remark"`
|
||||||
ModelDeleted
|
ModelDeleted
|
||||||
|
@ -5,11 +5,23 @@ type WorkProgress struct {
|
|||||||
Model
|
Model
|
||||||
UID uint64 `gorm:"column:uid;type:int;default:0;comment:用户uuid" json:"-"`
|
UID uint64 `gorm:"column:uid;type:int;default:0;comment:用户uuid" json:"-"`
|
||||||
WorkID uint64 `gorm:"column:work_id;type:int(11);default:0;comment:工单ID" json:"-"`
|
WorkID uint64 `gorm:"column:work_id;type:int(11);default:0;comment:工单ID" json:"-"`
|
||||||
|
ScheduleID uint64 `gorm:"column:schedule_id;type:int(11);default:0;comment:工单流程ID" json:"-"`
|
||||||
|
Status WorkProgressStatus `gorm:"column:status;type:tinyint(1);default:1;comment:状态" json:"-"`
|
||||||
Remark string `gorm:"column:remark;type:varchar(255);default:null;comment:备注信息" json:"remark"`
|
Remark string `gorm:"column:remark;type:varchar(255);default:null;comment:备注信息" json:"remark"`
|
||||||
ModelDeleted
|
ModelDeleted
|
||||||
ModelAt
|
ModelAt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WorkProgressStatus 工单进度状态
|
||||||
|
type WorkProgressStatus int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// WorkProgressStatusForRefuse 拒绝
|
||||||
|
WorkProgressStatusForRefuse WorkProgressStatus = iota - 1
|
||||||
|
// WorkProgressStatusForAgree 同意
|
||||||
|
WorkProgressStatusForAgree
|
||||||
|
)
|
||||||
|
|
||||||
func (m *WorkProgress) TableName() string {
|
func (m *WorkProgress) TableName() string {
|
||||||
return "work_progress"
|
return "work_progress"
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
// WorkSchedule 工单流程数据模型
|
// WorkSchedule 工单流程数据模型
|
||||||
type WorkSchedule struct {
|
type WorkSchedule struct {
|
||||||
Model
|
Model
|
||||||
@ -17,7 +19,7 @@ type WorkScheduleTarget int
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// WorkScheduleTargetForPerson 个人
|
// WorkScheduleTargetForPerson 个人
|
||||||
WorkScheduleTargetForPerson int = iota + 1
|
WorkScheduleTargetForPerson WorkScheduleTarget = iota + 1
|
||||||
// WorkScheduleTargetForRole 角色
|
// WorkScheduleTargetForRole 角色
|
||||||
WorkScheduleTargetForRole
|
WorkScheduleTargetForRole
|
||||||
)
|
)
|
||||||
@ -26,6 +28,14 @@ func (m *WorkSchedule) TableName() string {
|
|||||||
return "work_schedule"
|
return "work_schedule"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *WorkSchedule) GetTargetValueAttribute() []string {
|
||||||
|
return strings.Split(m.TargetValue, ",")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *WorkSchedule) SetTargetValueAttribute(value []string) {
|
||||||
|
m.TargetValue = strings.Join(value, ",")
|
||||||
|
}
|
||||||
|
|
||||||
func NewWorkSchedule() *WorkSchedule {
|
func NewWorkSchedule() *WorkSchedule {
|
||||||
return &WorkSchedule{}
|
return &WorkSchedule{}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ type BreakdownInfo struct {
|
|||||||
*model2.SysBreakdown
|
*model2.SysBreakdown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List 列表信息
|
||||||
func (c *Breakdown) List(title string, page, pageSize int) (*basic.PageDataResponse, error) {
|
func (c *Breakdown) List(title string, page, pageSize int) (*basic.PageDataResponse, error) {
|
||||||
mSysBreakdown := model.NewSysBreakdown()
|
mSysBreakdown := model.NewSysBreakdown()
|
||||||
|
|
||||||
@ -43,12 +44,27 @@ func (c *Breakdown) List(title string, page, pageSize int) (*basic.PageDataRespo
|
|||||||
return &basic.PageDataResponse{Data: list, Count: count}, nil
|
return &basic.PageDataResponse{Data: list, Count: count}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Form 数据处理
|
||||||
func (c *Breakdown) Form(id uint64, title, remark string) error {
|
func (c *Breakdown) Form(id uint64, title, remark string) error {
|
||||||
return nil
|
mSysBreakdown := model.NewSysBreakdown()
|
||||||
|
|
||||||
|
if id > 0 {
|
||||||
|
mSysBreakdown.ID = mSysBreakdown.ID
|
||||||
|
|
||||||
|
return model2.Updates(mSysBreakdown.SysBreakdown, map[string]interface{}{
|
||||||
|
"title": title, "remark": remark,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
mSysBreakdown.Title = title
|
||||||
|
mSysBreakdown.Remark = remark
|
||||||
|
return model2.Create(mSysBreakdown.SysBreakdown)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete 删除操作
|
||||||
func (c *Breakdown) Delete(id uint64) error {
|
func (c *Breakdown) Delete(id uint64) error {
|
||||||
return nil
|
mSysBreakdown := model.NewSysBreakdown()
|
||||||
|
mSysBreakdown.ID = id
|
||||||
|
return model2.Delete(mSysBreakdown.SysBreakdown)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBreakdown() BreakdownHandle {
|
func NewBreakdown() BreakdownHandle {
|
||||||
|
103
app/controller/work/person.go
Normal file
103
app/controller/work/person.go
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
package work
|
||||||
|
|
||||||
|
import (
|
||||||
|
model2 "ArmedPolice/app/common/model"
|
||||||
|
"ArmedPolice/app/controller/basic"
|
||||||
|
"ArmedPolice/app/model"
|
||||||
|
"ArmedPolice/app/service"
|
||||||
|
"ArmedPolice/serve/orm"
|
||||||
|
"errors"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Person struct{ *service.Session }
|
||||||
|
|
||||||
|
type PersonHandle func(session *service.Session) *Person
|
||||||
|
|
||||||
|
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(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// 无下一流程,工单直接完成
|
||||||
|
if newNextScheduleInfo == nil {
|
||||||
|
goto FINISH
|
||||||
|
}
|
||||||
|
workUpdates["status"] = model2.WorkInstanceStatusForOngoing
|
||||||
|
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}
|
||||||
|
}
|
||||||
|
}
|
@ -43,10 +43,10 @@ func (m *ManageMaterial) Materials(page, pageSize int, count *int64, where ...*m
|
|||||||
}
|
}
|
||||||
out := make([]*ManageMaterialInfo, 0)
|
out := make([]*ManageMaterialInfo, 0)
|
||||||
|
|
||||||
if err := db.Order("p.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
if err := db.Count(count).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := db.Count(count).Error; err != nil {
|
if err := db.Order("p.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
|
@ -33,10 +33,10 @@ func (m *ManageMaterialPurchase) Purchases(page, pageSize int, count *int64, whe
|
|||||||
}
|
}
|
||||||
out := make([]*ManageMaterialPurchaseInfo, 0)
|
out := make([]*ManageMaterialPurchaseInfo, 0)
|
||||||
|
|
||||||
if err := db.Order("p.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
if err := db.Count(count).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := db.Count(count).Error; err != nil {
|
if err := db.Order("p.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
|
@ -58,10 +58,10 @@ func (m *SysUser) Users(page, pageSize int, count *int64, where ...*model.ModelW
|
|||||||
db = db.Where(wo.Condition, wo.Value)
|
db = db.Where(wo.Condition, wo.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := db.Order("u.id " + model.OrderModeToAsc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
if err := db.Count(count).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := db.Count(count).Error; err != nil {
|
if err := db.Order("u.id " + model.OrderModeToAsc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
|
@ -40,10 +40,10 @@ func (m *WorkInstance) Instances(page, pageSize int, count *int64, where ...*mod
|
|||||||
}
|
}
|
||||||
out := make([]*WorkInstanceInfo, 0)
|
out := make([]*WorkInstanceInfo, 0)
|
||||||
|
|
||||||
if err := db.Order("w.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
if err := orm.GetDB().Table(m.TableName()).Where("is_deleted = ?", model.DeleteStatusForNot).Count(count).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := db.Count(count).Error; err != nil {
|
if err := db.Order("w.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
|
11
app/model/work_progress.go
Normal file
11
app/model/work_progress.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "ArmedPolice/app/common/model"
|
||||||
|
|
||||||
|
type WorkProgress struct {
|
||||||
|
*model.WorkProgress
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWorkProgress() *WorkProgress {
|
||||||
|
return &WorkProgress{model.NewWorkProgress()}
|
||||||
|
}
|
55
app/model/work_schedule.go
Normal file
55
app/model/work_schedule.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ArmedPolice/app/common/model"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WorkSchedule struct {
|
||||||
|
*model.WorkSchedule
|
||||||
|
}
|
||||||
|
|
||||||
|
// WorkScheduleInfo 工单流程信息
|
||||||
|
type WorkScheduleInfo struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
Reviewer []uint64 `json:"reviewer"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateAuth 验证权限
|
||||||
|
func (m *WorkSchedule) ValidateAuth(uid uint64) (bool, error) {
|
||||||
|
// 流程权限信息
|
||||||
|
auths := make(map[string]bool, 0)
|
||||||
|
|
||||||
|
for _, v := range m.GetTargetValueAttribute() {
|
||||||
|
auths[v] = true
|
||||||
|
}
|
||||||
|
// 触发审核对象
|
||||||
|
switch m.Target {
|
||||||
|
case model.WorkScheduleTargetForPerson: // 个人
|
||||||
|
_, has := auths[fmt.Sprintf("%d", uid)]
|
||||||
|
return has, nil
|
||||||
|
case model.WorkScheduleTargetForRole: // 角色
|
||||||
|
// 查询角色信息
|
||||||
|
roleIDs := make([]uint64, 0)
|
||||||
|
mSysUserRole := model.NewSysUserRole()
|
||||||
|
|
||||||
|
if err := model.Pluck(mSysUserRole, "role_id", &roleIDs, model.NewWhere("uid", uid)); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
for _, v := range roleIDs {
|
||||||
|
if _, has := auths[fmt.Sprintf("%d", v)]; has {
|
||||||
|
return has, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *WorkSchedule) NextSchedule() (*WorkScheduleInfo, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWorkSchedule() *WorkSchedule {
|
||||||
|
return &WorkSchedule{model.NewWorkSchedule()}
|
||||||
|
}
|
Reference in New Issue
Block a user