Browse Source

低代码平台一期工程(无工作流)完成

v1
超级管理员 2 years ago
parent
commit
e8711c4a23
  1. 38
      api/shiyan/maptostruct/shiyan.go
  2. 415
      api/shiyan/数据结构收集/所有组件平级.ts
  3. 1253
      api/shiyan/数据结构收集/所有组件组合.ts
  4. 1506
      api/shiyan/数据结构收集/表达组件布局.ts
  5. 122
      api/version1/customerform/analysis_table.go
  6. 25
      api/version1/customerform/datatable.go
  7. 72
      api/version1/customerform/form.go
  8. 520
      api/version1/customerform/formTable.go
  9. 54
      api/version1/customerform/type.go
  10. 515
      api/version1/taskplatform/taskmanagement/appform.go
  11. 734
      api/version1/taskplatform/taskmanagement/formcontrol.go
  12. 2
      apirouter/apishiyan/maptostruct.go
  13. 20
      apirouter/v1/taskrouter/taskrouter.go
  14. 11
      main.go
  15. 47
      overall/publicmethod/technique.go

38
api/shiyan/maptostruct/shiyan.go

@ -377,3 +377,41 @@ func (a *ApiMethod) HanZiZhuanPinYin(c *gin.Context) {
str := pinyin.Slug(requestData.Name, pyObject)
publicmethod.Result(0, str, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-28 15:35:07
@ 功能: 测试表结构数值
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) TestTable(c *gin.Context) {
var requestData publicmethod.PublicName
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Name == "" {
requestData.Name = "shi_yang"
}
masterFormCont := publicmethod.MapOut[string]()
err = overall.CONSTANT_DB_CustomerForm.Table(requestData.Name).Find(&masterFormCont).Error
if err != nil {
publicmethod.Result(107, err, c)
return
}
for k, v := range masterFormCont {
fmt.Printf("%v => %T\n", k, v)
}
}

415
api/shiyan/数据结构收集/所有组件平级.ts

@ -0,0 +1,415 @@
const optAll = {
list: [
{
type: "input",
control:
{
modelValue: ""
},
config:
{},
name: "input1696058746993",
item:
{
label: "单行文本"
}
},
{
type: "password",
control:
{
modelValue: ""
},
config:
{},
name: "input1696058918134",
item:
{
label: "单行文本"
}
},
{
type: "textarea",
control:
{
modelValue: ""
},
config:
{},
name: "textarea1696058748248",
item:
{
label: "多行文本"
}
},
{
type: "radio",
control:
{
modelValue: ""
},
options: [],
config:
{
optionsType: 0
},
name: "radio1696058749689",
item:
{
label: "单选框组"
}
},
{
type: "checkbox",
control:
{
modelValue: []
},
options: [],
config:
{
optionsType: 0
},
name: "checkbox1696058751136",
item:
{
label: "多选框组"
}
},
{
type: "select",
control:
{
modelValue: "",
appendToBody: true
},
options: [],
config:
{
optionsType: 0
},
name: "select1696058753224",
item:
{
label: "下拉选择框"
}
},
{
type: "datePicker",
control:
{
modelValue: "",
type: "date",
valueFormat: "x"
},
config:
{},
name: "datePicker1696058754895",
item:
{
label: "日期选择器"
}
},
{
type: "timePicker",
control:
{
modelValue: ""
},
config:
{},
name: "timePicker1696058756240",
item:
{
label: "时间选择器"
}
},
{
type: "colorPicker",
control:
{
modelValue: ""
},
config:
{},
name: "colorPicker1696058757846",
item:
{
label: "取色器"
}
},
{
type: "switch",
control:
{
modelValue: false
},
config:
{},
name: "switch1696058780439",
item:
{
label: "开关"
}
},
{
type: "inputNumber",
control:
{
modelValue: 0
},
config:
{},
name: "inputNumber1696058782096",
item:
{
label: "计数器"
}
},
{
type: "cascader",
control:
{
modelValue: []
},
options: [],
config:
{
optionsType: 0
},
name: "cascader1696058783721",
item:
{
label: "级联选择器"
}
},
{
type: "rate",
control:
{
modelValue: 0
},
config:
{},
name: "rate1696058785728",
item:
{
label: "评分"
}
},
{
type: "slider",
control:
{
modelValue: 0
},
config:
{},
name: "slider1696058788101",
item:
{
label: "滑块"
}
},
{
type: "treeSelect",
control:
{
modelValue: "",
data: [],
renderAfterExpand: false
},
config:
{
optionsType: 0
},
name: "treeSelect1696058790114",
item:
{
label: "树形控件"
}
},
{
type: "txt",
control:
{
modelValue: ""
},
config:
{}
},
{
type: "title",
control:
{
modelValue: "标题"
},
config:
{}
},
{
type: "button",
control:
{
label: "保存"
},
config:
{}
},
{
type: "table",
list: [],
tableData: [],
control:
{
border: true
},
config:
{
addBtnText: "添加一行"
},
name: "table1696058799887"
},
{
type: "component",
control:
{
modelValue: ""
},
config:
{},
name: "component1696058802415",
item:
{
label: "自定义组件"
}
},
{
type: "upload",
control:
{
modelValue: "",
action: "/dev-api/api/upordown"
},
config:
{},
name: "upload1696058806299",
item:
{
label: "图片/文件"
}
},
{
type: "tinymce",
control:
{
modelValue: ""
},
config:
{},
name: "tinymce1696058809231",
item:
{
label: "富文本"
}
},
{
type: "grid",
columns: [
{
attr:
{
span: 12
},
list: []
},
{
attr:
{
span: 12
},
list: []
}],
control:
{},
config:
{}
},
{
type: "tabs",
columns: [
{
label: "Tab1",
list: []
}],
control:
{},
config:
{}
},
{
type: "card",
list: [],
control:
{},
config:
{},
item:
{
label: "卡片布局"
}
},
{
type: "flex",
list: [],
tableData: [],
control:
{},
config:
{
addBtnText: "添加一行"
},
name: "flex1696058823576"
},
{
type: "divider",
control:
{},
config:
{},
item:
{
label: "分割线"
}
},
{
type: "div",
control:
{},
config:
{},
list: []
},
{
type: "expand-user",
control:
{
modelValue: ""
},
config:
{},
name: "expand-user1696058834253",
item:
{
label: "选择用户"
}
}],
form:
{
size: "default",
name: "customer_form_168743329826082816",
formName: "未命名表单_168743329826082816"
},
config:
{}
}

1253
api/shiyan/数据结构收集/所有组件组合.ts

File diff suppressed because it is too large

1506
api/shiyan/数据结构收集/表达组件布局.ts

File diff suppressed because it is too large

122
api/version1/customerform/analysis_table.go

@ -2,6 +2,7 @@ package customerform
import (
"appPlatform/overall/publicmethod"
"encoding/json"
"fmt"
"strconv"
)
@ -50,7 +51,7 @@ func AnalysisTable(subUnit MasterStruct) (fieldCont TableFormStruct) {
fieldCont.ControlType = "array"
fieldCont.DefaultValue = 0
fieldCont.FieldLenght = 20
fieldCont.Signed = true
default:
fieldCont.Types = "mediumtext"
@ -150,8 +151,9 @@ func AnalysisTable(subUnit MasterStruct) (fieldCont TableFormStruct) {
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"
@ -167,6 +169,8 @@ func AnalysisTable(subUnit MasterStruct) (fieldCont TableFormStruct) {
fieldCont.ControlType = fieldType
if scm, scmIsok := subUnit.Control.ModelValue.(int); scmIsok {
fieldCont.DefaultValue = scm
} else {
fieldCont.DefaultValue = 0
}
fieldCont.FieldLenght = size
@ -316,10 +320,8 @@ func CalculateCharacterLength(class, str string) (size int, fieldType string) {
#
*/
func (c *CustomerFormMaster) CreateFormDatabaseTable() (relevance string, err error) {
err = CreateForm(c.Form.Name, c.Form.FormName, true) //创建主表
if err != nil {
return
}
isSunTable := false
var masterSql []string //主数据库添加字段语句集合
var sunFormName []string //子表名称集合
sunFormNameAry := publicmethod.MapOut[string]() //子表对应关系
@ -330,7 +332,6 @@ func (c *CustomerFormMaster) CreateFormDatabaseTable() (relevance string, err er
case "grid", "tabs":
if len(v.Columns) > 0 {
for _, cv := range v.Columns {
// fmt.Printf("type:%v <===========>label:%v <===========> Name:%v<===========> ModelValue:%v\n", v.Type, cv.Attr.Span, cv.Type, v.Control.ModelValue)
sqlStr := VesselSubUnitConvertSql(c.Form.Name, cv.List)
if len(sqlStr) > 0 {
masterSql = append(masterSql, sqlStr...)
@ -347,61 +348,57 @@ func (c *CustomerFormMaster) CreateFormDatabaseTable() (relevance string, err er
}
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), false)
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), false)
CreateForm(sunTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), "InnoDB", false)
}
}
default:
sqlMasterStr := SubUnitConvertSql(c.Form.Name, v)
if sqlMasterStr != "not" {
masterSql = append(masterSql, sqlMasterStr)
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)
}
}
}
// masterSql = append(masterSql, SubUnitConvertSql(c.Form.Name, v))
// fielfInfoClass := AnalysisTable(v)
// unsigned := ""
// if !fielfInfoClass.Signed {
// unsigned = "unsigned"
// }
// switch fielfInfoClass.Types {
// case "int", "bigint":
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label))
// case "booble":
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(1) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, unsigned, fielfInfoClass.DefaultValue, v.Item.Label))
// case "float":
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,%v) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label))
// case "decimal":
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v,2) %v NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, unsigned, fielfInfoClass.DefaultValue, v.Item.Label))
// case "mediumtext", "longtext":
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, v.Item.Label))
// default:
// masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v(%v) COLLATE utf8mb4_general_ci NOT NULL DEFAULT %v COMMENT '%v'", c.Form.Name, v.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.DefaultValue, v.Item.Label))
// }
}
}
// 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)
//创建主表
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
}
@ -425,11 +422,22 @@ func (c *CustomerFormMaster) CreateFormDatabaseTable() (relevance string, err er
func VesselSubUnitConvertSql(tableName string, list []MasterStruct) (mastSql []string) {
if len(list) > 0 {
for _, v := range list {
sqlStr := SubUnitConvertSql(tableName, v)
if sqlStr != "not" {
mastSql = append(mastSql, sqlStr)
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
@ -453,7 +461,7 @@ func VesselSubUnitConvertSql(tableName string, list []MasterStruct) (mastSql []s
#func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string)
*/
func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string) {
func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string, sqlAry []string) {
if tablename == "" {
sql = "not"
return
@ -463,9 +471,21 @@ func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string) {
if !fielfInfoClass.Signed {
unsigned = "unsigned"
}
switch fielfInfoClass.Types {
case "int", "bigint":
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)
//值类型是数组,并且需要分开存储
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":
@ -476,7 +496,7 @@ func SubUnitConvertSql(tablename string, subUnit MasterStruct) (sql string) {
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 %v COMMENT '%v'", tablename, subUnit.Name, fielfInfoClass.Types, fielfInfoClass.FieldLenght, fielfInfoClass.DefaultValue, subUnit.Item.Label)
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

25
api/version1/customerform/datatable.go

@ -214,7 +214,7 @@ func (a *ApiMethod) HaveFormTabelCont(c *gin.Context) {
publicmethod.Result(107, err, c)
return
}
fmt.Printf("%s\n", masterForm)
fmt.Printf("masterForm---->%s---->%s\n", requestData.Name, versionCont.TableKey)
sendMap := make(map[string]interface{})
// sendMap["masterForm"] = masterForm
// sendMap["sunForm"] = sunForm
@ -244,18 +244,23 @@ func (a *ApiMethod) HaveFormTabelCont(c *gin.Context) {
// 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)
fmt.Printf("sunForm[requestData.Name]=====>%v\n", sunForm)
// if fieldAry, isOk := sunForm[requestData.Name]; isOk {
for _, v := range formStruct {
// if publicmethod.IsInTrue[string](v.Field, fieldAry.([]string)) {
if !publicmethod.IsInTrue[string](v.Field, []string{"id", "masters_key", "creater", "creater_time", "edit_time"}) {
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 {

72
api/version1/customerform/form.go

@ -221,8 +221,10 @@ func (a *ApiMethod) SaveCustomerForm(c *gin.Context) {
formVersion.Creater = userCont.Key //ult:0;not null;comment:创建人"`
formVersion.CreaterTime = cureeTime //not null;comment:创建时间"`
formVersion.EditTime = cureeTime //efault:0;not null;comment:编辑时间"`
mastSql, _ := formJsonCont.CreateFormDatabaseTable()
// mastSql, _ := formJsonCont.CreateFormDatabaseTable()
// mastSql, _ := formJsonCont.DisassembleForm()
mastSql, _ := formJsonCont.CreateFormTable()
formVersion.TableStructure = mastSql //;default:'';comment:字表结构"`
formVersion.Dict = requestData.Dict //字表结构"`
@ -235,12 +237,13 @@ func (a *ApiMethod) SaveCustomerForm(c *gin.Context) {
publicmethod.Result(104, customerFormCont, c)
return
}
createDb.Commit()
err = createDb.Create(&customerFormCont).Error
if err != nil {
publicmethod.Result(104, customerFormCont, c)
return
}
err = createDb.Commit().Error
// err = createDb.Create(&customerFormCont).Error
// if err != nil {
// publicmethod.Result(104, customerFormCont, c)
// return
// }
publicmethod.Result(0, err, c)
}
@ -509,10 +512,7 @@ func (a *ApiMethod) SaveSetupCont(c *gin.Context) {
#
*/
func (c *CustomerFormMaster) DisassembleForm() (relevance string, err error) {
err = CreateForm(c.Form.Name, c.Form.FormName, true)
if err != nil {
return
}
isSunTable := false
var masterSql []string
var sunFormName []string
sunFormNameAry := publicmethod.MapOut[string]()
@ -536,19 +536,20 @@ func (c *CustomerFormMaster) DisassembleForm() (relevance string, err error) {
}
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 := ComponentMappingDataTable(v.Name, v.List)
sunForm[v.Name] = sqlStr
CreateForm(v.Name, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false)
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 := ComponentMappingDataTable(sunTableName, v.List)
sunForm[sunTableName] = sqlStr
CreateForm(sunTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false)
CreateForm(sunTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), "InnoDB", false)
}
}
@ -574,6 +575,15 @@ func (c *CustomerFormMaster) DisassembleForm() (relevance string, err error) {
}
}
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
}
// fmt.Printf("主表单结构---》%v\n", masterSql)
CreateFormFiled(c.Form.Name, c.Form.FormName, true, masterSql)
if len(sunForm) > 0 {
@ -610,15 +620,28 @@ func (c *CustomerFormMaster) DisassembleForm() (relevance string, err error) {
func CreateFormFiled(formName, formNotes string, isMasters bool, sqlList interface{}) {
// fmt.Printf("函数类型----%v---%T\n", reflect.TypeOf(sqlList), sqlList)
if sql, isOk := sqlList.([]string); isOk {
for _, v := range sql {
for k, v := range sql {
// fmt.Printf("%v\n", v)
overall.CONSTANT_DB_CustomerForm.Exec(v)
// overall.CONSTANT_DB_CustomerForm.Exec(v)
syncSeting.Add(1)
go CoroutineExecuteSql(k, v)
// err := overall.CONSTANT_DB_CustomerForm.Exec(v).Error
// fmt.Printf("字段创建----%v---%v\n", err, v)
}
syncSeting.Wait()
}
}
// 协程执行mysql语句
func CoroutineExecuteSql(k int, sql string) {
fmt.Printf("%v---------->%v\n", k, sql)
defer syncSeting.Done()
overall.CONSTANT_DB_CustomerForm.Exec(sql)
// overall.CONSTANT_DB_CustomerForm.Raw(sql)
}
/*
*
@ 作者: 秦东
@ -626,7 +649,9 @@ func CreateFormFiled(formName, formNotes string, isMasters bool, sqlList interfa
@ 功能: 创建表单
@ 参数
#
#formName 数据表名称
#notes 数据表描述
#engine 数据表引擎 MyISAM
@ 返回值
@ -636,18 +661,21 @@ func CreateFormFiled(formName, formNotes string, isMasters bool, sqlList interfa
#
*/
func CreateForm(formName, notes string, isMasters bool) (err error) {
func CreateForm(formName, notes, engine string, isMasters bool) (err error) {
if engine == "" {
engine = "MyISAM"
}
//判断表单是否存在
isTrue := overall.CONSTANT_DB_CustomerForm.Migrator().HasTable(formName)
if !isTrue { //当数据表不存在时进行创建
if isMasters {
//创建主表
sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`flow_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流程识别标识',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,UNIQUE KEY `masters_key` (`masters_key`) USING HASH) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, notes)
sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`flow_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流程识别标识',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,UNIQUE KEY `masters_key` (`masters_key`) USING HASH) ENGINE=%v DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, engine, notes)
err = overall.CONSTANT_DB_CustomerForm.Exec(sqlCreateTable).Error
} else {
//创建子表
sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,KEY `masters_key` (`masters_key`) USING HASH) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, notes)
sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,KEY `masters_key` (`masters_key`) USING HASH) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, notes)
err = overall.CONSTANT_DB_CustomerForm.Exec(sqlCreateTable).Error
}
}
@ -911,7 +939,8 @@ func (a *ApiMethod) EditCustomerFormInfo(c *gin.Context) {
versionData["`mastesformjson`"] = requestData.JsonData
versionData["`creater`"] = userCont.Key
// mastSql, _ := formJsonCont.DisassembleForm()
mastSql, _ := formJsonCont.CreateFormDatabaseTable()
// mastSql, _ := formJsonCont.CreateFormDatabaseTable()
mastSql, _ := formJsonCont.CreateFormTable()
versionData["`table_structure`"] = mastSql
versionData["`dict`"] = requestData.Dict
var formVersion modelAppPlatform.CustomerFormVersion
@ -990,7 +1019,8 @@ func (a *ApiMethod) SaveAsNewVersion(c *gin.Context) {
formVersion.CreaterTime = cureeTime //not null;comment:创建时间"`
formVersion.EditTime = cureeTime //efault:0;not null;comment:编辑时间"`
// mastSql, _ := formJsonCont.DisassembleForm()
mastSql, _ := formJsonCont.CreateFormDatabaseTable()
// mastSql, _ := formJsonCont.CreateFormDatabaseTable()
mastSql, _ := formJsonCont.CreateFormTable()
formVersion.TableStructure = mastSql //;default:'';comment:字表结构"`
formVersion.Dict = requestData.Dict //字表结构"`
errVer := overall.CONSTANT_DB_AppPlatform.Create(&formVersion).Error

520
api/version1/customerform/formTable.go

@ -0,0 +1,520 @@
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)
}
}
}
}
}

54
api/version1/customerform/type.go

@ -288,10 +288,52 @@ type EditDatabaseFormField struct {
// 分析表单结构
type TableFormStruct struct {
TableName string `json:"tablename"` //字段名称
Types string `json:"types"` //组件类型
FieldLenght int `json:"fieldlenght"` //字段长度
ControlType string `json:"controlType"` //
DefaultValue interface{} `json:"defaultValue"` //
Signed bool `json:"signed"` //
TableName string `json:"tablename"` //字段名称
Types string `json:"types"` //组件类型
FieldLenght int `json:"fieldlenght"` //字段长度
ControlType string `json:"controlType"` //
DefaultValue interface{} `json:"defaultValue"` //
DefaultValuees interface{} `json:"defaultValue"` //
Signed bool `json:"signed"` //
}
// 自定义表单转sql语句
type FormTableSql struct {
MasterSql []string
SunSql []SunSqlCont
}
type SunSqlCont struct {
TableName string //表格名称
SqlAry []string //语句
}
// 分析表格组件数据类型
type AnalysisFormSubUnitClass struct {
UnitName string //组件名称
UnitType string //组件类型
ValIsAry bool //结果是否为数组
FieldType string //值类型
MaxVal interface{} //最大默认值
MinVal interface{} //最小默认值
Signed bool //值是否有符号(只针对数字型组件)
WordName string //组件数据表名称
Describe string //字段描述
}
type fieldStruct struct {
Types string //
MaxVal int
MinVal int
Signed bool //值是否有符号(只针对数字型组件)
}
// 表单组件
type FormUnitInfo struct {
MasterInfo []MasterStruct //主表组件列表
SunFormInfo []SunFormInfoList //子表
}
type SunFormInfoList struct {
TableName string //表名称
UbitInfo map[string]MasterStruct //相关组件
}

515
api/version1/taskplatform/taskmanagement/appform.go

@ -1,6 +1,7 @@
package taskmanagement
import (
"appPlatform/api/version1/customerform"
"appPlatform/models/modelAppPlatform"
"appPlatform/models/modelshr"
"appPlatform/overall"
@ -9,6 +10,7 @@ import (
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
@ -255,6 +257,9 @@ func (a *ApiMethod) CustomerFormAddData(c *gin.Context) {
}
}
}
var formJsonCont customerform.CustomerFormMaster
json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont)
context, _ := c.Get(overall.MyContJwt)
var userCont modelshr.ManCont
userCont.GetLoginCont(context)
@ -410,12 +415,105 @@ func WriteDatabase(uuid, creater, createrTime int64, taskCont modelAppPlatform.T
#
*/
func (a *ApiMethod) CustomerFormEditData(c *gin.Context) {
requestData := publicmethod.MapOut[string]()
err := c.ShouldBindQuery(&requestData)
data, err := c.GetRawData() //接收表单提交得数据
if err != nil {
publicmethod.Result(100, err, c)
return
}
mapData := publicmethod.MapOut[string]() //初始化MAP
err = json.Unmarshal(data, &mapData) //将json字符串转换成Map
if err != nil {
publicmethod.Result(100, err, c)
return
}
if _, ok := mapData["formId"]; !ok {
publicmethod.Result(1, err, c, "非法表单!不能提交数据!")
return
}
if _, ok := mapData["id"]; !ok {
publicmethod.Result(1, err, c, "非法表单!不能提交数据!")
return
}
var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单
err = formCont.GetCont(map[string]interface{}{"`id`": mapData["id"]})
if err != nil {
publicmethod.Result(107, err, c)
return
}
var sunFormName []string //子表名称集合
if formCont.TableStructure != "" { //拆解获取子表名称
var sunFormStruct map[string]string
err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct)
if err == nil {
for _, v := range sunFormStruct {
if !publicmethod.IsInTrue[string](v, sunFormName) {
sunFormName = append(sunFormName, v)
}
}
}
}
masterField := publicmethod.MapOut[string]() //主表数据
sunFieldAry := publicmethod.MapOut[string]() //子表数据
for k, v := range mapData {
if !publicmethod.IsInTrue[string](k, sunFormName) {
if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) {
masterField[k] = v
}
} else {
sunFieldAry[k] = v
}
}
context, _ := c.Get(overall.MyContJwt)
var userCont modelshr.ManCont
userCont.GetLoginCont(context) //当前操作人
cureeTime := time.Now().Unix()
var formJsonCont customerform.CustomerFormMaster
json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont)
var formUnitCont customerform.FormUnitInfo
formUnitCont.GainMasterAndSunFormUnit(formCont.TableKey, formJsonCont.List, true)
masterUnitList := make(map[string]customerform.MasterStruct)
for _, v := range formUnitCont.MasterInfo {
masterUnitList[v.Name] = v
}
uuid, _ := strconv.ParseInt(mapData["formId"].(string), 10, 64)
masrWriteMap := MakeFormMapData(uuid, userCont.Key, cureeTime, masterField, masterUnitList, 2)
//判断是否
if len(sunFieldAry) > 0 {
//有子表
sunTypeAry := make(map[string]map[string]customerform.MasterStruct)
for _, v := range formUnitCont.SunFormInfo {
sunTypeAry[v.TableName] = v.UbitInfo
}
err = EditWriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masrWriteMap, sunFieldAry, sunTypeAry)
} else {
err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Where("`masters_key` = ?", uuid).Updates(masterUnitList).Error
}
if err != nil {
publicmethod.Result(104, err, c)
return
}
var taskCont modelAppPlatform.Task
// taskCont.Creater = userCont.Key
// taskCont.EditTime = cureeTime
saveData := publicmethod.MapOut[string]()
saveData["`edit_time`"] = time.Now().Unix()
saveData["`creater`"] = userCont.Key
err = taskCont.EiteCont(map[string]interface{}{"`masters_key`": uuid}, saveData)
sendData := publicmethod.MapOut[string]()
sendData["err"] = err
sendData["requestData"] = sendData
publicmethod.Result(0, sendData, c)
sendData["cureeTime"] = cureeTime
sendData["formJsonCont"] = formJsonCont
sendData["masterUnitList"] = masterUnitList
sendData["masrWriteMap"] = masrWriteMap
publicmethod.Result(0, err, c)
}
/*
@ -451,22 +549,59 @@ func (a *ApiMethod) LookCustomerFormData(c *gin.Context) {
return
}
var customerFormCont modelAppPlatform.CustomerFormView
err = customerFormCont.GetCont(map[string]interface{}{"`id`": requestData.MastersKey}, "`tablekey`", "`table_structure`", "`name`", "`classify`")
err = customerFormCont.GetCont(map[string]interface{}{"`id`": requestData.MastersKey}, "`tablekey`", "`table_structure`", "`name`", "`classify`", "`mastesformjson`")
if err != nil {
publicmethod.Result(107, err, c)
return
}
var formJsonCont customerform.CustomerFormMaster
json.Unmarshal([]byte(customerFormCont.MastesFormJson), &formJsonCont)
var formUnitCont customerform.FormUnitInfo
formUnitCont.GainMasterAndSunFormUnit(customerFormCont.TableKey, formJsonCont.List, true)
masterUnitList := make(map[string]customerform.MasterStruct)
for _, v := range formUnitCont.MasterInfo {
masterUnitList[v.Name] = v
}
// fmt.Printf("formUnitCont--->%v\n", formUnitCont)
masterFormCont := publicmethod.MapOut[string]()
err = overall.CONSTANT_DB_CustomerForm.Table(customerFormCont.TableKey).Where("`masters_key` = ?", requestData.Id).Find(&masterFormCont).Error
err = overall.CONSTANT_DB_CustomerForm.Table(customerFormCont.TableKey).Where("`masters_key` = ?", requestData.Id).Take(&masterFormCont).Error
if err != nil {
publicmethod.Result(107, err, c)
return
}
// CallBackVal(masterFormCont, masterUnitList)
masterFormCont = CustomerFormCallBackVal(masterFormCont, masterUnitList)
if customerFormCont.TableStructure != "" {
sunFormTable := publicmethod.MapOut[string]()
err = json.Unmarshal([]byte(customerFormCont.TableStructure), &sunFormTable)
sunTypeAry := make(map[string]map[string]customerform.MasterStruct)
for _, v := range formUnitCont.SunFormInfo {
sunTypeAry[v.TableName] = v.UbitInfo
}
if err == nil {
for _, v := range sunFormTable {
var sunContList []map[string]interface{}
if tableName, isOk := v.(string); isOk {
overall.CONSTANT_DB_CustomerForm.Table(tableName).Where("`masters_key` = ?", requestData.Id).Find(&sunContList)
masterFormCont[tableName] = sunContList
var sunContListZhuanBian []map[string]interface{}
if len(sunContList) > 0 {
for _, sclv := range sunContList {
if sunTableType, sunIsOk := sunTypeAry[tableName]; sunIsOk {
masterFormCont := CustomerFormCallBackVal(sclv, sunTableType)
sunContListZhuanBian = append(sunContListZhuanBian, masterFormCont)
} else {
sunContListZhuanBian = append(sunContListZhuanBian, sclv)
}
}
}
masterFormCont[tableName] = sunContListZhuanBian
}
}
}
@ -475,5 +610,371 @@ func (a *ApiMethod) LookCustomerFormData(c *gin.Context) {
sendData["err"] = err
sendData["customerFormCont"] = customerFormCont
sendData["masterFormCont"] = masterFormCont
sendData["formJsonCont"] = formJsonCont
sendData["customerFormCont.MastesFormJson"] = customerFormCont.MastesFormJson
publicmethod.Result(0, masterFormCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-28 11:22:08
@ 功能: 自定义表单返回值处理
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func CallBackVal(val map[string]interface{}, valClass map[string]customerform.MasterStruct) map[string]interface{} {
convertVal := publicmethod.MapOut[string]()
if len(val) > 0 {
for k, v := range val {
if val, isOk := valClass[k]; isOk {
fielfInfoClass := customerform.AnalysisTable(val)
switch fielfInfoClass.Types {
case "int", "bigint":
//值类型是数组,并且需要分开存储
switch fielfInfoClass.ControlType {
case "year":
convertVal[k] = publicmethod.TypeToClass(v, 16)
case "month":
convertVal[k] = publicmethod.TypeToClass(v, 15)
case "date":
convertVal[k] = publicmethod.TypeToClass(v, 14)
case "datetime":
convertVal[k] = publicmethod.TypeToClass(v, 11)
case "booble":
if v == fielfInfoClass.DefaultValue {
convertVal[k] = true
} else {
convertVal[k] = false
}
case "array":
var timeAry []string
sterTrime := convertVal[k]
timeAry = append(timeAry, publicmethod.TypeToClass(sterTrime, 14))
endKey := fmt.Sprintf("%v_end", k)
// var endTrime int64
if endVal, ok := convertVal[endKey]; ok {
// convertVal[endKey] = publicmethod.TypeToClass(endVal, 14)
timeAry = append(timeAry, publicmethod.TypeToClass(endVal, 14))
}
convertVal[k] = timeAry
default:
convertVal[k] = v
}
case "booble":
if v == fielfInfoClass.DefaultValue {
convertVal[k] = true
} else {
convertVal[k] = false
}
case "decimal", "float":
convertVal[k] = v
case "mediumtext", "longtext":
if fielfInfoClass.ControlType == "array" {
if v != "" {
if vStr, ok := v.(string); ok {
var vJson []string
json.Unmarshal([]byte(vStr), &vJson)
convertVal[k] = vJson
}
}
} else {
convertVal[k] = v
}
default:
if fielfInfoClass.ControlType == "array" {
if v != "" {
if vStr, ok := v.(string); ok {
var vJson []string
json.Unmarshal([]byte(vStr), &vJson)
convertVal[k] = vJson
}
}
} else {
convertVal[k] = v
}
}
} else {
convertVal[k] = v
}
}
}
return convertVal
}
/*
*
@ 作者: 秦东
@ 时间: 2023-10-08 13:32:06
@ 功能: 自定义表单返回值处理
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func CustomerFormCallBackVal(val map[string]interface{}, valClass map[string]customerform.MasterStruct) map[string]interface{} {
convertVal := publicmethod.MapOut[string]()
// fmt.Printf("fielfInfoClass---1-->%v: %v\n", val, valClass)
if len(val) > 0 {
for k, v := range val {
if vals, isOk := valClass[k]; isOk {
fielfInfoClass := customerform.AnalysisFormUnitClass(vals)
// fmt.Printf("fielfInfoClass----->%v: %v\n", k, fielfInfoClass.FieldType)
switch fielfInfoClass.FieldType {
case "int":
if strVal, ok := v.(string); ok {
convertVal[k], _ = strconv.Atoi(strVal)
} else {
convertVal[k] = v
}
case "bigint":
if fielfInfoClass.ValIsAry { //判断值是否为数组
endField := fmt.Sprintf("%v_end", k)
var sendVal []interface{}
if strVal, ok := v.(string); ok {
vInt64, _ := strconv.ParseInt(strVal, 10, 64)
sendVal = append(sendVal, vInt64)
} else {
sendVal = append(sendVal, v)
}
if endKeyVal, ok := val[endField]; ok {
if endVal, endOk := endKeyVal.(string); endOk {
endValInt64, _ := strconv.ParseInt(endVal, 10, 64)
sendVal = append(sendVal, endValInt64)
} else {
sendVal = append(sendVal, endVal)
}
}
convertVal[k] = sendVal
} else {
if strVal, ok := v.(string); ok {
fieldVal, _ := strconv.ParseInt(strVal, 10, 64)
convertVal[k] = fieldVal
} else {
convertVal[k] = v
}
}
case "float":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
convertVal[k] = floatVal
} else {
convertVal[k] = v
}
case "decimal":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
convertVal[k] = floatVal
} else {
convertVal[k] = v
}
case "mediumtext", "longtext":
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
convertVal[k] = string(valStrJson)
} else {
convertVal[k] = ""
}
} else {
if fielfInfoClass.ValIsAry {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
convertVal[k] = string(valStrJson)
} else {
convertVal[k] = ""
}
} else {
convertVal[k] = v
}
} else {
convertVal[k] = v
}
}
case "varchar":
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
convertVal[k] = string(valStrJson)
} else {
convertVal[k] = ""
}
} else {
if fielfInfoClass.ValIsAry {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
convertVal[k] = string(valStrJson)
} else {
convertVal[k] = ""
}
} else {
convertVal[k] = v
}
} else {
convertVal[k] = v
}
}
default:
}
} else {
convertVal[k] = v
}
}
}
return convertVal
}
/*
*
@ 作者: 秦东
@ 时间: 2023-10-08 16:44:58
@ 功能:
@ 参数
#uuid 唯一标识
#creater 创建人
#createrTime 创建时间
#masterTableName 主表标识
#masterDataCont 主表数据
#sunDataList 字表数据列表
@ 返回值
#
@ 方法原型
#
*/
func EditWriteSunDatabase(uuid, creater, createrTime int64, masterTableName string, masterDataCont, sunDataList map[string]interface{}, sunTable map[string]map[string]customerform.MasterStruct) (err error) {
if len(masterDataCont) > 0 {
if len(sunDataList) > 0 {
sunMasterMap := publicmethod.MapOut[string]()
//子表存在时,执行主表和子表数据写入
for k, v := range sunDataList {
// if k == "table1693811044212" {
s, ok := v.([]interface{}) //获取值类型
if !ok {
err = errors.New("表单数据错误!请验证后重新提交!")
return
} else {
//判断是否有数据
if len(s) > 0 {
var sunCont []map[string]interface{}
for _, sv := range s { //拆分子表
if sdf, isOk := sv.(map[string]interface{}); isOk {
if sunTableType, sunIsOk := sunTable[k]; sunIsOk {
masterWriteVal := MakeFormMapData(uuid, creater, createrTime, sdf, sunTableType, 2) //转换数据表值
if len(masterWriteVal) > 0 {
sunCont = append(sunCont, masterWriteVal)
}
}
}
}
if len(sunCont) > 0 {
sunMasterMap[k] = sunCont
}
}
}
}
if len(sunMasterMap) > 0 {
gormDb := overall.CONSTANT_DB_CustomerForm.Begin()
masterErr := gormDb.Table(masterTableName).Where("`masters_key` = ?", uuid).Updates(masterDataCont).Error
sunCreateIsOk := true
for k, v := range sunMasterMap {
delSql := fmt.Sprintf("DELETE FROM %v WHERE `masters_key` = %v", k, uuid)
delErr := overall.CONSTANT_DB_CustomerForm.Exec(delSql).Error
if delErr == nil {
sunErr := gormDb.Table(k).Create(v).Error
if sunErr != nil {
sunCreateIsOk = false
break
}
} else {
sunCreateIsOk = false
}
}
if masterErr == nil && sunCreateIsOk {
err = gormDb.Commit().Error
} else {
gormDb.Rollback()
err = errors.New("表单数据提交失败!请重新提交")
}
}
} else {
//子表不存在时,写入主表数据
err = overall.CONSTANT_DB_CustomerForm.Table(masterTableName).Where("`masters_key` = ?", uuid).Updates(masterDataCont).Error
}
} else {
err = errors.New("表单数据提交失败!请重新提交")
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-10-09 08:37:50
@ 功能: 删除自定义表单记录数据
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) DelCustomerFormDataLog(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(1, err, c, "未知数据")
return
}
var taskCont modelAppPlatform.Task
err = taskCont.GetCont(map[string]interface{}{"`id`": requestData.Id})
if err != nil {
publicmethod.Result(107, err, c)
return
}
saveData := publicmethod.MapOut[string]()
saveData["`edit_time`"] = time.Now().Unix()
saveData["`status`"] = 5
err = taskCont.EiteCont(map[string]interface{}{"`id`": requestData.Id}, saveData)
if err != nil {
publicmethod.Result(106, err, c)
return
}
publicmethod.Result(0, err, c)
}

734
api/version1/taskplatform/taskmanagement/formcontrol.go

@ -0,0 +1,734 @@
package taskmanagement
import (
"appPlatform/api/version1/customerform"
"appPlatform/models/modelAppPlatform"
"appPlatform/models/modelshr"
"appPlatform/overall"
"appPlatform/overall/publicmethod"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2023-09-27 14:21:08
@ 功能: 用户端自定义表单新增记录
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) AddFormAddData(c *gin.Context) {
data, err := c.GetRawData() //接收表单提交得数据
if err != nil {
publicmethod.Result(100, err, c)
return
}
mapData := publicmethod.MapOut[string]() //初始化MAP
err = json.Unmarshal(data, &mapData) //将接收的json字符串参数转换成Map
if err != nil {
publicmethod.Result(100, err, c)
return
}
if _, ok := mapData["formId"]; !ok {
publicmethod.Result(1, err, c, "非法表单!不能提交数据!")
return
}
sendData := publicmethod.MapOut[string]()
var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单
err = formCont.GetCont(map[string]interface{}{"`id`": mapData["formId"]})
if err != nil {
publicmethod.Result(107, err, c)
return
}
var sunFormName []string //子表名称集合
if formCont.TableStructure != "" { //拆解获取子表名称
var sunFormStruct map[string]string
err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct)
if err == nil {
for _, v := range sunFormStruct {
if !publicmethod.IsInTrue[string](v, sunFormName) {
sunFormName = append(sunFormName, v)
}
}
}
}
masterField := publicmethod.MapOut[string]()
sunFieldAry := publicmethod.MapOut[string]()
for k, v := range mapData {
if !publicmethod.IsInTrue[string](k, sunFormName) {
if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) {
masterField[k] = v
}
} else {
sunFieldAry[k] = v
}
}
context, _ := c.Get(overall.MyContJwt)
var userCont modelshr.ManCont
userCont.GetLoginCont(context)
uuid := publicmethod.GetUUid(1)
cureeTime := time.Now().Unix()
master, sunTable, jsonerr := GainFormStruct(formCont.MastesFormJson)
if jsonerr != nil {
publicmethod.Result(104, err, c)
return
}
// master, _, _ := GainFormStruct(formCont.MastesFormJson)
masterWriteVal := MakeTableVal(uuid, userCont.Key, cureeTime, masterField, master)
//任务列表
var taskCont modelAppPlatform.Task
taskCont.MastersKey = uuid
taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"`
taskCont.Creater = userCont.Key //创建人"`
taskCont.CreaterTime = cureeTime //创建时间"`
taskCont.EditTime = cureeTime //编辑时间"`
taskCont.Types = 1 //类型(1:普通表单;2:流程表单)"`
taskCont.VersionId = formCont.Id //来源于哪个表单"`
taskCont.Status = 2
//判断是否
if len(sunFieldAry) > 0 {
//有子表
err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masterWriteVal, sunFieldAry, sunTable)
} else {
//无子表
err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masterWriteVal).Error
}
if err != nil {
publicmethod.Result(104, err, c)
return
}
overall.CONSTANT_DB_AppPlatform.Create(&taskCont)
// sendData["err"] = err
// sendData["data"] = data
// sendData["mapData"] = mapData
// sendData["formCont"] = formCont
sendData["master"] = master
sendData["sunTable"] = sunTable
// sendData["jsonerr"] = jsonerr
// sendData["jsondfg"] = jsondfg
// sendData["formJsonCont"] = formJsonCont
sendData["master_len"] = len(master)
sendData["sunTable_len"] = len(sunTable)
// sendData["masterWriteVal"] = masterWriteVal
// sendData["sunFormName"] = sunFormName
// sendData["sunFieldAry"] = sunFieldAry
sendData["masterField"] = masterField
publicmethod.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-28 09:37:49
@ 功能: 主表与子表数据写入
@ 参数
#uuid 唯一标识
#creater 创建人
#createrTime 创建时间
#masterTableName 主表标识
#masterDataCont 主表数据
#sunDataList 字表数据列表
@ 返回值
#
@ 方法原型
#
*/
func WriteSunDatabase(uuid, creater, createrTime int64, masterTableName string, masterDataCont, sunDataList map[string]interface{}, sunTable map[string]map[string]customerform.MasterStruct) (err error) {
if len(masterDataCont) > 0 {
if len(sunDataList) > 0 {
sunMasterMap := publicmethod.MapOut[string]()
//子表存在时,执行主表和子表数据写入
for k, v := range sunDataList {
// if k == "table1693811044212" {
s, ok := v.([]interface{}) //获取值类型
if !ok {
err = errors.New("表单数据错误!请验证后重新提交!")
return
} else {
//判断是否有数据
if len(s) > 0 {
var sunCont []map[string]interface{}
for _, sv := range s { //拆分子表
if sdf, isOk := sv.(map[string]interface{}); isOk {
if sunTableType, sunIsOk := sunTable[k]; sunIsOk {
masterWriteVal := MakeFormMapData(uuid, creater, createrTime, sdf, sunTableType, 2) //转换数据表值
if len(masterWriteVal) > 0 {
sunCont = append(sunCont, masterWriteVal)
}
}
}
}
if len(sunCont) > 0 {
sunMasterMap[k] = sunCont
}
}
}
}
if len(sunMasterMap) > 0 {
gormDb := overall.CONSTANT_DB_CustomerForm.Begin()
masterErr := gormDb.Table(masterTableName).Create(masterDataCont).Error
sunCreateIsOk := true
for k, v := range sunMasterMap {
sunErr := gormDb.Table(k).Create(v).Error
if sunErr != nil {
sunCreateIsOk = false
break
}
}
if masterErr == nil && sunCreateIsOk {
err = gormDb.Commit().Error
} else {
gormDb.Rollback()
err = errors.New("表单数据提交失败!请重新提交")
}
}
} else {
//子表不存在时,写入主表数据
err = overall.CONSTANT_DB_CustomerForm.Table(masterTableName).Create(masterDataCont).Error
}
} else {
err = errors.New("表单数据提交失败!请重新提交")
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-27 16:01:48
@ 功能: 组装数据表值
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func MakeTableVal(uuid, userKey, cureeTime int64, fieldVal map[string]interface{}, subUnit map[string]customerform.MasterStruct) map[string]interface{} {
keyAndVal := make(map[string]interface{})
keyAndVal["masters_key"] = uuid
keyAndVal["creater"] = userKey
keyAndVal["creater_time"] = cureeTime
keyAndVal["edit_time"] = cureeTime
for k, v := range fieldVal {
if v != "" {
if val, isOk := subUnit[k]; isOk {
fielfInfoClass := customerform.AnalysisTable(val)
// fmt.Printf("k--->%v\nv--->%T\nfielfInfoClass------>%v\n\n\n", k, v, fielfInfoClass)
switch fielfInfoClass.Types {
case "int", "bigint":
//值类型是数组,并且需要分开存储
switch fielfInfoClass.ControlType {
case "year", "month", "date", "datetime":
if strVal, ok := v.(string); ok {
localTime, _ := time.ParseInLocation(time.RFC3339, strVal, time.Local)
keyAndVal[k] = localTime.Unix()
} else {
keyAndVal[k] = v
}
case "array":
if fielfInfoClass.Signed {
kEnd := fmt.Sprintf("%v_end", k)
if strVal, ok := v.([]interface{}); ok {
if len(strVal) >= 2 {
if starTimeStr, tOk := strVal[0].(string); tOk {
starTime, _ := time.ParseInLocation(time.RFC3339, starTimeStr, time.Local)
keyAndVal[k] = starTime.Unix()
} else {
keyAndVal[k] = strVal[0]
}
if endTimeStr, tOk := strVal[len(strVal)-1].(string); tOk {
endTime, _ := time.ParseInLocation(time.RFC3339, endTimeStr, time.Local)
keyAndVal[kEnd] = endTime.Unix()
} else {
keyAndVal[kEnd] = strVal[len(strVal)-1]
}
}
}
} else {
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseInt(strVal, 10, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
}
case "bigint":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseInt(strVal, 10, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "int":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.Atoi(strVal)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "booble":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.Atoi(strVal)
keyAndVal[k] = floatVal
} else if strVal, ok := v.(bool); ok {
if strVal {
keyAndVal[k] = fielfInfoClass.DefaultValue
} else {
keyAndVal[k] = fielfInfoClass.DefaultValuees
}
} else {
keyAndVal[k] = v
}
default:
}
case "booble":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.Atoi(strVal)
keyAndVal[k] = floatVal
} else if strVal, ok := v.(bool); ok {
if strVal {
keyAndVal[k] = fielfInfoClass.DefaultValue
} else {
keyAndVal[k] = fielfInfoClass.DefaultValuees
}
} else {
keyAndVal[k] = v
}
case "float":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "decimal":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "mediumtext", "longtext":
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
if fielfInfoClass.ControlType == "array" {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
keyAndVal[k] = v
}
} else {
keyAndVal[k] = v
}
}
default:
if fielfInfoClass.Types != "" {
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
if fielfInfoClass.ControlType == "array" {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
keyAndVal[k] = v
}
} else {
keyAndVal[k] = v
}
}
}
}
}
}
// } else {
// keyAndVal[k] = v
// }
}
return keyAndVal
}
/*
*
@ 作者: 秦东
@ 时间: 2023-09-27 14:30:57
@ 功能: 获取组件结构体
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func GainFormStruct(formTabelJson string) (master map[string]customerform.MasterStruct, sunTable map[string]map[string]customerform.MasterStruct, err error) {
//将表格组件json数据转化成结构体
var formJsonCont customerform.CustomerFormMaster
json.Unmarshal([]byte(formTabelJson), &formJsonCont)
// fmt.Printf("将表格组件json数据转化成结构体---->%v---->%v\n", err, formTabelJson)
// if err != nil {
// return
// }
masterAry := make(map[string]customerform.MasterStruct)
sunTableAry := make(map[string]map[string]customerform.MasterStruct)
for _, v := range formJsonCont.List {
switch v.Type {
case "grid", "tabs":
if len(v.Columns) > 0 {
for _, cv := range v.Columns {
for _, cvl := range cv.List {
masterAry[cvl.Name] = cvl
}
}
}
case "card", "div":
if len(v.List) > 0 {
for _, cvl := range v.List {
masterAry[cvl.Name] = cvl
}
}
case "table", "flex":
if len(v.List) > 0 {
sunTableGd := make(map[string]customerform.MasterStruct)
for _, vl := range v.List {
sunTableGd[vl.Name] = vl
}
sunTableAry[v.Name] = sunTableGd
}
default:
// fmt.Printf("获取组件结构体-->%v-->%v\n", v.Name, v)
if v.Name != "" {
masterAry[v.Name] = v
}
}
}
master = masterAry
sunTable = sunTableAry
return
}
/*
*
@ 作者: 秦东
@ 时间: 2023-10-07 13:18:35
@ 功能: 用户端自定义表单新增记录(新版)
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) AddFormAddNewData(c *gin.Context) {
data, err := c.GetRawData() //接收表单提交得数据
if err != nil {
publicmethod.Result(100, err, c)
return
}
mapData := publicmethod.MapOut[string]() //初始化MAP
err = json.Unmarshal(data, &mapData) //将接收的json字符串参数转换成Map
if err != nil {
publicmethod.Result(100, err, c)
return
}
if _, ok := mapData["formId"]; !ok {
publicmethod.Result(1, err, c, "非法表单!不能提交数据!")
return
}
var formCont modelAppPlatform.CustomerFormView //获取指定版本的表单
err = formCont.GetCont(map[string]interface{}{"`id`": mapData["formId"]})
if err != nil {
publicmethod.Result(107, err, c)
return
}
var sunFormName []string //子表名称集合
if formCont.TableStructure != "" { //拆解获取子表名称
var sunFormStruct map[string]string
err = json.Unmarshal([]byte(formCont.TableStructure), &sunFormStruct)
if err == nil {
for _, v := range sunFormStruct {
if !publicmethod.IsInTrue[string](v, sunFormName) {
sunFormName = append(sunFormName, v)
}
}
}
}
masterField := publicmethod.MapOut[string]() //主表数据
sunFieldAry := publicmethod.MapOut[string]() //子表数据
for k, v := range mapData {
if !publicmethod.IsInTrue[string](k, sunFormName) {
if !publicmethod.IsInTrue[string](k, []string{"formId", "id"}) {
masterField[k] = v
}
} else {
sunFieldAry[k] = v
}
}
context, _ := c.Get(overall.MyContJwt)
var userCont modelshr.ManCont
userCont.GetLoginCont(context) //当前操作人
uuid := publicmethod.GetUUid(1) //统一识别符
cureeTime := time.Now().Unix() //写入时间
var formJsonCont customerform.CustomerFormMaster
json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont)
var formUnitCont customerform.FormUnitInfo
formUnitCont.GainMasterAndSunFormUnit(formCont.TableKey, formJsonCont.List, true)
masterUnitList := make(map[string]customerform.MasterStruct)
for _, v := range formUnitCont.MasterInfo {
masterUnitList[v.Name] = v
}
masrWriteMap := MakeFormMapData(uuid, userCont.Key, cureeTime, masterField, masterUnitList, 1)
//任务列表
var taskCont modelAppPlatform.Task
taskCont.MastersKey = uuid
taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"`
taskCont.Creater = userCont.Key //创建人"`
taskCont.CreaterTime = cureeTime //创建时间"`
taskCont.EditTime = cureeTime //编辑时间"`
taskCont.Types = 1 //类型(1:普通表单;2:流程表单)"`
taskCont.VersionId = formCont.Id //来源于哪个表单"`
taskCont.Status = 2
//判断是否
if len(sunFieldAry) > 0 {
//有子表
sunTypeAry := make(map[string]map[string]customerform.MasterStruct)
for _, v := range formUnitCont.SunFormInfo {
sunTypeAry[v.TableName] = v.UbitInfo
}
err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masrWriteMap, sunFieldAry, sunTypeAry)
} else {
// //无子表
err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masterUnitList).Error
}
if err != nil {
publicmethod.Result(104, err, c)
return
}
err = overall.CONSTANT_DB_AppPlatform.Create(&taskCont).Error
sendData := publicmethod.MapOut[string]()
sendData["uuid"] = uuid
sendData["cureeTime"] = cureeTime
sendData["formUnitCont"] = formUnitCont
sendData["masterField"] = masterField
sendData["sunFieldAry"] = sunFieldAry
sendData["masrWriteMap"] = masrWriteMap
sendData["sunFormName"] = sunFormName
sendData["mapData"] = mapData
publicmethod.Result(0, err, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-10-07 15:35:07
@ 功能: 组装数据表新增数据
@ 参数
#uuid 统一识别符
#userKey 当前操作人
#cureeTime 操作时间
#fieldVal 提交数据得键值对
#subUnit 组件信息
#calss 1新增2编辑
@ 返回值
#
@ 方法原型
#
*/
func MakeFormMapData(uuid, userKey, cureeTime int64, fieldVal map[string]interface{}, subUnit map[string]customerform.MasterStruct, calss int) map[string]interface{} {
keyAndVal := make(map[string]interface{})
if calss == 1 {
keyAndVal["creater_time"] = cureeTime
}
keyAndVal["masters_key"] = uuid
keyAndVal["creater"] = userKey
keyAndVal["edit_time"] = cureeTime
for k, v := range fieldVal {
// fmt.Printf("写入字段:%v->%v\n", k, v)
if v != "" {
if val, isOk := subUnit[k]; isOk {
// fmt.Printf("写入字段:%v->%v\n", k, val)
fielfInfoClass := customerform.AnalysisFormUnitClass(val)
switch fielfInfoClass.FieldType {
case "int":
if strVal, ok := v.(string); ok {
keyAndVal[k], _ = strconv.Atoi(strVal)
} else {
keyAndVal[k] = v
}
case "bigint":
if fielfInfoClass.ValIsAry { //判断值是否为数组
endField := fmt.Sprintf("%v_end", k)
if strVal, ok := v.([]interface{}); ok {
if len(strVal) >= 2 {
if starTimeStr, tOk := strVal[0].(string); tOk {
keyAndVal[k], _ = strconv.ParseInt(starTimeStr, 10, 64)
} else {
keyAndVal[k] = strVal[0]
}
if endTimeStr, tOk := strVal[len(strVal)-1].(string); tOk {
keyAndVal[endField], _ = strconv.ParseInt(endTimeStr, 10, 64)
} else {
keyAndVal[endField] = strVal[len(strVal)-1]
}
}
}
} else {
if strVal, ok := v.(string); ok {
fieldVal, _ := strconv.ParseInt(strVal, 10, 64)
keyAndVal[k] = fieldVal
} else {
keyAndVal[k] = v
}
}
case "float":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "decimal":
if strVal, ok := v.(string); ok {
floatVal, _ := strconv.ParseFloat(strVal, 64)
keyAndVal[k] = floatVal
} else {
keyAndVal[k] = v
}
case "mediumtext", "longtext":
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
if fielfInfoClass.ValIsAry {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
keyAndVal[k] = v
}
} else {
keyAndVal[k] = v
}
}
case "varchar":
if valAry, ok := v.([]interface{}); ok {
if len(valAry) > 0 {
valStrJson, _ := json.Marshal(valAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
if fielfInfoClass.ValIsAry {
if valStr, ok := v.(string); ok {
valStrAry := strings.Split(valStr, ",")
if len(valStrAry) > 0 {
valStrJson, _ := json.Marshal(valStrAry)
keyAndVal[k] = string(valStrJson)
} else {
keyAndVal[k] = ""
}
} else {
keyAndVal[k] = v
}
} else {
keyAndVal[k] = v
}
}
default:
}
}
}
}
return keyAndVal
}

