| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | package bootableimport (	"encoding/json"	"golib/features/mo"	"golib/infra/ii")func objectToStr(row mo.M) string {	b, err := json.Marshal(row)	if err != nil {		return err.Error()	}	return string(b)}func handleRow(info *ii.ItemInfo, row mo.M) {	handleTypeDateTime(info, row)	handleTypeFloat(info, row)	handleTypeArray(info, row)	handleFieldLookup(info, row)	handleTypeObject(info, row)}func handleTypeDateTime(info *ii.ItemInfo, row mo.M) {	for _, field := range info.FieldType(mo.TypeDate) {		oldValue, ok := row[field.Name].(mo.DateTime)		if !ok {			continue		}		if oldValue == 0 {			row[field.Name] = ""		}	}}func handleTypeFloat(info *ii.ItemInfo, row mo.M) {	for _, field := range info.FieldType(mo.TypeDouble) {		if field.Decimal <= 0 {			continue		}		oldValue, ok := row[field.Name].(float64)		if !ok {			continue		}		newValue, err := field.Convert(oldValue)		if err == nil {			row[field.Name] = newValue		}	}}func handleTypeObject(info *ii.ItemInfo, row mo.M) {	for _, field := range info.FieldType(mo.TypeObject) {		oldMap, ok := row[field.Name].(mo.M)		if !ok {			continue		}		for k, v := range oldMap {			row[field.Name+"."+k] = v		}		row[field.Name] = objectToStr(oldMap)	}}func handleTypeArray(info *ii.ItemInfo, row mo.M) {	for _, field := range info.FieldType(mo.TypeArray) {		if field.Items == ii.FieldItemsObject {			oldList, ok := row[field.Name].(mo.A)			if !ok {				continue			}			for i := 0; i < len(oldList); i++ {				oldMap, o := oldList[i].(mo.M)				if !o {					continue				}				for j := 0; j < len(field.Fields); j++ {					if label := field.Fields[j].Label; label != "" {						oldMap[field.Fields[j].Name+"."+ii.FieldLabel] = label					}				}			}		}	}}func handleFieldLookup(info *ii.ItemInfo, row mo.M) {	for _, field := range info.Fields {		for _, look := range field.Lookup {			oldList, ok := row[look.AS].(mo.A)			if !ok {				continue			}			if len(oldList) == 0 || look.List {				continue // 仅 List == false 时才展开数据			}			// 使用 SubField 展开			for _, sf := range field.Fields {				row[field.Name+"."+look.AS+"."+sf.Name] = oldList[0].(mo.M)[sf.Name]			}			delete(row, look.AS) // 展开后删除 as		}	}}
 |