提交 6c3c91f3 编写于 作者: aaronchen2k2k's avatar aaronchen2k2k

close task#8189

上级 7f0f4d89
......@@ -24,9 +24,10 @@ fields:
postfix: "]\t"
- field: field_value # 引用同文件其他字段进行数学运算。
value: "$field_step_negative * 2 - 1"
value: "($field_step_negative * $field_nested_range) * -1 + 1000"
prefix: "["
postfix: "]\t"
length: 20
- field: field_nested_range
from: zentao.number.v1.yaml # 引用用户自定义ranges,存于users目录下。
......
......@@ -7,6 +7,7 @@ require golang.org/x/text v0.3.3
require (
github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0
github.com/Chain-Zhang/pinyin v0.1.3
github.com/Knetic/govaluate v3.0.0+incompatible
github.com/akavel/rsrc v0.9.0 // indirect
github.com/emirpasic/gods v1.12.0
github.com/fatih/color v1.9.0
......
......@@ -23,7 +23,7 @@ func Generate(defaultFile string, configFile string, fieldsToExportStr, format,
fieldsToExport = strings.Split(fieldsToExportStr, ",")
}
rows, colIsNumArr, err := gen.GenerateForOnTop(defaultFile, configFile, &fieldsToExport)
rows, colIsNumArr, err := gen.GenerateOnTopLevel(defaultFile, configFile, &fieldsToExport)
if err != nil {
return
}
......
......@@ -2,6 +2,7 @@ package gen
import (
"errors"
"github.com/easysoft/zendata/src/gen/helper"
"github.com/easysoft/zendata/src/model"
commonUtils "github.com/easysoft/zendata/src/utils/common"
constant "github.com/easysoft/zendata/src/utils/const"
......@@ -16,7 +17,7 @@ import (
"strings"
)
func GenerateForOnTop(defaultFile, configFile string, fieldsToExport *[]string,
func GenerateOnTopLevel(defaultFile, configFile string, fieldsToExport *[]string,
) (rows [][]string, colIsNumArr []bool, err error) {
vari.DefaultDir = fileUtils.GetAbsDir(defaultFile)
......@@ -40,7 +41,7 @@ func GenerateForOnTop(defaultFile, configFile string, fieldsToExport *[]string,
vari.Res = LoadResDef(*fieldsToExport)
vari.ResLoading = false
topFieldNameToValuesMap := map[string][]string{}
topLevelFieldNameToValuesMap := map[string][]string{}
// 为每个field生成值列表
for index, field := range vari.Def.Fields {
......@@ -55,7 +56,7 @@ func GenerateForOnTop(defaultFile, configFile string, fieldsToExport *[]string,
vari.Def.Fields[index].Precision = field.Precision
topFieldNameToValuesMap[field.Field] = values
topLevelFieldNameToValuesMap[field.Field] = values
colIsNumArr = append(colIsNumArr, field.IsNumb)
}
......@@ -66,7 +67,11 @@ func GenerateForOnTop(defaultFile, configFile string, fieldsToExport *[]string,
continue
}
childValues := topFieldNameToValuesMap[child.Field]
childValues := topLevelFieldNameToValuesMap[child.Field]
if child.Value != "" { // is value expression
childValues = helper.GenExpressionValues(child, topLevelFieldNameToValuesMap)
}
arrOfArr = append(arrOfArr, childValues)
}
rows = putChildrenToArr(arrOfArr, vari.Recursive)
......
package helper
import (
"fmt"
"github.com/Knetic/govaluate"
"github.com/easysoft/zendata/src/model"
logUtils "github.com/easysoft/zendata/src/utils/log"
stringUtils "github.com/easysoft/zendata/src/utils/string"
"github.com/easysoft/zendata/src/utils/vari"
"github.com/mattn/go-runewidth"
"regexp"
"strconv"
"strings"
)
func GenExpressionValues(field model.DefField, valuesMap map[string][]string) (ret []string) {
exp := field.Value
reg := regexp.MustCompile(`\$([_,a-z,A-Z,0-9]+)`)
arr := reg.FindAllStringSubmatch(exp,-1)
total := 1
for _, items := range arr { // computer total
placeholder := items[0]
fieldName := items[1]
exp = strings.Replace(exp, placeholder, fieldName, 1)
size := len(valuesMap[fieldName])
if total < size {
total = size
}
}
dataTypeFromValues := "int"
for i := 0; i < total; i++ {
params := make(map[string]interface{})
//expr1, err1 := govaluate.NewEvaluableExpression("1+1")
//result, err := expr1.Evaluate(params)
//fmt.Sprintf("%v, %v, %v", expr1, err1, result)
for _, items := range arr {
fieldName := items[1]
referValues := valuesMap[fieldName]
referField := vari.TopFieldMap[fieldName]
logUtils.PrintErrMsg(referField.Value)
valStr := "N/A"
tp := ""
var val interface{}
if len(referValues) > 0 {
valStr = referValues[i % len(referValues)]
valStr = strings.TrimLeft(valStr, field.Prefix)
valStr = strings.TrimRight(valStr, field.Postfix)
val, tp = getNumType(valStr)
if tp != "int" {
dataTypeFromValues = tp
}
}
params[fieldName] = val
}
expr, err := govaluate.NewEvaluableExpression(exp)
if err != nil {
logUtils.PrintErrMsg(err.Error())
ret = append(ret, "ERR")
} else {
result, err := expr.Evaluate(params)
if err != nil {
logUtils.PrintErrMsg(err.Error())
}
mask := ""
if dataTypeFromValues == "int" {
mask = "%.0f"
} else {
mask = "%d"
}
str := fmt.Sprintf(field.Prefix + mask + field.Postfix, result)
if field.Length > runewidth.StringWidth(str) {
str = stringUtils.AddPad(str, field)
}
ret = append(ret, str)
}
}
return
}
func getNumType(str string) (val interface{}, tp string) {
val, errInt := strconv.ParseInt(str, 0, 64)
if errInt == nil {
tp = "int"
return
}
val, errFloat := strconv.ParseFloat(str, 64)
if errFloat == nil {
tp = "float"
return
}
val = str
tp = "float"
return
}
\ No newline at end of file
......@@ -257,7 +257,7 @@ func CreateValuesFromYaml(field *model.DefField, yamlFile, stepStr string, repea
configFile := vari.ConfigDir + yamlFile
fieldsToExport := make([]string, 0) // set to empty to use all fields
rows, colIsNumArr, _ := GenerateForOnTop("", configFile, &fieldsToExport)
rows, colIsNumArr, _ := GenerateOnTopLevel("", configFile, &fieldsToExport)
if field.Rand {
rows = randomValuesArr(rows)
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册