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

503 lines
13 KiB

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
}