185 lines
4.7 KiB
Go
185 lines
4.7 KiB
Go
package entity
|
|
|
|
import (
|
|
"admin/apps/game/model"
|
|
"admin/apps/game/model/dto"
|
|
"admin/lib/xlog"
|
|
"fmt"
|
|
"gorm.io/gorm"
|
|
"reflect"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func poToCommonDtoNo(po any) dto.CommonDtoValues {
|
|
obj := make(dto.CommonDtoValues)
|
|
|
|
to := reflect.TypeOf(po).Elem()
|
|
vo := reflect.ValueOf(po).Elem()
|
|
for i := 0; i < vo.NumField(); i++ {
|
|
ft := to.Field(i)
|
|
fo := vo.Field(i)
|
|
|
|
if ft.Name == "ProjectId" {
|
|
if _, ok := po.(*model.Project); !ok {
|
|
continue
|
|
}
|
|
}
|
|
|
|
obj[ft.Name] = fo.Interface()
|
|
|
|
if ft.Type.Name() == "Time" && ft.Type.PkgPath() == "time" {
|
|
obj[ft.Name] = fo.Interface().(time.Time).Format(time.DateTime)
|
|
}
|
|
}
|
|
|
|
return obj
|
|
}
|
|
|
|
func getFieldTypeDtoDescInfo(projectId string, poValue reflect.Value, fieldType reflect.StructField) *dto.CommonDtoFieldDesc {
|
|
name := fieldType.Tag.Get("name")
|
|
if name == "" {
|
|
name = fieldType.Name
|
|
}
|
|
f1 := &dto.CommonDtoFieldDesc{
|
|
Name: name,
|
|
Key: fieldType.Name,
|
|
Type: fieldType.Type.Name(),
|
|
HelpText: fieldType.Tag.Get("desc"),
|
|
Readonly: fieldType.Tag.Get("readonly") == "true",
|
|
Required: fieldType.Tag.Get("required") == "true",
|
|
Choices: make([]*dto.CommonDtoFieldChoice, 0),
|
|
MultiChoice: fieldType.Tag.Get("multi_choice") == "true",
|
|
Uneditable: fieldType.Tag.Get("uneditable") == "true",
|
|
}
|
|
|
|
if f1.Key == "CreatedAt" {
|
|
f1.Name = "创建时间"
|
|
}
|
|
|
|
if tagType := fieldType.Tag.Get("type"); tagType != "" {
|
|
f1.Type = tagType
|
|
}
|
|
|
|
cf := fieldType.Tag.Get("choices")
|
|
if cf != "" {
|
|
method := poValue.MethodByName(cf)
|
|
if !method.IsValid() {
|
|
xlog.Warnf("po %v choices %v function not found in model", poValue.Type().Name(), cf)
|
|
} else {
|
|
rets := method.Call([]reflect.Value{reflect.ValueOf(projectId)})
|
|
f1.Choices = rets[0].Interface().([]*dto.CommonDtoFieldChoice)
|
|
}
|
|
|
|
}
|
|
|
|
return f1
|
|
}
|
|
|
|
func parseStr2FieldValue(field reflect.StructField, rawValue any) (realSetValue reflect.Value) {
|
|
setValue := fmt.Sprintf("%v", rawValue)
|
|
var parsedValue any
|
|
switch field.Type.Kind() {
|
|
case reflect.Int:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = int(v)
|
|
case reflect.Int32:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = int32(v)
|
|
case reflect.Int8:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = int8(v)
|
|
case reflect.Int16:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = int16(v)
|
|
case reflect.Int64:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = int64(v)
|
|
case reflect.Uint:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = uint(v)
|
|
case reflect.Uint8:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = uint(v)
|
|
case reflect.Uint16:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = uint16(v)
|
|
case reflect.Uint32:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = uint32(v)
|
|
case reflect.Uint64:
|
|
v, _ := strconv.Atoi(setValue)
|
|
parsedValue = uint64(v)
|
|
case reflect.Bool:
|
|
parsedValue = setValue == "true"
|
|
case reflect.String:
|
|
parsedValue = setValue
|
|
case reflect.Float32:
|
|
v, _ := strconv.ParseFloat(setValue, 10)
|
|
parsedValue = float32(v)
|
|
case reflect.Float64:
|
|
v, _ := strconv.ParseFloat(setValue, 10)
|
|
parsedValue = float64(v)
|
|
case reflect.Struct:
|
|
typeName := field.Type.Name()
|
|
if typeName == "Time" {
|
|
xlog.Debugf("time content:%v", setValue)
|
|
t, _ := time.ParseInLocation("2006/01/02 15:04:05", setValue, time.Local)
|
|
return reflect.ValueOf(t)
|
|
}
|
|
if typeName == "DeletedAt" {
|
|
return reflect.ValueOf(gorm.DeletedAt{})
|
|
}
|
|
fallthrough
|
|
case reflect.Slice:
|
|
typeName := field.Type.String()
|
|
if typeName == "[]string" {
|
|
list := make([]string, 0)
|
|
if rawValueStr, ok := rawValue.(string); ok {
|
|
elems := strings.Split(rawValueStr, ",")
|
|
list = append(list, elems...)
|
|
// 空的字符串
|
|
} else {
|
|
if rawValueList, ok := rawValue.([]string); ok {
|
|
for _, v := range rawValueList {
|
|
list = append(list, v)
|
|
}
|
|
} else {
|
|
for _, v := range rawValue.([]interface{}) {
|
|
list = append(list, v.(string))
|
|
}
|
|
}
|
|
}
|
|
parsedValue = list
|
|
} else if typeName == "[]*model.MailAttachItem" {
|
|
items := make([]*model.MailAttachItem, 0)
|
|
if rawValueList, ok := rawValue.([]*model.MailAttachItem); ok {
|
|
for _, item := range rawValueList {
|
|
items = append(items, item)
|
|
}
|
|
} else {
|
|
for _, itemI := range rawValue.([]interface{}) {
|
|
item := &model.MailAttachItem{}
|
|
for k, vI := range itemI.(map[string]any) {
|
|
v := vI.(float64)
|
|
if k == "id" {
|
|
item.ID = int32(v)
|
|
} else if k == "num" {
|
|
item.Num = int64(v)
|
|
} else if k == "item_type" {
|
|
item.ItemType = int(v)
|
|
}
|
|
}
|
|
items = append(items, item)
|
|
}
|
|
}
|
|
|
|
parsedValue = items
|
|
}
|
|
default:
|
|
panic(fmt.Errorf("暂时不支持的前后端交互字段类型:%v, 类型名:%v", field.Type.Kind(), field.Type.Name()))
|
|
}
|
|
return reflect.ValueOf(parsedValue)
|
|
}
|