package customerform import ( "appPlatform/overall/publicmethod" "encoding/json" "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 fieldCont.Signed = true 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.DefaultValuees, _ = strconv.Atoi(subUnit.Control.InactiveValue) fieldCont.FieldLenght = size // fmt.Printf("subUnit.Control.ActiveValu--->%v\nsubUnit.Control.ActiveValu------>%v\n\n\n", subUnit.Control.ActiveValue, subUnit.Control.InactiveValue) 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 } else { fieldCont.DefaultValue = 0 } 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) { isSunTable := false 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 { 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 { isSunTable = true 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), "InnoDB", 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), "InnoDB", false) } } default: if v.Name != "" { sqlMasterStr, sqlMasterStrAry := SubUnitConvertSql(c.Form.Name, v) if len(sqlMasterStrAry) > 0 { masterSql = append(masterSql, sqlMasterStrAry...) } else { if sqlMasterStr != "not" { masterSql = append(masterSql, sqlMasterStr) } } } } } //创建主表 if isSunTable { err = CreateForm(c.Form.Name, c.Form.FormName, "InnoDB", true) } else { err = CreateForm(c.Form.Name, c.Form.FormName, "MyISAM", true) } if err != nil { return } 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 { if v.Name != "" { sqlStr, sqlStrAry := SubUnitConvertSql(tableName, v) if len(sqlStrAry) > 0 { mastSql = append(mastSql, sqlStrAry...) } else { if sqlStr != "not" { mastSql = append(mastSql, sqlStr) } } } // 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, sqlAry []string) { if tablename == "" { sql = "not" return } fielfInfoClass := AnalysisTable(subUnit) unsigned := "" if !fielfInfoClass.Signed { unsigned = "unsigned" } switch fielfInfoClass.Types { case "int", "bigint": //值类型是数组,并且需要分开存储 if fielfInfoClass.ControlType == "array" && fielfInfoClass.Signed { sqlAry = append(sqlAry, 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)) tableField := fmt.Sprintf("%v_end", subUnit.Name) sqlAry = append(sqlAry, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, tableField, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label)) // 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) // sql = fmt.Sprintf("%v ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v';", sql, tablename, tableField, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, subUnit.Item.Label) } else { 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 '' COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, subUnit.Item.Label) } } return }