You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
520 lines
15 KiB
520 lines
15 KiB
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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|