github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/pkg/service/res-intances.go (about)

     1  package service
     2  
     3  import (
     4  	"github.com/easysoft/zendata/internal/pkg/domain"
     5  	fileUtils "github.com/easysoft/zendata/pkg/utils/file"
     6  	"github.com/easysoft/zendata/pkg/utils/vari"
     7  	"github.com/jinzhu/copier"
     8  )
     9  
    10  type ResInstancesService struct {
    11  	ResService          *ResService          `inject:""`
    12  	FieldService        *FieldService        `inject:""`
    13  	CombineService      *CombineService      `inject:""`
    14  	ResRangesService    *ResRangesService    `inject:""`
    15  	ResInstancesService *ResInstancesService `inject:""`
    16  }
    17  
    18  func (s *ResInstancesService) GetResFromInstances(insts domain.ResInstances) (groupedValue map[string][]interface{}) {
    19  	groupedValue = map[string][]interface{}{}
    20  
    21  	for _, inst := range insts.Instances {
    22  		for _, instField := range inst.Fields {
    23  			s.prepareNestedInstanceRes(insts, inst, instField)
    24  		}
    25  
    26  		// gen values
    27  		fieldFromInst := s.ConvertInstantsToField(insts, inst)
    28  
    29  		s.FieldService.Generate(&fieldFromInst, true)
    30  
    31  		group := inst.Instance
    32  		groupedValue[group] = fieldFromInst.Values
    33  	}
    34  
    35  	return groupedValue
    36  }
    37  
    38  func (s *ResInstancesService) prepareNestedInstanceRes(insts domain.ResInstances, inst domain.ResInstancesItem, instField domain.DefField) {
    39  	//if instField.Note == "多froms" {
    40  	//	instField.Note += ""
    41  	//}
    42  	//
    43  	//// multi froms 2.
    44  	//if len(instField.Froms) > 0 {
    45  	//	unionValues := make([]interface{}, 0)
    46  	//	for _, from := range instField.Froms {
    47  	//		if from.From == "" {
    48  	//			from.From = instField.From
    49  	//		}
    50  	//
    51  	//		from.FileDir = instField.FileDir
    52  	//
    53  	//		s.FieldService.Generate(&from, true)
    54  	//
    55  	//		unionValues = append(unionValues, from.Values...)
    56  	//	}
    57  	//
    58  	//	groupedValueReferenced := map[string][]interface{}{}
    59  	//	group := inst.Instance
    60  	//	groupedValueReferenced[group] = unionValues
    61  	//	vari.GlobalVars.ResData[s.ResService.GetFromKey(&instField)] = groupedValueReferenced
    62  	//}
    63  
    64  	// set "from" val from parent if needed
    65  	if instField.From == "" {
    66  		if insts.From != "" {
    67  			instField.From = insts.From
    68  		}
    69  		if inst.From != "" {
    70  			instField.From = inst.From
    71  		}
    72  	}
    73  
    74  	instField.FileDir = insts.FileDir
    75  
    76  	if instField.Use != "" { // refer to another instances or ranges
    77  		if vari.GlobalVars.ResData[s.ResService.GetFromKey(&instField)] == nil {
    78  			referencedRanges, referencedInstants := s.ResService.GetReferencedRangeOrInstant(instField)
    79  			groupedValueReferenced := map[string][]interface{}{}
    80  
    81  			if len(referencedRanges.Ranges) > 0 { // refer to ranges
    82  				groupedValueReferenced = s.ResRangesService.GetResFromRanges(referencedRanges)
    83  
    84  			} else if len(referencedInstants.Instances) > 0 { // refer to instances
    85  				for _, referencedInst := range referencedInstants.Instances { // iterate records
    86  					for _, referencedInstField := range referencedInst.Fields { // if item had children, iterate children
    87  						s.prepareNestedInstanceRes(referencedInstants, referencedInst, referencedInstField)
    88  					}
    89  
    90  					field := s.ResInstancesService.ConvertInstantsToField(referencedInstants, referencedInst)
    91  
    92  					// gen values
    93  					group := referencedInst.Instance
    94  
    95  					s.FieldService.Generate(&field, true)
    96  					groupedValueReferenced[group] = field.Values
    97  				}
    98  			}
    99  
   100  			vari.GlobalVars.ResData[s.ResService.GetFromKey(&instField)] = groupedValueReferenced
   101  		}
   102  
   103  	} else if instField.Select != "" { // refer to excel
   104  		resFile, resType, sheet := fileUtils.GetResProp(instField.From, instField.FileDir)
   105  
   106  		values, _ := s.ResService.GetResValueFromExcelOrYaml(resFile, resType, sheet, &instField)
   107  		vari.GlobalVars.ResData[s.ResService.GetFromKey(&instField)] = values
   108  	}
   109  }
   110  
   111  func (s *ResInstancesService) ConvertInstantsToField(insts domain.ResInstances, inst domain.ResInstancesItem) (field domain.DefField) {
   112  	field.Note = "Converted From Instances " + insts.Title
   113  
   114  	//field.Field = insts.Field
   115  	field.From = insts.From
   116  
   117  	child := domain.DefField{}
   118  	child.Field = inst.Instance
   119  
   120  	// some props are from parent instances
   121  	if child.From == "" && inst.From != "" {
   122  		child.From = inst.From
   123  	} else if child.From == "" && insts.From != "" {
   124  		child.From = insts.From
   125  	}
   126  
   127  	copier.Copy(&child, inst)
   128  
   129  	field.Fields = append(field.Fields, child)
   130  	field.FileDir = insts.FileDir
   131  
   132  	return field
   133  }