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 }