Files
2021-11-16 11:46:44 +08:00

245 lines
6.9 KiB
Go

package work
import (
model2 "ArmedPolice/app/common/model"
"ArmedPolice/app/controller/basic"
"ArmedPolice/app/model"
"ArmedPolice/app/service"
"ArmedPolice/serve/orm"
"ArmedPolice/utils"
"errors"
"gorm.io/gorm"
"time"
)
type Repair struct{ *service.Session }
type RepairHandle func(session *service.Session) *Repair
type (
// RepairInfo 基本信息
RepairInfo struct {
basic.CommonIDString
*model.WorkRepairInfo
}
// RepairDetailInfo 详细信息
RepairDetailInfo struct {
*RepairInfo
Details []*model2.WorkRepairDetail `json:"details"`
}
)
// List 列表信息
func (c *Repair) List(orderNo, equipmentCode, equipmentTitle string, page, pageSize int) (*basic.PageDataResponse, error) {
mWorkRepair := model.NewWorkRepair()
where := make([]*model2.ModelWhere, 0)
if orderNo != "" {
where = append(where, model2.NewWhereLike("r.order_no", orderNo))
}
if equipmentCode != "" {
where = append(where, model2.NewWhereLike("w.code", equipmentCode))
}
if equipmentTitle != "" {
where = append(where, model2.NewWhereLike("w.title", equipmentTitle))
}
var count int64
out, err := mWorkRepair.Repairs(page, pageSize, &count, where...)
if err != nil {
return nil, err
}
list := make([]*RepairInfo, 0)
for _, v := range out {
list = append(list, &RepairInfo{
CommonIDString: basic.CommonIDString{v.GetEncodeID()},
WorkRepairInfo: v,
})
}
return &basic.PageDataResponse{Data: nil, Count: 0}, nil
}
// Detail 详细信息
func (c *Repair) Detail(id uint64) (*RepairDetailInfo, error) {
repair, err := model.NewWorkRepair().Detail(id)
if err != nil {
return nil, err
}
details := make([]*model2.WorkRepairDetail, 0)
if err = model2.Find(model.NewWorkRepairDetail().WorkRepairDetail, &details, &model2.ModelWhereOrder{
Where: model2.NewWhere("repair_id", id),
Order: model2.NewOrder("id", model2.OrderModeToAsc),
}); err != nil {
return nil, err
}
return &RepairDetailInfo{
RepairInfo: &RepairInfo{
CommonIDString: basic.CommonIDString{repair.GetEncodeID()},
WorkRepairInfo: repair,
},
Details: details,
}, nil
}
// Begin 开始维修操作
func (c *Repair) Begin(id uint64, remark string) error {
mWorkRepair := model.NewWorkRepair()
mWorkRepair.ID = id
isExist, err := model2.FirstField(mWorkRepair.WorkRepair, []string{"id", "status"})
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,维修工单信息不存在或已被删除")
}
if mWorkRepair.Status != model2.WorkRepairStatusForNotBegin {
return errors.New("操作错误,维修工单状态异常,不可操作")
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Updates(mWorkRepair.WorkRepair, map[string]interface{}{
"status": model2.WorkRepairStatusForOngoing, "updated_at": time.Now(),
}, tx); err != nil {
return err
}
// 维修工单详情
mWorkRepairDetail := model.NewWorkRepairDetail()
mWorkRepairDetail.UID = c.UID
mWorkRepairDetail.RepairID = id
mWorkRepairDetail.Tage = model2.WorkRepairDetailTagsForBegin
mWorkRepairDetail.Remark = remark
if err = model2.Create(mWorkRepairDetail.WorkRepairDetail, tx); err != nil {
return err
}
return nil
})
}
// Finish 完成维修操作
func (c *Repair) Finish(id uint64, image, remark string) error {
mWorkRepair := model.NewWorkRepair()
mWorkRepair.ID = id
isExist, err := model2.FirstField(mWorkRepair.WorkRepair, []string{"id", "status"})
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,维修工单信息不存在或已被删除")
}
if mWorkRepair.Status != model2.WorkRepairStatusForOngoing {
return errors.New("操作错误,维修工单状态异常,不可操作")
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Updates(mWorkRepair.WorkRepair, map[string]interface{}{
"status": model2.WorkRepairStatusForFinished, "updated_at": time.Now(),
}, tx); err != nil {
return err
}
// 维修工单详情
mWorkRepairDetail := model.NewWorkRepairDetail()
mWorkRepairDetail.UID = c.UID
mWorkRepairDetail.RepairID = id
mWorkRepairDetail.Tage = model2.WorkRepairDetailTagsForFinish
mWorkRepairDetail.Remark = remark
mWorkRepairDetail.Other = utils.AnyToJSON(&model2.WorkRepairDetailForFinish{Image: image})
if err = model2.Create(mWorkRepairDetail.WorkRepairDetail, tx); err != nil {
return err
}
return nil
})
}
// Evaluate 评价
func (c *Repair) Evaluate(id uint64, score float64) error {
mWorkRepair := model.NewWorkRepair()
mWorkRepair.ID = id
isExist, err := model2.FirstField(mWorkRepair.WorkRepair, []string{"id", "work_id", "status", "is_evaluate"})
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,维修工单信息不存在或已被删除")
}
if mWorkRepair.Status != model2.WorkRepairStatusForFinished {
return errors.New("操作错误,维修工单状态异常,不可操作")
}
if mWorkRepair.IsEvaluate != model2.WorkRepairStatusEvaluateForNot {
return errors.New("操作错误,当前工单已评价,不可重复评价")
}
// 查询工单下使用的器材供应商信息
mWorkMaterial := model.NewWorkMaterial()
supplierIDs := make([]uint64, 0)
if err = model2.Pluck(mWorkMaterial.WorkMaterial, "material_supplier_id", &supplierIDs,
model2.NewWhere("work_id", mWorkRepair.WorkID)); err != nil {
return err
}
_supplierIDs := utils.ArrayUnique(supplierIDs)
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Updates(mWorkRepair.WorkRepair, map[string]interface{}{
"is_evaluate": model2.WorkRepairStatusEvaluateForYes, "evaluate_score": score, "updated_at": time.Now(),
}, tx); err != nil {
return err
}
updates := map[string]interface{}{
"updated_at": time.Now(),
}
if score == 1 {
updates["praise"] = gorm.Expr("praise + ?", 1)
} else if score == 2 {
updates["middle"] = gorm.Expr("middle + ?", 1)
} else {
updates["negative"] = gorm.Expr("negative + ?", 1)
}
mManageSupplierEvaluate := model.NewManageSupplierEvaluate()
supplierEvaluates := make([]*model2.ManageSupplierEvaluate, 0)
for _, v := range _supplierIDs {
// 查询是否存在
if isExist, err = model2.FirstField(mManageSupplierEvaluate.ManageSupplierEvaluate, []string{"id"},
model2.NewWhere("id", v)); err != nil {
return err
} else if !isExist {
if err = model2.Updates(mManageSupplierEvaluate.ManageSupplierEvaluate, updates, tx); err != nil {
return err
}
continue
}
data := &model2.ManageSupplierEvaluate{SupplierID: v.(uint64)}
if score == 1 {
data.Praise = 1
} else if score == 2 {
data.Middle = 2
} else {
data.Negative = 1
}
supplierEvaluates = append(supplierEvaluates, data)
}
if len(supplierEvaluates) > 0 {
if err = model2.Creates(mManageSupplierEvaluate.ManageSupplierEvaluate, supplierEvaluates, tx); err != nil {
return err
}
}
return nil
})
}
func NewRepair() RepairHandle {
return func(session *service.Session) *Repair {
return &Repair{session}
}
}