2025-04-28 15:56:04 +08:00

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)
}