package model import ( "apsClient/pkg/sqlitex" "encoding/json" "fmt" "github.com/jinzhu/gorm" ) type ( Dashboard struct { CommonModel Version string DeviceRunningAmount int //开机台数 TotalProductionAmount int //总产量 WorkOrderAmount int64 //生产工单数 DelayWorkOrderAmount int64 //延期交付工单数 MaterialMissWorkOrderAmount int //物料不足工单数 WaitSchedulingWorkOrderAmount int //待排程工单数(库存充足未锁定 和 已锁定库存未排程的工单) PlanOrderFinishRate int64 //计划达成率 TotalDeviceAmount int64 //总设备数 InMaintenanceDeviceAmount int64 //维修中设备数 InternalDeviceRunningAmount int //自有开机台数 ExternalDeviceRunningAmount int //外加工台数 OutPlanProductionAmount int //计划外加工数 PlanProductionAmount int //计划加工数 RealExternalProductionAmount int //实际外加工数 RealProductionAmount int //实际生产数 WorkOrderFinishRate int //近一周工单完成率 DeviceLoadData string //设备负荷对比分析 DeviceLoad []*CommonStats `gorm:"-"` //设备负荷对比分析 MaterialRequirementData string //物料需求统计 MaterialRequirement []*CommonStats `gorm:"-"` //物料需求统计 OrderFinishRateData string //订单完成比率 OrderFinishRate []*CommonStats `gorm:"-"` //订单完成比率 PersonnelProductivityData string //人员生产效率 PersonnelProductivity []*CommonStats `gorm:"-"` //人员生产效率 WorkerTypeStatsData string //人员工种分析 WorkerTypeStats []*CommonStats `gorm:"-"` //人员工种分析 TodayFinishAmount int64 //车间当日合计生产 TodayQualifiedRate string //车间当日正品率 WorkshopStatsData string //车间统计 WorkshopStats []*WorkshopStats `gorm:"-"` //车间统计 WorkOrderStatsData string //工单进度统计 WorkOrderStats []*WorkOrderStats `gorm:"-"` //工单进度统计 } CommonStats struct { Name string Value string } WorkshopStats struct { Name string //车间名称 Total int64 //生产总数 Qualified int64 //正品数量 Defective int //次品数量 Percent int //正品率 } WorkOrderStats struct { Number string //编号 Product string //产品 Scale string //规格 Amount int64 //生产数量 PlanTime string //计划时间 DelayDays int //延期天数 ProcedureNum int //工序数量 FinishProcedureNum int //已完成工序数量 ProcessingProcedureNum int //进行中工序数量 } DashboardSearch struct { Dashboard Order string PageNum int PageSize int Orm *gorm.DB } ) const ( VersionV1 = "v1" //12月9号央视访问版本 ) func (slf *Dashboard) TableName() string { return "dashboard" } func (slf *Dashboard) AfterFind(db *gorm.DB) error { var deviceLoad []*CommonStats var materialRequirement []*CommonStats var orderFinishRate []*CommonStats var personnelProductivity []*CommonStats var workerTypeStats []*CommonStats var workshopStats []*WorkshopStats var workOrderStats []*WorkOrderStats var err error if slf.DeviceLoadData != "" { if err = json.Unmarshal([]byte(slf.DeviceLoadData), &deviceLoad); err == nil { slf.DeviceLoad = deviceLoad slf.DeviceLoadData = "" } } if slf.MaterialRequirementData != "" { if err = json.Unmarshal([]byte(slf.MaterialRequirementData), &materialRequirement); err == nil { slf.MaterialRequirement = materialRequirement slf.MaterialRequirementData = "" } } if slf.OrderFinishRateData != "" { if err = json.Unmarshal([]byte(slf.OrderFinishRateData), &orderFinishRate); err == nil { slf.OrderFinishRate = orderFinishRate slf.OrderFinishRateData = "" } } if slf.PersonnelProductivityData != "" { if err = json.Unmarshal([]byte(slf.PersonnelProductivityData), &personnelProductivity); err == nil { slf.PersonnelProductivity = personnelProductivity slf.PersonnelProductivityData = "" } } if slf.WorkerTypeStatsData != "" { if err = json.Unmarshal([]byte(slf.WorkerTypeStatsData), &workerTypeStats); err == nil { slf.WorkerTypeStats = workerTypeStats slf.WorkerTypeStatsData = "" } } if slf.WorkshopStatsData != "" { if err = json.Unmarshal([]byte(slf.WorkshopStatsData), &workshopStats); err == nil { slf.WorkshopStats = workshopStats slf.WorkshopStatsData = "" } } if slf.WorkOrderStatsData != "" { if err = json.Unmarshal([]byte(slf.WorkOrderStatsData), &workOrderStats); err == nil { slf.WorkOrderStats = workOrderStats slf.WorkOrderStatsData = "" } } return nil } func NewDashboardSearch(db *gorm.DB) *DashboardSearch { if db == nil { db = sqlitex.GetDB() } return &DashboardSearch{Orm: db} } func (slf *DashboardSearch) SetOrm(tx *gorm.DB) *DashboardSearch { slf.Orm = tx return slf } func (slf *DashboardSearch) SetPage(page, size int) *DashboardSearch { slf.PageNum, slf.PageSize = page, size return slf } func (slf *DashboardSearch) SetOrder(order string) *DashboardSearch { slf.Order = order return slf } func (slf *DashboardSearch) SetId(id uint) *DashboardSearch { slf.ID = id return slf } func (slf *DashboardSearch) SetVersion(version string) *DashboardSearch { slf.Version = version return slf } func (slf *DashboardSearch) build() *gorm.DB { var db = slf.Orm.Model(&Dashboard{}) if slf.Order != "" { db = db.Order(slf.Order) } if slf.Version == "" { slf.Version = VersionV1 } db = db.Where("version = ?", VersionV1) if slf.ID != 0 { db = db.Where("id = ?", slf.ID) } return db } // Create 单条插入 func (slf *DashboardSearch) Create(record *Dashboard) error { var db = slf.build() if err := db.Create(record).Error; err != nil { return fmt.Errorf("create err: %v, record: %+v", err, record) } return nil } // CreateBatch 批量插入 func (slf *DashboardSearch) CreateBatch(records []*Dashboard) error { var db = slf.build() for _, record := range records { if err := db.Create(record).Error; err != nil { return fmt.Errorf("create batch err: %v, records: %+v", err, records) } } return nil } func (slf *DashboardSearch) Upsert(record *Dashboard) error { var db = slf.build() old, err := slf.First() if err != gorm.ErrRecordNotFound && old.ID != 0 { record.ID = old.ID err = db.Save(&record).Error } else { err = db.Create(&record).Error } if err != nil { return fmt.Errorf("save err: %v, record: %+v", err, record) } return nil } func (slf *DashboardSearch) Save(record *Dashboard) error { var db = slf.build() if err := db.Save(record).Error; err != nil { return fmt.Errorf("save err: %v, record: %+v", err, record) } return nil } func (slf *DashboardSearch) UpdateByMap(upMap map[string]interface{}) error { var ( db = slf.build() ) if err := db.Updates(upMap).Error; err != nil { return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap) } return nil } func (slf *DashboardSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error { var ( db = slf.Orm.Table(slf.TableName()).Where(query, args...) ) if err := db.Updates(upMap).Error; err != nil { return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap) } return nil } func (slf *DashboardSearch) Delete() error { var db = slf.build() if err := db.Unscoped().Delete(&Dashboard{}).Error; err != nil { return err } return nil } func (slf *DashboardSearch) First() (*Dashboard, error) { var ( record = new(Dashboard) db = slf.build() ) if err := db.First(record).Error; err != nil { return record, err } return record, nil } func (slf *DashboardSearch) Find() ([]*Dashboard, int64, error) { var ( records = make([]*Dashboard, 0) total int64 db = slf.build() ) if err := db.Count(&total).Error; err != nil { return records, total, fmt.Errorf("find count err: %v", err) } if slf.PageNum*slf.PageSize > 0 { db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize) } if err := db.Find(&records).Error; err != nil { return records, total, fmt.Errorf("find records err: %v", err) } return records, total, nil } func (slf *DashboardSearch) Count() (int64, error) { var ( total int64 db = slf.build() ) if err := db.Count(&total).Error; err != nil { return total, fmt.Errorf("find count err: %v", err) } return total, nil } func (slf *DashboardSearch) FindNotTotal() ([]*Dashboard, error) { var ( records = make([]*Dashboard, 0) db = slf.build() ) if slf.PageNum*slf.PageSize > 0 { db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize) } if err := db.Find(&records).Error; err != nil { return records, fmt.Errorf("find records err: %v", err) } return records, nil } // FindByQuery 指定条件查询. func (slf *DashboardSearch) FindByQuery(query string, args []interface{}) ([]*Dashboard, int64, error) { var ( records = make([]*Dashboard, 0) total int64 db = slf.Orm.Table(slf.TableName()).Where(query, args...) ) if err := db.Count(&total).Error; err != nil { return records, total, fmt.Errorf("find by query count err: %v", err) } if slf.PageNum*slf.PageSize > 0 { db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize) } if err := db.Find(&records).Error; err != nil { return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args) } return records, total, nil } // FindByQueryNotTotal 指定条件查询&不查询总条数. func (slf *DashboardSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*Dashboard, error) { var ( records = make([]*Dashboard, 0) db = slf.Orm.Table(slf.TableName()).Where(query, args...) ) if slf.PageNum*slf.PageSize > 0 { db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize) } if err := db.Find(&records).Error; err != nil { return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args) } return records, nil }