package customerform import ( "appPlatform/overall/publicmethod" "fmt" "strconv" ) /* * @ 作者: 秦东 @ 时间: 2023-09-26 15:34:07 @ 功能: @ 参数 #分析表格 @ 返回值 # @ 方法原型 # */ func AnalysisTable(subUnit MasterStruct) (fieldCont TableFormStruct) { //TableFormStruct fieldCont.TableName = subUnit.Name switch subUnit.Type { case "datePicker": switch subUnit.Control.Type { case "year", "month", "date", "datetime": fieldCont.Types = "bigint" fieldCont.ControlType = subUnit.Control.Type fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 case "week": fieldCont.Types = "varchar" fieldCont.ControlType = subUnit.Control.Type fieldCont.DefaultValue = "" fieldCont.ControlType = "string" fieldCont.FieldLenght = 255 case "datetimerange", "daterange", "monthrange": fieldCont.Types = "bigint" fieldCont.ControlType = "array" fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 default: fieldCont.Types = "mediumtext" fieldCont.ControlType = subUnit.Control.Type fieldCont.DefaultValue = "" fieldCont.ControlType = "string" } case "input", "password": if len(subUnit.CustomRules) > 0 { zdType, signed := CustomRulesInput(subUnit.CustomRules) fieldCont.Types = zdType fieldCont.Signed = signed switch zdType { case "float": fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 fieldCont.ControlType = "float" case "decimal": fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 fieldCont.ControlType = "decimal" case "bigint": fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 fieldCont.ControlType = "bigint" case "int": fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 6 fieldCont.ControlType = "int" default: fieldCont.DefaultValue = "" fieldCont.FieldLenght = 255 fieldCont.ControlType = "string" } } else { fieldCont.Types = "varchar" fieldCont.DefaultValue = "" fieldCont.FieldLenght = 255 fieldCont.ControlType = "string" } case "textarea", "cascader": fieldCont.Types = "mediumtext" fieldCont.DefaultValue = "" fieldCont.ControlType = "string" case "radio", "select": var fieldVal string if len(subUnit.Options) > 0 { for _, ov := range subUnit.Options { if len(fieldVal) < len(ov.Value) { fieldVal = ov.Value } } } if subUnit.Config.TransformData == "number" { size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.Types = fieldType fieldCont.DefaultValue = 0 fieldCont.FieldLenght = size fieldCont.ControlType = fieldType } else { size, fieldType := CalculateCharacterLength("string", fieldVal) fieldCont.Types = fieldType fieldCont.DefaultValue = "" fieldCont.FieldLenght = size fieldCont.ControlType = "string" } case "checkbox": fieldCont.Types = "mediumtext" fieldCont.DefaultValue = "" fieldCont.ControlType = "array" case "colorPicker", "timePicker": fieldCont.Types = "varchar" fieldCont.DefaultValue = "" fieldCont.FieldLenght = 50 fieldCont.ControlType = "string" case "switch": var fieldVal string if len(subUnit.Control.ActiveValue) < len(subUnit.Control.InactiveValue) { fieldVal = subUnit.Control.InactiveValue } else { fieldVal = subUnit.Control.ActiveValue } size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.Types = fieldType fieldCont.ControlType = "booble" fieldCont.DefaultValue, _ = strconv.Atoi(subUnit.Control.ActiveValue) fieldCont.FieldLenght = size case "inputNumber": fieldCont.Types = "bigint" fieldCont.DefaultValue = 0 fieldCont.FieldLenght = 20 fieldCont.ControlType = "bigint" case "rate", "slider": fieldVal := strconv.Itoa(subUnit.Control.Max) size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.Types = fieldType fieldCont.ControlType = fieldType if scm, scmIsok := subUnit.Control.ModelValue.(int); scmIsok { fieldCont.DefaultValue = scm } fieldCont.FieldLenght = size case "treeSelect": case "upload": fieldCont.Types = "longtext" fieldCont.DefaultValue = "" fieldCont.ControlType = "array" //返回值为数组 case "tinymce", "expand-user": fieldCont.Types = "longtext" fieldCont.DefaultValue = "" fieldCont.ControlType = "string" case "grid", "tabs", "card", "div", "table", "flex", "divider": default: fieldCont.Types = "varchar" fieldCont.DefaultValue = "" fieldCont.FieldLenght = 255 fieldCont.ControlType = "string" } return } /* * @ 作者: 秦东 @ 时间: 2023-09-27 09:28:33 @ 功能: 文本框校验规则 @ 参数 # @ 返回值 # @ 方法原型 # */ func CustomRulesInput(list []CustomRulesStruct) (types string, signed bool) { if len(list) == 0 { types = "varchar" return } var typeAry []string for _, v := range list { if !publicmethod.IsInTrue[string](v.Type, typeAry) { typeAry = append(typeAry, v.Type) } } if len(typeAry) == 0 { types = "varchar" return } stringType := []string{"mobile", "tel", "phone", "email", "card", "cn", "numberLetter", "网址"} moneyType := []string{"money"} floatType := []string{"longitude", "latitude"} zhengZs := []string{"int"} numberType := []string{"number"} for _, tv := range typeAry { if publicmethod.IsInTrue[string](tv, floatType) { types = "float" return } if publicmethod.IsInTrue[string](tv, moneyType) { types = "decimal" return } if publicmethod.IsInTrue[string](tv, numberType) { types = "bigint" signed = true return } if publicmethod.IsInTrue[string](tv, zhengZs) { types = "int" return } if publicmethod.IsInTrue[string](tv, stringType) { types = "varchar" return } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-26 16:28:16 @ 功能: 计算字符长度 @ 参数 #class 类型 #str 值 @ 返回值 #size 字段长度 #fieldType 字段类型 @ 方法原型 #func CalculateCharacterLength(class, str string) (size int, fieldType string) */ func CalculateCharacterLength(class, str string) (size int, fieldType string) { size = len(str) + 1 switch class { case "int": if size <= 9 { fieldType = "int" } else { fieldType = "bigint" } case "string": if size <= 255 { fieldType = "varchar" } else { fieldType = "mediumtext" } default: fieldType = "varchar" size = 255 } return } /* * @ 作者: 秦东 @ 时间: 2023-09-27 08:52:56 @ 功能: 创建自定义表单数据表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (c *CustomerFormMaster) CreateFormDatabaseTable() (relevance string, err error) { err = CreateForm(c.Form.Name, c.Form.FormName, true) //创建主表 if err != nil { return } var masterSql []string //主数据库添加字段语句集合 var sunFormName []string //子表名称集合 sunFormNameAry := publicmethod.MapOut[string]() //子表对应关系 sunForm := publicmethod.MapOut[string]() for _, v := range c.List { switch v.Type { case "grid", "tabs": if len(v.Columns) > 0 { for _, cv := range v.Columns { // fmt.Printf("type:%v <===========>label:%v <===========> Name:%v<===========> ModelValue:%v\n", v.Type, cv.Attr.Span, cv.Type, v.Control.ModelValue) sqlStr := VesselSubUnitConvertSql(c.Form.Name, cv.List) if len(sqlStr) > 0 { masterSql = append(masterSql, sqlStr...) } } } case "card", "div": if len(v.List) > 0 { sqlStr := VesselSubUnitConvertSql(c.Form.Name, v.List) if len(sqlStr) > 0 { masterSql = append(masterSql, sqlStr...) } } case "table", "flex": if len(v.List) > 0 { if !publicmethod.IsInTrue[string](v.Name, sunFormName) { sunFormName = append(sunFormName, v.Name) sunFormNameAry[v.Name] = v.Name sqlStr := VesselSubUnitConvertSql(v.Name, v.List) sunForm[v.Name] = sqlStr CreateForm(v.Name, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false) } else { sunTableName := fmt.Sprintf("%v%v", v.Name, publicmethod.GetUUid(1)) sunFormName = append(sunFormName, sunTableName) sunFormNameAry[v.Name] = sunTableName sqlStr := VesselSubUnitConvertSql(sunTableName, v.List) sunForm[sunTableName] = sqlStr CreateForm(sunTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false) } } default: sqlMasterStr := SubUnitConvertSql(c.Form.Name, v) if sqlMasterStr != "not" { masterSql = append(masterSql, sqlMasterStr) } // masterSql = append(masterSql, SubUnitConvertSql(c.Form.Name, v)) // fielfInfoClass := AnalysisTable(v) // unsigned := "" // if !fielfInfoClass.Signed { // unsigned = "unsigned" // } // switch fielfInfoClass.Types { // case "int", "bigint": // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label)) // case "booble": // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(1) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, unsigned, fielfInfoClass.DefaultValue, v.Item.Label)) // case "float": // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,%v) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label)) // case "decimal": // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,2) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label)) // case "mediumtext", "longtext": // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, v.Item.Label)) // default: // masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) COLLATE utf8mb4_general_ci NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.DefaultValue, v.Item.Label)) // } } } // if len(masterSql) > 0 { // CreateFormFiled(c.Form.Name, c.Form.FormName, true, masterSql) //添加主表字段 // } // if len(sunForm) > 0 { //子表操作 // relevanceByte, _ := json.Marshal(sunFormNameAry) // relevance = string(relevanceByte) // for i, v := range sunForm { // // fmt.Printf("表单结构----拆解----》%v========>%v\n", i, v) // CreateFormFiled(i, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false, v) // } // } fmt.Printf("主表数据:%v\n", masterSql) fmt.Printf("子表表数据:%v\n", sunForm) return } /* * @ 作者: 秦东 @ 时间: 2023-09-27 11:04:39 @ 功能: 容器组件生成数据库字段语句 @ 参数 # @ 返回值 # @ 方法原型 # */ func VesselSubUnitConvertSql(tableName string, list []MasterStruct) (mastSql []string) { if len(list) > 0 { for _, v := range list { sqlStr := SubUnitConvertSql(tableName, v) if sqlStr != "not" { mastSql = append(mastSql, sqlStr) } } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-27 10:30:25 @ 功能: 单一组件转换Sql语句 @ 参数 #tablename 表单名称 #subUnit 第一组件结构体 @ 返回值 #sql 数据库字段添加语句 @ 方法原型 #func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string) */ func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string) { if tablename == "" { sql = "not" return } fielfInfoClass := AnalysisTable(subUnit) unsigned := "" if !fielfInfoClass.Signed { unsigned = "unsigned" } switch fielfInfoClass.Types { case "int", "bigint": sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label) case "booble": sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(1) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label) case "float": sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label) case "decimal": sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,2) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label) case "mediumtext", "longtext": sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, subUnit.Item.Label) default: if fielfInfoClass.Types != "" { sql = fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) COLLATE utf8mb4_general_ci NOT NULL DEFAULT %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.DefaultValue, subUnit.Item.Label) } } return }