2
apirouter/apishiyan/maptostruct.go

@ -27,5 +27,7 @@ func (a *ApiRouter) RouterGroup(router *gin.RouterGroup) {
apiRouter.POST("LookTableStruct", methodBinding.LookTableStruct) //查询表结构
apiRouter.POST("hzzpy", methodBinding.HanZiZhuanPinYin) //汉字转拼音
apiRouter.POST("test_table", methodBinding.TestTable) //测试表格字段类型
}
}

20
apirouter/v1/taskrouter/taskrouter.go

@ -11,14 +11,18 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) {
apiRouter := router.Group("task_management")
var taskManagementRouter = version1.AppApiEntry.TaskManagementApi
{
apiRouter.GET("", taskManagementRouter.Index) //入口
apiRouter.POST("", taskManagementRouter.Index) //入口
apiRouter.POST("app_formdata_log", taskManagementRouter.AppFormDataLog) //非流程表单提交数据记录
apiRouter.POST("gain_task_list", taskManagementRouter.GainTaskList) //获取可执行得任务列表
apiRouter.POST("gain_task_versioncont", taskManagementRouter.GianTaskVersionCont) //根据版本获取表单内容
apiRouter.POST("customer_form_adddata", taskManagementRouter.CustomerFormAddData) //自定义表单新增记录数据
apiRouter.POST("customer_form_editdata", taskManagementRouter.CustomerFormEditData) //自定义表单编辑记录数据
apiRouter.POST("look_customer_formdata", taskManagementRouter.LookCustomerFormData) //查看自定义表单记录数据列表
apiRouter.GET("", taskManagementRouter.Index) //入口
apiRouter.POST("", taskManagementRouter.Index) //入口
apiRouter.POST("app_formdata_log", taskManagementRouter.AppFormDataLog) //非流程表单提交数据记录
apiRouter.POST("gain_task_list", taskManagementRouter.GainTaskList) //获取可执行得任务列表
apiRouter.POST("gain_task_versioncont", taskManagementRouter.GianTaskVersionCont) //根据版本获取表单内容
apiRouter.POST("customer_form_adddata", taskManagementRouter.CustomerFormAddData) //自定义表单新增记录数据
apiRouter.POST("customer_form_editdata", taskManagementRouter.CustomerFormEditData) //自定义表单编辑记录数据
apiRouter.POST("look_customer_formdata", taskManagementRouter.LookCustomerFormData) //查看自定义表单记录数据列表
apiRouter.POST("del_customer_formdata", taskManagementRouter.DelCustomerFormDataLog) //删除自定义表单记录数据
apiRouter.POST("add_form_data", taskManagementRouter.AddFormAddData) //用户端自定义表单新增记录
apiRouter.POST("add_form_newdata", taskManagementRouter.AddFormAddNewData) //用户端自定义表单新增记录(新版)
}
taskFlowApi := router.Group("task_flow")

11
main.go

@ -5,9 +5,20 @@ import (
"appPlatform/initialization/databaseinit"
"appPlatform/initialization/nosql"
"appPlatform/scheduledtask"
"fmt"
"runtime"
)
func main() {
var Ncpu = runtime.NumCPU()
fmt.Printf("服务器核心数量:%v\n", Ncpu)
if Ncpu-1 <= 0 {
Ncpu = 1
} else {
Ncpu = Ncpu - 1
}
runtime.GOMAXPROCS(Ncpu)
//加载数据库
databaseinit.LoadDatabase()
//加载Redis

47
overall/publicmethod/technique.go

@ -2373,3 +2373,50 @@ func (g *GetOrgAllParent) GetOrgSun(superior int64) {
g.GetOrgSun(v)
}
}
// 类型转换
func TypeToClass(val interface{}, timeClass int) (str string) {
if typeVal, ok := val.(uint); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(uint8); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(uint16); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(uint32); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(uint64); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(int); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(int8); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(int16); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(int32); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(int64); ok {
str = UnixTimeToDay(typeVal, timeClass)
} else if typeVal, ok := val.(float32); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(float64); ok {
str = UnixTimeToDay(int64(typeVal), timeClass)
} else if typeVal, ok := val.(byte); ok {
valInt, valErr := strconv.ParseInt(string(typeVal), 10, 64)
if valErr == nil {
str = UnixTimeToDay(valInt, timeClass)
} else {
str = ""
}
} else if typeVal, ok := val.(string); ok {
valInt, valErr := strconv.ParseInt(typeVal, 10, 64)
if valErr == nil {
str = UnixTimeToDay(valInt, timeClass)
} else {
str = ""
}
} else {
str = ""
}
return
}

Loading…
Cancel
Save