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

614 lines
15 KiB

package customerform
import (
"appPlatform/models/modelAppPlatform"
"appPlatform/overall"
"appPlatform/overall/publicmethod"
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 13:02:23
@ 功能: 数据库表结构
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) HaveDataBaseTableStruct(c *gin.Context) {
var requestData publicmethod.CommonId[string]
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(101, err, c)
return
}
//获取自定义表单设置主表信息
var customerFormCont modelAppPlatform.CustomerForm
err = customerFormCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`id`", "`tablename`")
if err != nil {
publicmethod.Result(107, err, c)
return
}
var versionInfo []modelAppPlatform.CustomerFormVersion
err = overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerFormVersion{}).Select("`id`,`tablekey`,`status`,`version`,`table_structure`").Where("`tablekey` = ? AND `status` BETWEEN ? AND ?", customerFormCont.TableNames, 1, 2).Order("status asc").Order("version asc").Order("id desc").Find(&versionInfo).Error
if err != nil {
publicmethod.Result(107, err, c)
return
}
var sunFormStr string
var versionIdStr string
var sendCont CustomerFormDatabaseVesion
if len(versionInfo) > 0 {
for _, v := range versionInfo {
var versionCont PublicFormDatabaseVesion
versionCont.Id = requestData.Id
versionCont.VersionId = strconv.FormatInt(v.Id, 10)
versionCont.Name = fmt.Sprintf("V%v", v.Version)
if v.Status == 1 {
versionCont.IsMain = true
sunFormStr = v.TableStructure
versionIdStr = strconv.FormatInt(v.Id, 10)
//主表单数据
var masterFormTable PublicFormDatabaseVesion
masterFormTable.Id = requestData.Id
masterFormTable.VersionId = versionIdStr
masterFormTable.Name = v.TableKey
masterFormTable.IsMain = true
if num := HaveTableLog(v.TableKey); num > 0 {
masterFormTable.IsEdit = false
} else {
masterFormTable.IsEdit = true
}
sendCont.TableList = append(sendCont.TableList, masterFormTable)
} else {
versionCont.IsMain = false
}
sendCont.Version = append(sendCont.Version, versionCont)
}
}
if sunFormStr != "" {
sunSqlMap := make(map[string]string)
json.Unmarshal([]byte(sunFormStr), &sunSqlMap)
if len(sunSqlMap) > 0 {
for _, s := range sunSqlMap {
var sunFromTableCont PublicFormDatabaseVesion
sunFromTableCont.Id = requestData.Id
sunFromTableCont.VersionId = versionIdStr
sunFromTableCont.Name = s
sunFromTableCont.IsMain = false
if num := HaveTableLog(s); num > 0 {
sunFromTableCont.IsEdit = false
} else {
sunFromTableCont.IsEdit = true
}
sendCont.TableList = append(sendCont.TableList, sunFromTableCont)
}
}
}
publicmethod.Result(0, sendCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 14:34:04
@ 功能: 获取表格是否有记录
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func HaveTableLog(tableName string) (logCount int64) {
err := overall.CONSTANT_DB_CustomerForm.Table(tableName).Select("`id`").First(&logCount).Error
if err != nil {
logCount = 0
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 13:03:11
@ 功能: 读取数据表结构
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func ReadDatabaseForm(tableName string, tableType ...string) (list []Result, err error) {
tableTypes := ""
if len(tableType) > 0 {
tableTypes = tableType[0]
}
gormDb := overall.CONSTANT_DB_CustomerForm
switch tableTypes {
default:
gormDb = overall.CONSTANT_DB_CustomerForm
}
// sqlStr := fmt.Sprintf("DESC %v", tableName)
sqlStr := fmt.Sprintf("SHOW FULL COLUMNS FROM `%v`", tableName)
err = gormDb.Raw(sqlStr).Scan(&list).Error
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 15:25:03
@ 功能: 获取表单结构{"table1693810889577":"table1693810889577","table1693811003658":"table1693811003658","table1693811044212":"table1693811044212"}
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) HaveFormTabelCont(c *gin.Context) {
var requestData HaveVersionForm
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(101, err, c)
return
}
if requestData.Name == "" {
publicmethod.Result(101, err, c)
return
}
//获取自定义表单设置主表信息
var versionCont modelAppPlatform.CustomerFormVersion
err = versionCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`tablekey`", "`mastesformjson`", "`table_structure`")
if err != nil {
publicmethod.Result(107, err, c)
return
}
var formJsonCont CustomerFormMaster
err = json.Unmarshal([]byte(versionCont.MastesFormJson), &formJsonCont)
masterForm, sunForm := AnalyseFormTableJson(formJsonCont)
formStruct, err := ReadDatabaseForm(requestData.Name)
if err != nil {
publicmethod.Result(107, err, c)
return
}
fmt.Printf("%s\n", masterForm)
sendMap := make(map[string]interface{})
// sendMap["masterForm"] = masterForm
// sendMap["sunForm"] = sunForm
// sendMap["formStruct"] = formStruct
// sendMap["err"] = err
// sendMap["formJsonCont"] = formJsonCont
var filedList []Result
if requestData.Name == versionCont.TableKey {
for _, v := range formStruct {
if publicmethod.IsInTrue[string](v.Field, masterForm) {
attFiled := strings.Split(v.Type, " ")
if len(attFiled) >= 2 {
v.Attribute = attFiled[1]
v.Type = attFiled[0]
}
// fmt.Printf("attFiled--->%v--->%v\n", attFiled, len(attFiled))
filedList = append(filedList, v)
}
// attFiled := strings.Split(v.Type, " ")
// if len(attFiled) >= 2 {
// v.Attribute = attFiled[1]
// v.Type = attFiled[0]
// }
// // fmt.Printf("attFiled--->%v--->%v\n", attFiled, len(attFiled))
// filedList = append(filedList, v)
}
} else {
if fieldAry, isOk := sunForm[requestData.Name]; isOk {
for _, v := range formStruct {
if publicmethod.IsInTrue[string](v.Field, fieldAry.([]string)) {
attFiled := strings.Split(v.Type, " ")
if len(attFiled) >= 2 {
v.Attribute = attFiled[1]
v.Type = attFiled[0]
}
filedList = append(filedList, v)
}
}
}
}
sendMap["filedlist"] = filedList
if num := HaveTableLog(requestData.Name); num > 0 {
sendMap["isedit"] = false
} else {
sendMap["isedit"] = true
}
publicmethod.Result(0, sendMap, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 15:38:42
@ 功能: 根据版本获取数据库表集合
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) HaveFormTableList(c *gin.Context) {
var requestData publicmethod.CommonId[string]
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(101, err, c)
return
}
//获取自定义表单设置主表信息
var versionCont modelAppPlatform.CustomerFormVersion
err = versionCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`id`", "`tablekey`", "`status`", "`version`", "`table_structure`")
if err != nil {
publicmethod.Result(107, err, c)
return
}
var customerFormCont modelAppPlatform.CustomerForm
err = customerFormCont.GetCont(map[string]interface{}{"`tablename`": versionCont.TableKey}, "`id`")
if err != nil {
publicmethod.Result(107, err, c)
return
}
formId := strconv.FormatInt(customerFormCont.Id, 10)
var sendAry []PublicFormDatabaseVesion
var masterFormTable PublicFormDatabaseVesion
masterFormTable.Id = formId
masterFormTable.VersionId = requestData.Id
masterFormTable.Name = versionCont.TableKey
masterFormTable.IsMain = true
if num := HaveTableLog(versionCont.TableKey); num > 0 {
masterFormTable.IsEdit = false
} else {
masterFormTable.IsEdit = true
}
sendAry = append(sendAry, masterFormTable)
if versionCont.TableStructure != "" {
sunSqlMap := make(map[string]string)
json.Unmarshal([]byte(versionCont.TableStructure), &sunSqlMap)
if len(sunSqlMap) > 0 {
for _, s := range sunSqlMap {
var sunFromTableCont PublicFormDatabaseVesion
sunFromTableCont.Id = formId
sunFromTableCont.VersionId = requestData.Id
sunFromTableCont.Name = s
sunFromTableCont.IsMain = false
if num := HaveTableLog(s); num > 0 {
sunFromTableCont.IsEdit = false
} else {
sunFromTableCont.IsEdit = true
}
sendAry = append(sendAry, sunFromTableCont)
}
}
}
publicmethod.Result(0, sendAry, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-13 15:57:13
@ 功能: 拆析版本表单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func AnalyseFormTableJson(formJsonCont CustomerFormMaster) (masterForm []string, sunForm map[string]interface{}) {
dataMap := make(map[string]interface{})
fieldType := []string{"input", "password", "colorPicker", "component", "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user", "select", "radio", "inputSlot", "rate", "inputNumber", "slider", "switch", "tinymce"}
cardFieldType := []string{"card"}
customLayout := []string{"grid", "tabs"}
sunFieldType := []string{"table", "flex"}
for _, v := range formJsonCont.List {
if publicmethod.IsInTrue[string](v.Type, fieldType) {
masterForm = append(masterForm, v.Name)
}
//卡片数据
if publicmethod.IsInTrue[string](v.Type, cardFieldType) {
if len(v.List) > 0 {
sqlStr := ComponentMappingDataTableField(v.List)
masterForm = append(masterForm, sqlStr...)
}
}
//自定义布局
if publicmethod.IsInTrue[string](v.Type, customLayout) {
if len(v.Columns) > 0 {
for _, cv := range v.Columns {
sqlStr := ComponentMappingDataTableField(cv.List)
masterForm = append(masterForm, sqlStr...)
}
}
}
//子表
if publicmethod.IsInTrue[string](v.Type, sunFieldType) {
if len(v.List) > 0 {
sqlStr := ComponentMappingDataTableField(v.List)
dataMap[v.Name] = sqlStr
}
}
}
sunForm = dataMap
return
}
/**
@ 作者: 秦东
@ 时间: 2023-09-13 16:14:07
@ 功能: 组件印射字段
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func ComponentMappingDataTableField(list []MasterStruct) (mastSql []string) {
if len(list) > 0 {
for _, lv := range list {
fieldType := []string{"input", "password", "colorPicker", "component", "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user", "select", "radio", "inputSlot", "rate", "inputNumber", "slider", "switch", "tinymce"}
if publicmethod.IsInTrue[string](lv.Type, fieldType) {
mastSql = append(mastSql, lv.Name)
}
}
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-14 09:01:40
@ 功能: 优化/修复数据表
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) OptimizeOrRepairFormTable(c *gin.Context) {
var requestData OptimizeOrRepairTable
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Name == "" {
publicmethod.Result(101, err, c)
return
}
if requestData.OptimizeOrRepair == 1 { //优化表
sqlStr := fmt.Sprintf("OPTIMIZE TABLE %v", requestData.Name)
overall.CONSTANT_DB_CustomerForm.Exec(sqlStr)
} else { //修复表
sqlStr1 := fmt.Sprintf("CHECK TABLE %v", requestData.Name)
overall.CONSTANT_DB_CustomerForm.Exec(sqlStr1)
sqlStr2 := fmt.Sprintf("REPAIR TABLE %v", requestData.Name)
overall.CONSTANT_DB_CustomerForm.Exec(sqlStr2)
}
publicmethod.Result(0, err, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-14 11:50:30
@ 功能: 表单结构数据处理
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) FormFieldHandle(c *gin.Context) {
var requestData Result
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
var sendForm SendFieldCont
sendForm.Field = requestData.Field
sendForm.Type = requestData.Type
sendForm.Attribute = requestData.Attribute
sendForm.Collation = requestData.Collation
sendForm.Null = requestData.Null
sendForm.Key = requestData.Key
sendForm.Default = requestData.Default
sendForm.Extra = requestData.Extra
sendForm.Privileges = requestData.Privileges
sendForm.Comment = requestData.Comment
if requestData.Type == "" {
sendForm.Type = "varchar"
} else {
attFiled := strings.Split(requestData.Type, "(")
sendForm.Type = attFiled[0]
if len(attFiled) > 1 {
fieldLenght := publicmethod.MatchBracket(requestData.Type, "(", ")")
switch sendForm.Type {
case "decimal", "float", "double":
maxAndMin := strings.Split(fieldLenght, ",")
switch len(maxAndMin) {
case 1:
sendForm.Integer = maxAndMin[0]
case 2:
sendForm.Integer = maxAndMin[0]
sendForm.Decimal = maxAndMin[1]
default:
}
default:
sendForm.Integer = fieldLenght
}
}
}
publicmethod.Result(0, sendForm, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-14 15:43:03
@ 功能: 编辑数据库表字段信息
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) EditFormField(c *gin.Context) {
var requestData EditDatabaseFormField
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.FormName == "" || requestData.Field == "" {
publicmethod.Result(101, err, c)
return
}
sqlStr := fmt.Sprintf("ALTER TABLE `%v` MODIFY COLUMN `%v` ", requestData.FormName, requestData.Field)
switch requestData.Type {
case "decimal", "float", "double":
var integerIntVal int64
if requestData.Integer == "" {
integerIntVal = 3
} else {
integerInt, err := strconv.ParseInt(requestData.Integer, 10, 64)
if err == nil {
integerIntVal = integerInt
}
}
decimalVal := integerIntVal - 1
if requestData.Decimal != "" {
decimalVales, err := strconv.ParseInt(requestData.Decimal, 10, 64)
if err == nil {
decimalVal = decimalVales
}
}
if decimalVal == 0 {
decimalVal = integerIntVal
}
sqlStr = fmt.Sprintf(" %v %v(%v,%v) ", sqlStr, requestData.Type, integerIntVal, decimalVal)
case "tinyint", "smallint", "mediumint", "int", "integer", "bigint":
var integerIntVal int64
if requestData.Integer == "" {
integerIntVal = 3
} else {
integerInt, err := strconv.ParseInt(requestData.Integer, 10, 64)
if err == nil {
integerIntVal = integerInt
}
}
sqlStr = fmt.Sprintf(" %v %v(%v) %v ", sqlStr, requestData.Type, integerIntVal, requestData.Attribute)
case "enum", "set", "text", "tinytext", "mediumtext", "longtext", "blob", "year", "date", "time", "datetime", "timestamp":
sqlStr = fmt.Sprintf(" %v %v ", sqlStr, requestData.Type)
default:
if requestData.Integer != "" {
sqlStr = fmt.Sprintf(" %v %v(%v) ", sqlStr, requestData.Type, requestData.Integer)
} else {
sqlStr = fmt.Sprintf(" %v %v ", sqlStr, requestData.Type)
}
}
if requestData.Null == "NO" {
sqlStr = fmt.Sprintf(" %v NOT NULL ", sqlStr)
}
if !publicmethod.IsInTrue[string](requestData.Type, []string{"enum", "set", "text", "tinytext", "mediumtext", "longtext", "blob", "year", "date", "time", "datetime", "timestamp"}) {
sqlStr = fmt.Sprintf(" %v DEFAULT '%v'", sqlStr, requestData.Default)
}
sqlStr = fmt.Sprintf(" %v COMMENT '%v'", sqlStr, requestData.Comment)
err = publicmethod.ExecSql("CustomerForm", sqlStr)
if err != nil {
publicmethod.Result(106, err, c)
return
}
publicmethod.Result(0, err, c)
}