2021-11-05 15:27:04 +08:00
package model
import (
"ArmedPolice/app/common/model"
"ArmedPolice/serve/orm"
"fmt"
2021-11-10 11:26:40 +08:00
"strings"
2021-11-05 15:27:04 +08:00
"time"
)
type WorkInstance struct {
* model . WorkInstance
}
2021-11-15 17:32:23 +08:00
type (
// WorkInstanceInfo 基本信息
WorkInstanceInfo struct {
ID uint64 ` json:"-" `
Title string ` json:"title" `
2021-11-18 09:51:39 +08:00
OrderNo string ` json:"order_no" `
2021-11-15 17:32:23 +08:00
Kind model . WorkInstanceKind ` json:"kind" `
2021-11-19 15:34:22 +08:00
EquipmentID uint64 ` json:"-" `
2021-11-15 17:32:23 +08:00
EquipmentCode string ` json:"equipment_code" `
EquipmentTitle string ` json:"equipment_title" `
2021-11-22 14:06:49 +08:00
Breakdown string ` json:"-" `
2021-11-15 17:32:23 +08:00
BreakdownTitle string ` json:"breakdown_title" `
2021-11-19 15:34:22 +08:00
ScheduleID uint64 ` json:"-" `
2021-11-15 17:32:23 +08:00
ScheduleTitle string ` json:"schedule_title" `
2021-11-18 09:51:39 +08:00
SupplierName string ` json:"-" `
2021-11-15 17:32:23 +08:00
Priority int ` json:"priority" `
Distribution string ` json:"distribution" `
2021-11-19 11:53:20 +08:00
PlateNumber string ` json:"plate_number" `
Remark string ` json:"remark" `
2021-11-15 17:32:23 +08:00
Status int ` json:"status" `
Username string ` json:"username" `
CreatedAt time . Time ` json:"created_at" `
}
// WorkInstanceStaticInfo 基本统计信息
WorkInstanceStaticInfo struct {
Count int64 ` json:"count" `
Amount float64 ` json:"amount" `
Date string ` json:"date" `
}
)
2021-11-05 15:27:04 +08:00
2021-11-09 18:38:57 +08:00
// WorkbenchCondition 工作台条件
type WorkbenchCondition struct {
2021-11-22 14:06:49 +08:00
UID string
RoleIDs [ ] string
WorkSchedule [ ] uint64
2021-11-09 18:38:57 +08:00
}
2021-11-15 17:32:23 +08:00
func ( m * WorkbenchCondition ) roleInfo ( ) string {
if len ( m . RoleIDs ) <= 0 {
return "''"
}
return strings . Join ( m . RoleIDs , "," )
}
2021-11-22 14:06:49 +08:00
func ( m * WorkbenchCondition ) workScheduleInfo ( ) string {
if len ( m . WorkSchedule ) <= 0 {
return "''"
}
out := make ( [ ] string , 0 )
for _ , v := range m . WorkSchedule {
out = append ( out , fmt . Sprintf ( "%d" , v ) )
}
return strings . Join ( out , "," )
}
2021-11-11 14:05:52 +08:00
// Detail 详细信息
func ( m * WorkInstance ) Detail ( id uint64 ) ( * WorkInstanceInfo , error ) {
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
2021-11-19 15:34:22 +08:00
Select ( "w.id" , "w.kind" , "w.title" , "w.equipment_id" , "e.code AS equipment_code" , "e.title AS equipment_title" , "w.priority" ,
2021-11-22 14:06:49 +08:00
"w.breakdown" ,
//"(SELECT GROUP_CONCAT(s_b.title) FROM ( SELECT id, title FROM sys_breakdown) AS s_b WHERE FIND_IN_SET( s_b.id, w.breakdown )) AS breakdown_title",
2021-11-19 15:34:22 +08:00
"w.schedule AS schedule_id" , "s.title AS schedule_title" , "supplier.name AS supplier_name" , "w.distribution" , "w.plate_number" , "w.remark" , "w.status" , "w.created_at" ) .
2021-11-11 14:05:52 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS e ON w.equipment_id = e.id" , model . NewManageEquipment ( ) . TableName ( ) ) ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS s ON w.schedule = s.id" , model . NewWorkSchedule ( ) . TableName ( ) ) ) .
2021-11-18 09:51:39 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS supplier ON w.supplier_id = supplier.id" , model . NewManageSupplier ( ) . TableName ( ) ) ) .
2021-11-11 14:05:52 +08:00
Where ( "w.id = ?" , id )
out := new ( WorkInstanceInfo )
if err := db . Scan ( & out ) . Error ; err != nil {
return nil , err
}
return out , nil
}
2021-11-05 15:27:04 +08:00
// Instances 基本信息
func ( m * WorkInstance ) Instances ( page , pageSize int , count * int64 , where ... * model . ModelWhere ) ( [ ] * WorkInstanceInfo , error ) {
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
2021-11-18 09:51:39 +08:00
Select ( "w.id" , "w.order_no" , "w.title" , "e.code AS equipment_code" , "e.title AS equipment_title" , "w.priority" ,
2021-11-22 14:06:49 +08:00
"w.breakdown" ,
//"(SELECT GROUP_CONCAT(s_b.title) FROM ( SELECT id, title FROM sys_breakdown) AS s_b WHERE FIND_IN_SET( s_b.id, w.breakdown )) AS breakdown_title",
2021-11-15 17:32:23 +08:00
"s.title AS schedule_title" , "w.status" , "u.name AS username" , "w.created_at" ) .
2021-11-08 17:42:23 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS e ON w.equipment_id = e.id" , model . NewManageEquipment ( ) . TableName ( ) ) ) .
2021-11-10 11:26:40 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS s ON w.schedule = s.id" , model . NewWorkSchedule ( ) . TableName ( ) ) ) .
2021-11-15 17:32:23 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS u ON w.uid = u.uuid" , model . NewSysUser ( ) . TableName ( ) ) ) .
2021-11-09 18:38:57 +08:00
Where ( "w.is_deleted = ?" , model . DeleteStatusForNot )
2021-11-05 15:27:04 +08:00
if len ( where ) > 0 {
for _ , wo := range where {
db = db . Where ( wo . Condition , wo . Value )
}
}
out := make ( [ ] * WorkInstanceInfo , 0 )
2021-11-09 18:38:57 +08:00
if err := db . Count ( count ) . Error ; err != nil {
2021-11-05 15:27:04 +08:00
return nil , err
}
2021-11-09 18:38:57 +08:00
2021-11-05 18:07:32 +08:00
if err := db . Order ( "w.id " + model . OrderModeToDesc ) . Offset ( ( page - 1 ) * pageSize ) . Limit ( pageSize ) . Scan ( & out ) . Error ; err != nil {
2021-11-05 15:27:04 +08:00
return nil , err
}
return out , nil
}
2021-11-09 14:08:02 +08:00
// Persons 个人信息
2021-11-15 17:32:23 +08:00
func ( m * WorkInstance ) Persons ( uid uint64 , page , pageSize int , count * int64 , where ... * model . ModelWhere ) ( [ ] * WorkInstanceInfo , error ) {
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
2021-11-18 09:51:39 +08:00
Select ( "w.id" , "w.order_no" , "w.title" , "e.code AS equipment_code" , "e.title AS equipment_title" , "w.priority" ,
2021-11-22 14:06:49 +08:00
"w.breakdown" ,
//"(SELECT GROUP_CONCAT(s_b.title) FROM ( SELECT id, title FROM sys_breakdown) AS s_b WHERE FIND_IN_SET( s_b.id, w.breakdown )) AS breakdown_title",
2021-11-10 11:26:40 +08:00
"s.title AS schedule_title" , "w.status" , "w.created_at" ) .
2021-11-09 14:08:02 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS e ON w.equipment_id = e.id" , model . NewManageEquipment ( ) . TableName ( ) ) ) .
2021-11-15 17:32:23 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS s ON w.schedule = s.id" , model . NewWorkSchedule ( ) . TableName ( ) ) ) .
Where ( "w.uid = ? AND w.is_deleted = ?" , uid , model . DeleteStatusForNot )
2021-11-09 14:08:02 +08:00
if len ( where ) > 0 {
for _ , wo := range where {
db = db . Where ( wo . Condition , wo . Value )
}
}
out := make ( [ ] * WorkInstanceInfo , 0 )
2021-11-09 18:38:57 +08:00
if err := db . Count ( count ) . Error ; err != nil {
2021-11-09 14:08:02 +08:00
return nil , err
}
if err := db . Order ( "w.id " + model . OrderModeToDesc ) . Offset ( ( page - 1 ) * pageSize ) . Limit ( pageSize ) . Scan ( & out ) . Error ; err != nil {
return nil , err
}
return out , nil
}
2021-11-09 18:38:57 +08:00
// Workbench 个人信息
2021-11-15 17:32:23 +08:00
func ( m * WorkInstance ) Workbench ( condition * WorkbenchCondition , limit int , where ... * model . ModelWhere ) ( [ ] * WorkInstanceInfo , error ) {
2021-11-10 11:26:40 +08:00
mWorkSchedule := model . NewWorkSchedule ( )
2021-11-22 14:06:49 +08:00
// _condition := fmt.Sprintf(`CASE %s
//WHEN %d THEN
//(SELECT GROUP_CONCAT(a.id) FROM (SELECT id FROM %s WHERE target = %d AND target_value IN (%s)) AS a)
//WHEN %d THEN
//(SELECT GROUP_CONCAT(a.id) FROM (SELECT id FROM %s WHERE target = %d AND target_value IN (%s)) AS a)
//ELSE "" END`, "s.target",
// model.WorkScheduleTargetForPerson,
// mWorkSchedule.TableName(), model.WorkScheduleTargetForPerson, condition.UID,
// model.WorkScheduleTargetForRole,
// mWorkSchedule.TableName(), model.WorkScheduleTargetForRole, condition.roleInfo())
2021-11-15 17:32:23 +08:00
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
2021-11-18 09:51:39 +08:00
Select ( "w.id" , "w.order_no" , "w.title" , "e.code AS equipment_code" , "e.title AS equipment_title" , "w.priority" ,
2021-11-22 14:06:49 +08:00
"w.breakdown" ,
// TODO: 因mysql与sqlite3中Find_In_Set不兼容, 故只能将其注释, 更改为组合查询
//"(SELECT GROUP_CONCAT(s_b.title) FROM (SELECT id, title FROM sys_breakdown) AS s_b WHERE FIND_IN_SET( s_b.id, w.breakdown )) AS breakdown_title",
2021-11-15 17:32:23 +08:00
"s.title AS schedule_title" , "w.status" , "u.name AS username" , "w.created_at" ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS e ON w.equipment_id = e.id" , model . NewManageEquipment ( ) . TableName ( ) ) ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS s ON w.schedule = s.id" , mWorkSchedule . TableName ( ) ) ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS u ON w.uid = u.uuid" , model . NewSysUser ( ) . TableName ( ) ) ) .
Where ( "w.is_deleted = ?" , model . DeleteStatusForNot ) .
2021-11-18 09:51:39 +08:00
Where ( "w.status = ?" , model . WorkInstanceStatusForOngoing ) .
2021-11-22 14:06:49 +08:00
//Where(fmt.Sprintf("w.schedule IN (%s)", _condition))
Where ( "w.schedule IN (?)" , condition . WorkSchedule )
2021-11-15 17:32:23 +08:00
if len ( where ) > 0 {
for _ , wo := range where {
db = db . Where ( wo . Condition , wo . Value )
}
}
out := make ( [ ] * WorkInstanceInfo , 0 )
if err := db . Order ( "w.id " + model . OrderModeToDesc ) . Limit ( limit ) . Scan ( & out ) . Error ; err != nil {
return nil , err
}
return out , nil
}
2021-11-16 16:39:21 +08:00
// Workbenchs 待办信息
2021-11-15 17:32:23 +08:00
func ( m * WorkInstance ) Workbenchs ( condition * WorkbenchCondition , page , pageSize int , count * int64 , where ... * model . ModelWhere ) ( [ ] * WorkInstanceInfo , error ) {
mWorkSchedule := model . NewWorkSchedule ( )
2021-11-22 14:06:49 +08:00
// _condition := fmt.Sprintf(`CASE %s
//WHEN %d THEN
//(SELECT GROUP_CONCAT(a.id) FROM (SELECT id FROM %s WHERE target = %d AND target_value IN (%s)) AS a)
//WHEN %d THEN
//(SELECT GROUP_CONCAT(a.id) FROM (SELECT id FROM %s WHERE target = %d AND target_value IN (%s)) AS a)
//ELSE "" END`, "s.target",
// model.WorkScheduleTargetForPerson,
// mWorkSchedule.TableName(), model.WorkScheduleTargetForPerson, condition.UID,
// model.WorkScheduleTargetForRole,
// mWorkSchedule.TableName(), model.WorkScheduleTargetForRole, condition.roleInfo())
2021-11-10 11:26:40 +08:00
2021-11-09 18:38:57 +08:00
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
2021-11-18 09:51:39 +08:00
Select ( "w.id" , "w.order_no" , "w.title" , "e.code AS equipment_code" , "e.title AS equipment_title" , "w.priority" ,
2021-11-22 14:06:49 +08:00
"w.breakdown" ,
//"(SELECT GROUP_CONCAT(s_b.title) FROM (SELECT id, title FROM sys_breakdown) AS s_b WHERE FIND_IN_SET( s_b.id, w.breakdown )) AS breakdown_title",
2021-11-18 09:51:39 +08:00
"s.title AS schedule_title" , "w.status" , "u.name AS username" , "w.created_at" ) .
2021-11-09 18:38:57 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS e ON w.equipment_id = e.id" , model . NewManageEquipment ( ) . TableName ( ) ) ) .
2021-11-10 11:26:40 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS s ON w.schedule = s.id" , mWorkSchedule . TableName ( ) ) ) .
2021-11-18 09:51:39 +08:00
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS u ON w.uid = u.uuid" , model . NewSysUser ( ) . TableName ( ) ) ) .
2021-11-10 11:26:40 +08:00
Where ( "w.is_deleted = ?" , model . DeleteStatusForNot ) .
2021-11-18 09:51:39 +08:00
Where ( "w.status = ?" , model . WorkInstanceStatusForOngoing ) .
2021-11-22 14:06:49 +08:00
//Where(fmt.Sprintf("w.schedule IN (%s)", _condition))
Where ( "w.schedule IN (?)" , condition . WorkSchedule )
2021-11-09 18:38:57 +08:00
if len ( where ) > 0 {
for _ , wo := range where {
db = db . Where ( wo . Condition , wo . Value )
}
}
out := make ( [ ] * WorkInstanceInfo , 0 )
2021-11-10 11:26:40 +08:00
if err := db . Count ( count ) . Error ; err != nil {
return nil , err
}
2021-11-09 18:38:57 +08:00
if err := db . Order ( "w.id " + model . OrderModeToDesc ) . Offset ( ( page - 1 ) * pageSize ) . Limit ( pageSize ) . Scan ( & out ) . Error ; err != nil {
return nil , err
}
return out , nil
}
2021-11-15 17:32:23 +08:00
func ( m * WorkInstance ) Static ( where ... * model . ModelWhere ) ( [ ] * WorkInstanceStaticInfo , error ) {
db := orm . GetDB ( ) . Table ( m . TableName ( ) + " AS w" ) .
Select ( "COUNT(w.id) AS count" , "SUM(m.price * w_m.material_number) AS amount" ,
"SUBSTRING(w.created_at, 1, 10) AS date" ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS w_m ON w.id = w_m.work_id" , model . NewWorkMaterial ( ) . TableName ( ) ) ) .
Joins ( fmt . Sprintf ( "LEFT JOIN %s AS m ON w_m.material_id = m.id" , model . NewManageMaterial ( ) . TableName ( ) ) ) .
Where ( "w.is_deleted = ?" , model . DeleteStatusForNot )
if len ( where ) > 0 {
for _ , wo := range where {
db = db . Where ( wo . Condition , wo . Value )
}
}
out := make ( [ ] * WorkInstanceStaticInfo , 0 )
if err := db . Group ( "SUBSTRING(w.created_at, 1, 10)" ) . Scan ( & out ) . Error ; err != nil {
return nil , err
}
return out , nil
}
2021-11-05 15:27:04 +08:00
func NewWorkInstance ( ) * WorkInstance {
return & WorkInstance { model . NewWorkInstance ( ) }
}