应用集成平台服务端
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

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)
}
}
}
}
}