package main import ( "fmt" "reflect" "time" "git.ouxuan.net/hasaki-service/hasaki-sdk/hskdb" "git.ouxuan.net/hasaki-service/hasaki-sdk/hskgin" "git.ouxuan.net/hasaki-service/hasaki-sdk/hsklogger/L" "git.ouxuan.net/hasaki-service/hasaki-sdk/hsktime" "git.ouxuan.net/hasaki-service/hasaki-sdk/hskutils" "github.com/spf13/cast" "github.com/tidwall/gjson" "xorm.io/builder" "xorm.io/xorm" ) type Temp3A60 struct { Id int service string QueueStatus string } // ----------------------------temp------------------------------------ // wherePrimaryKey 主键查询 func (TempLowHead3A60 *Temp3A60) wherePrimaryKey() (q interface{}, args []interface{}) { //todo 根据需求修改 return "`id`=?", []interface{}{ TempLowHead3A60.Id, } } // wherePrimaryKeyWithCond 主键查询 func (TempLowHead3A60 *Temp3A60) wherePrimaryKeyWithCond() builder.Cond { //todo 根据需求修改 return nil } // whereDataWithCond 列表查询 func (TempLowHead3A60 *Temp3A60) whereDataWithCond() builder.Cond { //todo 根据需求修改 return nil } // whereData 列表查询筛选 func (TempLowHead3A60 *Temp3A60) whereData() (q interface{}, args []interface{}) { //todo return "", nil } // orderData 列表查询排序 func (TempLowHead3A60 *Temp3A60) orderData() string { //todo return "`id` desc" } // init 数据初始化,可附加更多数据 func (TempLowHead3A60 *Temp3A60) init() { //todo } func (TempLowHead3A60 *Temp3A60) joinTable() (typesAndsqlxAndcondition [][]string) { //todo return [][]string{ // {"LEFT", "(SELECT id as external_brand_id,name as brand_name FROM `ox_brand`) as tmp", "tmp.external_brand_id=brand_id"}, } } // saveAllCols 保存时是否全量保存 func (TempLowHead3A60 *Temp3A60) isSaveAllCols() bool { return false } // insertPretreatment 新增前预处理 func (TempLowHead3A60 *Temp3A60) insertPretreatment() error { //todo return nil } // updatePretreatment 修改前预处理 func (TempLowHead3A60 *Temp3A60) updatePretreatment() error { //todo return nil } // deletePretreatment 删除前预处理 func (TempLowHead3A60 *Temp3A60) deletePretreatment() error { //todo return nil } func (TempLowHead3A60 *Temp3A60) getXorm() *xorm.Engine { //todo return hskdb.GetXormAuto() } // 队列状态 const ( TempLowHead3A60_AutoQueueWait = 2 * time.Second TempLowHead3A60_AutoQueueStatusNone = "None" TempLowHead3A60_AutoQueueStatusWait = "Wait" TempLowHead3A60_AutoQueueStatusIng = "Ing" TempLowHead3A60_AutoQueueStatusSuccess = "Success" TempLowHead3A60_AutoQueueStatusFail = "Fail" ) // 不同service对应的不同队列状态 var TempLowHead3A60_AutoQueueStatusFieldMap = map[string]string{ "service": "queue_status", } // 队列事件 func (TempLowHead3A60 *Temp3A60) queueEvent() error { //todo return nil } // ----------------------------temp------------------------------------ // Save 保存或者新增,通过wherePrimaryKey查不到数据时,新增数据,否则修改数据,参数:isAllCols... func (TempLowHead3A60 *Temp3A60) Save(mustCols ...string) (err error) { if TempLowHead3A60.service == "" { TempLowHead3A60.service = "none" } tmp := Temp3A60{} whereQuery, whereArgs := TempLowHead3A60.wherePrimaryKey() whereCond := TempLowHead3A60.wherePrimaryKeyWithCond() session := TempLowHead3A60.getXorm().NewSession() defer session.Close() if whereQuery != "" { session = session.Where(whereQuery, whereArgs...) } if whereCond != nil { session = session.Where(whereCond) } _, err = session.Get(&tmp) if err != nil { return } if tmp.Id == 0 { err = TempLowHead3A60.insertPretreatment() if err != nil { return } _, err = TempLowHead3A60.getXorm().Insert(TempLowHead3A60) } else { err = TempLowHead3A60.updatePretreatment() if err != nil { return } if len(mustCols) > 0 { _, err = TempLowHead3A60.getXorm().MustCols(mustCols...).Where(whereQuery, whereArgs...).Update(TempLowHead3A60) } else { if TempLowHead3A60.isSaveAllCols() { _, err = TempLowHead3A60.getXorm().AllCols().Where(whereQuery, whereArgs...).Update(TempLowHead3A60) } else { _, err = TempLowHead3A60.getXorm().Where(whereQuery, whereArgs...).Update(TempLowHead3A60) } } } return err } func (TempLowHead3A60 *Temp3A60) Service(key string) *Temp3A60 { TempLowHead3A60.service = key return TempLowHead3A60 } func (TempLowHead3A60 *Temp3A60) getFieldTypes() map[string]reflect.Kind { types := reflect.TypeOf(TempLowHead3A60) fieldType := map[string]reflect.Kind{} for i := 0; i < types.Elem().NumField(); i++ { if types.Elem().Field(i).Type.String() == "hsktime.Time" { fieldType[string(types.Elem().Field(i).Tag.Get("json"))] = reflect.Kind(100) continue } fieldType[string(types.Elem().Field(i).Tag.Get("json"))] = types.Elem().Field(i).Type.Kind() } return fieldType } func (TempLowHead3A60 *Temp3A60) fixSqlRowMap(fieldType map[string]reflect.Kind, raw map[string]interface{}) map[string]interface{} { for i := range raw { // log.Println(i, fieldType[i], cast.ToString(raw[i])) switch fieldType[i] { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: raw[i] = cast.ToInt64(cast.ToString(raw[i])) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: raw[i] = cast.ToUint64(cast.ToString(raw[i])) case reflect.Float32, reflect.Float64: raw[i] = cast.ToFloat64(cast.ToString(raw[i])) case reflect.String: raw[i] = cast.ToString(raw[i]) case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct, reflect.Ptr: raw[i] = gjson.Parse(cast.ToString(raw[i])).Value() //todo case 100: // 2023-09-04 09:53:19 +0000 UTC _time, _ := time.Parse( "2006-01-02 15:04:05 +0000 UTC", cast.ToString(raw[i]), ) raw[i] = hsktime.Time(_time) default: raw[i] = cast.ToString(raw[i]) } } return raw } // Load 为实例载入数据,数据来源取决于wherePrimaryKey查找实例中的数据 func (TempLowHead3A60 *Temp3A60) Load() (err error) { if TempLowHead3A60.service == "" { TempLowHead3A60.service = "none" } whereQuery, whereArgs := TempLowHead3A60.wherePrimaryKey() whereCond := TempLowHead3A60.wherePrimaryKeyWithCond() session := TempLowHead3A60.getXorm().NewSession() defer session.Close() typesAndSqlxAndCndition := TempLowHead3A60.joinTable() isJoin := false for _, v := range typesAndSqlxAndCndition { isJoin = true session = session.Join(v[0], v[1], v[2]) } if whereQuery != "" { session = session.Where(whereQuery, whereArgs...) } if whereCond != nil { session = session.Where(whereCond) } if !isJoin { _, err = session.Get(TempLowHead3A60) if err != nil { return } } else { fieldType := TempLowHead3A60.getFieldTypes() session = session.Table(TempLowHead3A60) raw := map[string]interface{}{} session.Get(&raw) raw = TempLowHead3A60.fixSqlRowMap(fieldType, raw) hskutils.Interface2Struct(raw, TempLowHead3A60) } TempLowHead3A60.init() return } // Data 不进行分页的数据列表 func (TempLowHead3A60 *Temp3A60) Data() (data []Temp3A60) { if TempLowHead3A60.service == "" { TempLowHead3A60.service = "none" } q, args := TempLowHead3A60.whereData() _xorm := TempLowHead3A60.getXorm() session := _xorm.NewSession() defer func() { session.Close() }() typesAndSqlxAndCndition := TempLowHead3A60.joinTable() isJoin := false for _, v := range typesAndSqlxAndCndition { isJoin = true session = session.Join(v[0], v[1], v[2]) } if q != "" { session = session.Where(q, args...) } whereCond := TempLowHead3A60.whereDataWithCond() if whereCond != nil { session = session.Where(whereCond) } order := TempLowHead3A60.orderData() if order != "" { session = session.OrderBy(order) } if !isJoin { session.Find(&data) } else { fieldType := TempLowHead3A60.getFieldTypes() session = session.Table(TempLowHead3A60) raw := []map[string]interface{}{} session.Find(&raw) for i := range raw { item := Temp3A60{} raw[i] = TempLowHead3A60.fixSqlRowMap(fieldType, raw[i]) hskutils.Interface2Struct(raw[i], &item) data = append(data, item) } } for i := range data { data[i].service = TempLowHead3A60.service data[i].init() } return } // PageData 进行分页的数据列表,page从0开始 func (TempLowHead3A60 *Temp3A60) PageData(page, pageSize int) (data []Temp3A60, count int64) { if TempLowHead3A60.service == "" { TempLowHead3A60.service = "none" } q, args := TempLowHead3A60.whereData() _xorm := TempLowHead3A60.getXorm() session := _xorm.NewSession() defer func() { session.Close() }() typesAndSqlxAndCndition := TempLowHead3A60.joinTable() isJoin := false for _, v := range typesAndSqlxAndCndition { isJoin = true session = session.Join(v[0], v[1], v[2]) } if q != "" { session = session.Where(q, args...) } whereCond := TempLowHead3A60.whereDataWithCond() if whereCond != nil { session = session.Where(whereCond) } order := TempLowHead3A60.orderData() if order != "" { session = session.OrderBy(order) } session = session.Limit(pageSize, page*pageSize) if !isJoin { count, _ = session.FindAndCount(&data) } else { fieldType := TempLowHead3A60.getFieldTypes() session = session.Table(TempLowHead3A60) raw := []map[string]interface{}{} count, _ = session.FindAndCount(&raw) for i := range raw { item := Temp3A60{} raw[i] = TempLowHead3A60.fixSqlRowMap(fieldType, raw[i]) hskutils.Interface2Struct(raw[i], &item) data = append(data, item) } } for i := range data { data[i].service = TempLowHead3A60.service data[i].init() } return } // Delete 删除数据 func (TempLowHead3A60 *Temp3A60) Delete() (err error) { if TempLowHead3A60.service == "" { TempLowHead3A60.service = "none" } whereQuery, whereArgs := TempLowHead3A60.wherePrimaryKey() whereCond := TempLowHead3A60.wherePrimaryKeyWithCond() session := TempLowHead3A60.getXorm().NewSession() defer session.Close() if whereQuery != "" { session = session.Where(whereQuery, whereArgs...) } if whereCond != nil { session = session.Where(whereCond) } err = TempLowHead3A60.deletePretreatment() if err != nil { return } _, err = session.Delete(TempLowHead3A60) return } // ----------------------------temp------------------------------------ func StartQueueTaskPrefixHigHead3A60Temp3A60() { serviceName := "Prefix3A60" f := TempLowHead3A60_AutoQueueStatusFieldMap[serviceName] go func() { defer func() { err := recover() if err != nil { L.Error("StartQueueTaskPrefixHigHead3A60Temp3A60 意外退出:", err) } time.Sleep(time.Second * 5) StartQueueTaskPrefixHigHead3A60Temp3A60() }() for { onec := &Temp3A60{} hskdb.GetXormAuto().Where(fmt.Sprintf("`%s`=?", f), TempLowHead3A60_AutoQueueStatusWait).OrderBy("rand()").Get(onec) session := onec.getXorm().NewSession() defer session.Close() session = session.Table(onec) whereQuery, whereArgs := onec.wherePrimaryKey() whereCond := onec.wherePrimaryKeyWithCond() if whereQuery != "" { session = session.Where(whereQuery, whereArgs...) } if whereCond != nil { session = session.Where(whereCond) } i, err := session.Where(fmt.Sprintf("`%s`=?", f), TempLowHead3A60_AutoQueueStatusWait).Update(map[string]interface{}{f: TempLowHead3A60_AutoQueueStatusIng}) if err == nil && i == 1 { func() { { onec.service = serviceName err := onec.queueEvent() session := onec.getXorm().NewSession() defer session.Close() session = session.Table(onec) whereQuery, whereArgs := onec.wherePrimaryKey() whereCond := onec.wherePrimaryKeyWithCond() if whereQuery != "" { session = session.Where(whereQuery, whereArgs...) } if whereCond != nil { session = session.Where(whereCond) } if err != nil { session.Update(map[string]interface{}{f: TempLowHead3A60_AutoQueueStatusFail}) } else { session.Update(map[string]interface{}{f: TempLowHead3A60_AutoQueueStatusSuccess}) } } }() } time.Sleep(TempLowHead3A60_AutoQueueWait) } }() } func InitializationHttpCrudPrefixHigHead3A60Temp3A60(router *hskgin.GinHelper, authoritys ...func(ctx *hskgin.GinContextHelper, TempLowHead3A60 *Temp3A60)) { var authority = func(ctx *hskgin.GinContextHelper, TempLowHead3A60 *Temp3A60) { } if len(authoritys) > 0 { authority = authoritys[0] } router.Any("/Prefix3A60/TempLowHead3A60/tryToInitialize", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} err := hskdb.XormSync2(&Temp3A60{}) ctx.CheckErrDisplayByError(err) ctx.DisplayByData(req) }) /* @yapi @group TempLowHead3A60 @name 获取(Prefix3A60-TempLowHead3A60)单个数据 @path /Prefix3A60/TempLowHead3A60/get @markdown ## ``` 传入主键获取对应数据 ``` @end */ router.Any("/Prefix3A60/TempLowHead3A60/get", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} ctx.Bind(req) authority(ctx, req) req.service = "Prefix3A60" err := req.Load() ctx.CheckErrDisplayByError(err) ctx.DisplayByData(req) }) /* @yapi @group TempLowHead3A60 @name 保存(Prefix3A60-TempLowHead3A60)单个数据 @path /Prefix3A60/TempLowHead3A60/save @markdown ## ``` 传入整体数据插入或者保存(取决于主键是否存在) ``` @end */ router.Any("/Prefix3A60/TempLowHead3A60/save", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} ctx.Bind(&req) authority(ctx, req) req.service = "Prefix3A60" err := req.Save() ctx.CheckErrDisplayByError(err) err = req.Load() ctx.CheckErrDisplayByError(err) ctx.DisplayByData(req) }) /* @yapi @group TempLowHead3A60 @name 获取(Prefix3A60-TempLowHead3A60)无分页数据 @path /Prefix3A60/TempLowHead3A60/data @markdown ## ``` 获取数据列表,无分页 ``` @end */ router.Any("/Prefix3A60/TempLowHead3A60/data", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} ctx.Bind(&req) authority(ctx, req) req.service = "Prefix3A60" data := req.Data() ctx.DisplayByData(data) }) /* @yapi @group TempLowHead3A60 @name 获取(Prefix3A60-TempLowHead3A60)分页数据 @path /Prefix3A60/TempLowHead3A60/list @markdown ## ``` 获取数据列表,分页,page参数 ``` @end */ router.Any("/Prefix3A60/TempLowHead3A60/list", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} ctx.Bind(&req) authority(ctx, req) page := ctx.ParamRequired2Page(true) req.service = "Prefix3A60" data, count := req.PageData(page, 10) ctx.DisplayByPage(data, count) }) /* @yapi @group TempLowHead3A60 @name 删除一条(Prefix3A60-TempLowHead3A60)数据 @path /Prefix3A60/TempLowHead3A60/delete @markdown ## ``` 传入主键参数,删除一条数据 ``` @end */ router.Any("/Prefix3A60/TempLowHead3A60/delete", func(ctx *hskgin.GinContextHelper) { req := &Temp3A60{} ctx.Bind(&req) authority(ctx, req) req.service = "Prefix3A60" err := req.Delete() ctx.CheckErrDisplayByError(err) ctx.DisplayBySuccess("删除成功") }) }