package customerform import ( "appPlatform/overall/publicmethod" "encoding/json" "errors" "fmt" "strconv" ) /* * @ 作者: 秦东 @ 时间: 2023-09-30 14:37:11 @ 功能: 分析表格组件转换值类型 @ 参数 # @ 返回值 # @ 方法原型 # */ func AnalysisFormUnitClass(subUnit MasterStruct) (fieldCont AnalysisFormSubUnitClass) { fieldCont.UnitName = subUnit.Type fieldCont.WordName = subUnit.Name fieldCont.Describe = subUnit.Item.Label fieldCont.MinVal = 0 switch subUnit.Type { case "input", "password": //单行文本 if len(subUnit.CustomRules) > 0 { var fieldType []string var valType []fieldStruct for _, v := range subUnit.CustomRules { switch v.Trigger { case "mobile", "tel", "phone", "card": if !publicmethod.IsInTrue[string]("varchar", fieldType) { fieldType = append(fieldType, "varchar") valType = append(valType, fieldStruct{Types: "varchar", MaxVal: 50}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "varchar" { valType[i].MaxVal = 50 } } } case "email", "url", "numberLetter": if !publicmethod.IsInTrue[string]("varchar", fieldType) { fieldType = append(fieldType, "varchar") valType = append(valType, fieldStruct{Types: "varchar", MaxVal: 255}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "varchar" { valType[i].MaxVal = 255 } } } case "cn": if !publicmethod.IsInTrue[string]("mediumtext", fieldType) { fieldType = append(fieldType, "mediumtext") valType = append(valType, fieldStruct{Types: "mediumtext", MaxVal: 0}) } case "longitude", "latitude": if !publicmethod.IsInTrue[string]("float", fieldType) { fieldType = append(fieldType, "float") valType = append(valType, fieldStruct{Types: "float", MaxVal: 20, MinVal: 20}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "float" { valType[i].MaxVal = 20 valType[i].MinVal = 20 } } } case "money": if !publicmethod.IsInTrue[string]("decimal", fieldType) { fieldType = append(fieldType, "decimal") valType = append(valType, fieldStruct{Types: "decimal", MaxVal: 20, MinVal: 4}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "decimal" { valType[i].MaxVal = 20 valType[i].MinVal = 4 } } } case "int": if !publicmethod.IsInTrue[string]("bigint", fieldType) { fieldType = append(fieldType, "bigint") valType = append(valType, fieldStruct{Types: "bigint", MaxVal: 20, Signed: true}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "bigint" { valType[i].MaxVal = 20 valType[i].Signed = true } } } case "number": if !publicmethod.IsInTrue[string]("bigint", fieldType) { fieldType = append(fieldType, "bigint") valType = append(valType, fieldStruct{Types: "bigint", MaxVal: 20}) } else { for i := 0; i < len(valType); i++ { if valType[i].Types == "bigint" { valType[i].MaxVal = 20 } } } default: } if len(valType) > 0 { for _, v := range valType { if v.Types == "mediumtext" { fieldCont.FieldType = "mediumtext" } else if v.Types == "varchar" { fieldCont.FieldType = "varchar" fieldCont.MaxVal = v.MaxVal } else if v.Types == "float" { fieldCont.FieldType = "float" fieldCont.MaxVal = v.MaxVal fieldCont.MinVal = v.MinVal } else if v.Types == "decimal" { fieldCont.FieldType = "decimal" fieldCont.MaxVal = v.MaxVal fieldCont.MinVal = v.MinVal } else if v.Types == "bigint" { fieldCont.FieldType = "bigint" fieldCont.MaxVal = v.MaxVal fieldCont.Signed = v.Signed } else { fieldCont.FieldType = "varchar" fieldCont.MaxVal = 255 } } } else { fieldCont.FieldType = "varchar" fieldCont.MaxVal = 255 } } } else { fieldCont.FieldType = "varchar" fieldCont.MaxVal = 255 } case "textarea", "tinymce": //多行文本,富文本 fieldCont.FieldType = "mediumtext" case "radio": //单选框组 if subUnit.Config.TransformData == "number" || subUnit.Config.TransformData == "" { var fieldVal string if len(subUnit.Options) > 0 { for _, ov := range subUnit.Options { if len(fieldVal) < len(ov.Value) { fieldVal = ov.Value } } } size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.FieldType = fieldType fieldCont.MaxVal = size fieldCont.Signed = true } else { fieldCont.FieldType = "varchar" fieldCont.MaxVal = 50 } case "checkbox", "cascader", "treeSelect", "upload", "expand-user": //checkbox,级联选择器,树形控件,图片/文件: ,选择用户 fieldCont.FieldType = "mediumtext" fieldCont.ValIsAry = true case "select": //下拉选择框 if subUnit.Control.Multiple { fieldCont.FieldType = "mediumtext" fieldCont.ValIsAry = true } else { if subUnit.Config.TransformData == "number" { var fieldVal string if len(subUnit.Options) > 0 { for _, ov := range subUnit.Options { if len(fieldVal) < len(ov.Value) { fieldVal = ov.Value } } } size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.FieldType = fieldType fieldCont.MaxVal = size fieldCont.Signed = true } else { fieldCont.FieldType = "varchar" fieldCont.MaxVal = 50 } } case "datePicker": //日期选择器 fieldCont.UnitType = subUnit.Control.Type switch subUnit.Control.Type { case "year", "month", "date", "datetime", "week": fieldCont.FieldType = "bigint" fieldCont.MaxVal = 20 case "datetimerange", "daterange", "monthrange": fieldCont.FieldType = "bigint" fieldCont.MaxVal = 20 fieldCont.ValIsAry = true default: fieldCont.FieldType = "bigint" fieldCont.MaxVal = 20 } case "timePicker", "inputNumber": //时间选择器,计数器 fieldCont.FieldType = "bigint" fieldCont.MaxVal = 20 case "colorPicker": //取色器 fieldCont.FieldType = "varchar" fieldCont.MaxVal = 50 case "switch": //开关 var fieldVal string if len(subUnit.Options) > 0 { for _, ov := range subUnit.Options { if len(fieldVal) < len(ov.Value) { fieldVal = ov.Value } } } size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.FieldType = fieldType fieldCont.MaxVal = size fieldCont.Signed = true case "rate", "slider": //评分,滑块 fieldVal := strconv.Itoa(subUnit.Control.Max) size, fieldType := CalculateCharacterLength("int", fieldVal) fieldCont.FieldType = fieldType fieldCont.MaxVal = size fieldCont.Signed = true case "txt", "button", "title", "table", "grid", "tabs", "card", "flex", "divider", "div": //文本,按钮,标题,表格,格栅,标签,卡片布局,弹性布局,分割线,容器 case "component": //自定义组件 (格式待定) default: fieldCont.FieldType = "varchar" fieldCont.MaxVal = 255 } return } /* * @ 作者: 秦东 @ 时间: 2023-09-30 14:10:21 @ 功能: 自定义表格生成数据表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (c *CustomerFormMaster) CreateFormTable() (relevance string, err error) { // for _, v := range c.List { // } var tableFormSqlAry FormTableSql tableFormSqlAry.TableSubUnitAnalysis(c.Form.Name, c.List, true) // jsonStr, _ := json.Marshal(tableFormSqlAry) // fmt.Printf("数据表-----》%v\n", string(jsonStr)) isSunForm := false if len(tableFormSqlAry.MasterSql) <= 0 { err = errors.New("没有主表!") return } if len(tableFormSqlAry.SunSql) > 0 { isSunForm = true err = CreateForm(c.Form.Name, c.Form.FormName, "InnoDB", true) } else { err = CreateForm(c.Form.Name, c.Form.FormName, "MyISAM", true) } CreateFormFiled(c.Form.Name, c.Form.FormName, true, tableFormSqlAry.MasterSql) //添加主表字段 sunFormNameAry := make(map[string]string) var sunTableNameAry []string if isSunForm { for _, v := range tableFormSqlAry.SunSql { if len(v.SqlAry) > 0 { sunFormTableName := v.TableName if !publicmethod.IsInTrue[string](sunFormTableName, sunTableNameAry) { sunTableNameAry = append(sunTableNameAry, sunFormTableName) sunFormNameAry[v.TableName] = sunFormTableName } else { sunFormTableName = fmt.Sprintf("%v%v", v.TableName, publicmethod.GetUUid(1)) sunTableNameAry = append(sunTableNameAry, sunFormTableName) sunFormNameAry[v.TableName] = sunFormTableName } err = CreateForm(sunFormTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), "InnoDB", false) // fmt.Printf("%v------->%v------->%v\n", sunFormTableName, err, v.SqlAry) if err == nil { CreateFormFiled(sunFormTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false, v.SqlAry) } } } } if len(sunFormNameAry) > 0 { relevanceByte, _ := json.Marshal(sunFormNameAry) relevance = string(relevanceByte) } return } /* * @ 作者: 秦东 @ 时间: 2023-09-30 14:12:51 @ 功能: 表格组件拆分 @ 参数 # @ 返回值 # @ 方法原型 # */ func (f *FormTableSql) TableSubUnitAnalysis(tablename string, subUnitAry []MasterStruct, isMaster bool) { if len(subUnitAry) > 0 { var sqlAllAry []string // fmt.Printf("tablename--->%v===>%v\n", tablename, isMaster) for _, v := range subUnitAry { wordClass := AnalysisFormUnitClass(v) switch wordClass.UnitName { case "flex", "table": if len(v.List) > 0 { f.TableSubUnitAnalysis(v.Name, v.List, false) } case "grid", "tabs": if len(v.Columns) > 0 { for _, mv := range v.Columns { f.TableSubUnitAnalysis(tablename, mv.List, isMaster) } } case "card", "div": if len(v.List) > 0 { f.TableSubUnitAnalysis(tablename, v.List, isMaster) } default: masterSql := MakeSql(tablename, wordClass) sqlAllAry = append(sqlAllAry, masterSql...) // if len(masterSql) > 0 { // if isMaster { // f.MasterSql = append(f.MasterSql, masterSql...) // } else { // sunSqlAry := publicmethod.MapOut[string]() // sunSqlAry[tablename] = masterSql // f.SunSql = sunSqlAry // } // } } } // fmt.Printf("tablename--->%v===>%v===>%v\n", tablename, isMaster, sqlAllAry) if len(sqlAllAry) > 0 { if isMaster { f.MasterSql = append(f.MasterSql, sqlAllAry...) } else { if len(f.SunSql) > 0 { isWrite := true for sk, s := range f.SunSql { if s.TableName == tablename { f.SunSql[sk].SqlAry = append(f.SunSql[sk].SqlAry, sqlAllAry...) isWrite = false } } if isWrite { var sunSqlInfo SunSqlCont sunSqlInfo.TableName = tablename sunSqlInfo.SqlAry = sqlAllAry f.SunSql = append(f.SunSql, sunSqlInfo) } } else { var sunSqlInfo SunSqlCont sunSqlInfo.TableName = tablename sunSqlInfo.SqlAry = sqlAllAry f.SunSql = append(f.SunSql, sunSqlInfo) } } } } } /* * @ 作者: 秦东 @ 时间: 2023-10-01 08:22:23 @ 功能: 组装sql语句 @ 参数 # @ 返回值 # @ 方法原型 # */ func MakeSql(tablename string, fieldCont AnalysisFormSubUnitClass) (sql []string) { if tablename == "" || fieldCont.WordName == "" { return } unsigned := "" if !fieldCont.Signed { unsigned = "unsigned" } // fmt.Printf("%v------->%v------->%v\n", fieldCont.WordName, fieldCont.FieldType, fieldCont.ValIsAry) switch fieldCont.FieldType { case "int": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.MaxVal, unsigned, fieldCont.MinVal, fieldCont.Describe)) case "bigint": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.MaxVal, unsigned, fieldCont.MinVal, fieldCont.Describe)) if fieldCont.ValIsAry { endField := fmt.Sprintf("%v_end", fieldCont.WordName) sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", tablename, endField, fieldCont.FieldType, fieldCont.MaxVal, unsigned, fieldCont.MinVal, fieldCont.Describe)) } case "float": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,%v) %v NOT NULL DEFAULT 0 COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.MaxVal, fieldCont.MinVal, unsigned, fieldCont.Describe)) case "decimal": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,%v) %v NOT NULL DEFAULT 0 COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.MaxVal, fieldCont.MinVal, unsigned, fieldCont.Describe)) case "mediumtext", "longtext": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.Describe)) case "varchar": sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '%v'", tablename, fieldCont.WordName, fieldCont.FieldType, fieldCont.MaxVal, fieldCont.Describe)) default: } return } /* * @ 作者: 秦东 @ 时间: 2023-10-07 14:18:23 @ 功能: 获取主表及子表相关组件 @ 参数 #tablename 当前表明 #subUnitAry 组件列表 #isMaster true:主表;false:子表 @ 返回值 # @ 方法原型 # */ func (f *FormUnitInfo) GainMasterAndSunFormUnit(tablename string, subUnitAry []MasterStruct, isMaster bool) { if len(subUnitAry) > 0 { unitAry := make(map[string]MasterStruct) for _, v := range subUnitAry { wordClass := AnalysisFormUnitClass(v) switch wordClass.UnitName { case "flex", "table": if len(v.List) > 0 { f.GainMasterAndSunFormUnit(v.Name, v.List, false) } case "grid", "tabs": if len(v.Columns) > 0 { for _, mv := range v.Columns { f.GainMasterAndSunFormUnit(tablename, mv.List, isMaster) } } case "card", "div": if len(v.List) > 0 { f.GainMasterAndSunFormUnit(tablename, v.List, isMaster) } default: // unitAry = append(unitAry, v) if v.Name != "" { unitAry[v.Name] = v if isMaster { f.MasterInfo = append(f.MasterInfo, v) } } } } if len(unitAry) > 0 { if isMaster { } else { if len(f.SunFormInfo) > 0 { isWrite := true for sk, s := range f.SunFormInfo { if s.TableName == tablename { f.SunFormInfo[sk].UbitInfo = unitAry isWrite = false } } if isWrite { var sunTableCont SunFormInfoList sunTableCont.TableName = tablename sunTableCont.UbitInfo = unitAry f.SunFormInfo = append(f.SunFormInfo, sunTableCont) } } else { var sunTableCont SunFormInfoList sunTableCont.TableName = tablename sunTableCont.UbitInfo = unitAry f.SunFormInfo = append(f.SunFormInfo, sunTableCont) } } } } }