From 7b2a4af5bde21315ddff09a89cfbf4d8952aa0d5 Mon Sep 17 00:00:00 2001 From: hreenshan112 Date: Sat, 4 Jan 2025 08:23:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/version1/customerApp/appControll.go | 98 ++++- api/version1/customerApp/runAppControll.go | 81 ++++ api/version1/customerApp/type.go | 11 + api/version1/customerform/dataSourcSql.go | 111 +++++ api/version1/customerform/form.go | 58 +++ api/version1/customerform/formTable.go | 389 ++++++++++++++---- api/version1/customerform/type.go | 33 +- api/version1/dataCenter/databastHanld.go | 362 ++++++++++++++++ api/version1/dataCenter/runDataBase.go | 58 +++ api/version1/dataCenter/type.go | 41 ++ .../taskplatform/taskmanagement/appControl.go | 56 ++- .../taskmanagement/formcontrol.go | 157 ++++++- .../taskplatform/taskmanagement/ruanTask.go | 258 +++++++++++- .../taskmanagement/runTaskFlow.go | 226 ++++++++++ .../taskmanagement/sendWechatMsg.go | 2 +- .../taskplatform/taskmanagement/types.go | 30 ++ api/version1/workFlow/common.go | 6 +- api/version1/workWechat/wechat.go | 151 +++++++ apirouter/v1/customerformrouter/router.go | 3 + apirouter/v1/dataCenterRouter/router.go | 2 + apirouter/v1/taskrouter/taskrouter.go | 2 + apirouter/v1/workWechatRouter/router.go | 3 + go.mod | 29 +- go.sum | 147 +++++++ overall/publicmethod/technique.go | 17 + 25 files changed, 2194 insertions(+), 137 deletions(-) create mode 100644 api/version1/customerform/dataSourcSql.go create mode 100644 api/version1/dataCenter/databastHanld.go create mode 100644 api/version1/dataCenter/runDataBase.go diff --git a/api/version1/customerApp/appControll.go b/api/version1/customerApp/appControll.go index e8671b9..6a716db 100644 --- a/api/version1/customerApp/appControll.go +++ b/api/version1/customerApp/appControll.go @@ -2,6 +2,7 @@ package customerApp import ( "appPlatform/api/version1/customerform" + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/api/version1/publicapi" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -868,10 +869,12 @@ func (a *ApiMethod) CreateAppForm(c *gin.Context) { publicmethod.Result(1, err, c, "未知表单标识!") return } + //获取人员信息 context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) cureeTime := time.Now().Unix() + var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`tablename`": formJsonCont.Form.Name}, "`id`") if err == nil || customerFormCont.Id != 0 { @@ -908,12 +911,36 @@ func (a *ApiMethod) CreateAppForm(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.DisassembleForm() - mastSql, _ := formJsonCont.CreateFormTable() + formVersion.Dict = requestData.Dict //字表结构"` + // return + fmt.Printf("进行数据源操作------------>%v\n", formJsonCont.Form) + if formJsonCont.Form.DataSource == "yes" { //进行数据源操作 + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + mastSql, _ := formJsonCont.CreateActiveFormTable(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey) + formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` + // publicmethod.Result(0, mastSql, c) + } else { //无数据源操作 + + // mastSql, _ := formJsonCont.CreateFormDatabaseTable() + // mastSql, _ := formJsonCont.DisassembleForm() + mastSql, _ := formJsonCont.CreateFormTable() + formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` - formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` - formVersion.Dict = requestData.Dict //字表结构"` + } createDb := overall.CONSTANT_DB_AppPlatform.Begin() errMain := createDb.Create(&customerFormCont).Error @@ -1046,10 +1073,35 @@ func (a *ApiMethod) SaveOtherVersion(c *gin.Context) { formVersion.EditTime = cureeTime //efault:0;not null;comment:编辑时间"` // mastSql, _ := formJsonCont.CreateFormDatabaseTable() // mastSql, _ := formJsonCont.DisassembleForm() - mastSql, _ := formJsonCont.CreateFormTable() - formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` - formVersion.Dict = requestData.Dict //字表结构"` + if formJsonCont.Form.DataSource == "yes" { //进行数据源操作 + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + mastSql, _ := formJsonCont.CreateActiveFormTable(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey) + formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` + } else { //无数据源操作 + mastSql, _ := formJsonCont.CreateFormTable() + formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` + + } + + // mastSql, _ := formJsonCont.CreateFormTable() + // formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` + + formVersion.Dict = requestData.Dict //字表结构"` errVer := overall.CONSTANT_DB_AppPlatform.Create(&formVersion).Error if errVer != nil { publicmethod.Result(104, customerFormCont, c) @@ -1160,8 +1212,34 @@ func (a *ApiMethod) EditAppPageInfo(c *gin.Context) { versionData["`creater`"] = userCont.Key // mastSql, _ := formJsonCont.DisassembleForm() // mastSql, _ := formJsonCont.CreateFormDatabaseTable() - mastSql, _ := formJsonCont.CreateFormTable() - versionData["`table_structure`"] = mastSql + + if formJsonCont.Form.DataSource == "yes" { //进行数据源操作 + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + mastSql, _ := formJsonCont.CreateActiveFormTable(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey) + versionData["`table_structure`"] = mastSql + } else { //无数据源操作 + mastSql, _ := formJsonCont.CreateFormTable() + versionData["`table_structure`"] = mastSql + + } + + // mastSql, _ := formJsonCont.CreateFormTable() + // versionData["`table_structure`"] = mastSql + versionData["`dict`"] = requestData.Dict var formVersion modelAppPlatform.CustomerFormVersion formVersion.EiteCont(map[string]interface{}{"`id`": requestData.Version}, versionData) diff --git a/api/version1/customerApp/runAppControll.go b/api/version1/customerApp/runAppControll.go index f8838e8..38a79fa 100644 --- a/api/version1/customerApp/runAppControll.go +++ b/api/version1/customerApp/runAppControll.go @@ -1,6 +1,8 @@ package customerApp import ( + "appPlatform/api/version1/customerform" + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -691,3 +693,82 @@ func (a *AppMenuList) AppMenuContent(appKey int64, menuInfo modelAppPlatform.App a.List = append(a.List, menuCont) fmt.Printf("获取所有子类:%v\n", a) } + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 14:42:36 +@ 功能: 获取有源数据表字段 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainDataStorceAllField(c *gin.Context) { + var requestData DatabaseConfig + err := c.ShouldBindJSON(&requestData) + if err != nil { + publicmethod.Result(100, err, c) + return + } + if requestData.Id == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.SqlType == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.Name == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.TableName == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.Host == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.Port == 0 { + publicmethod.Result(200, err, c) + return + } + if requestData.User == "" { + publicmethod.Result(200, err, c) + return + } + if requestData.Password == "" { + publicmethod.Result(200, err, c) + return + } + var sqlDb datacenter.DataBastType + sqlDb.Type = requestData.SqlType + sqlDb.Ip = requestData.Host + sqlDb.DataBaseName = requestData.Name + sqlDb.Port = requestData.Port + sqlDb.UserName = requestData.User + sqlDb.Pwd = requestData.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(requestData.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + fieldList, err := customerform.GainFormAllField(sqlDborm, requestData.TableName) + if err != nil { + publicmethod.Result(0, err, c) + return + } + publicmethod.Result(0, fieldList, c) +} diff --git a/api/version1/customerApp/type.go b/api/version1/customerApp/type.go index 603682e..5ae8613 100644 --- a/api/version1/customerApp/type.go +++ b/api/version1/customerApp/type.go @@ -267,3 +267,14 @@ type MenuGroupList struct { MenuAppTitle string `json:"title"` List []SendAppForm `json:"list"` } + +type DatabaseConfig struct { + publicmethod.PublicId + SqlType string `json:"sqlType"` + Name string `json:"name"` + TableName string `json:"tableName"` + Host string `json:"host"` + Port int64 `json:"prot"` + User string `json:"user"` + Password string `json:"pwd"` +} diff --git a/api/version1/customerform/dataSourcSql.go b/api/version1/customerform/dataSourcSql.go new file mode 100644 index 0000000..1f45fba --- /dev/null +++ b/api/version1/customerform/dataSourcSql.go @@ -0,0 +1,111 @@ +package customerform + +import ( + "appPlatform/overall/publicmethod" + "encoding/json" + "fmt" + "strings" + + "gorm.io/gorm" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 08:58:14 +@ 功能: 获取指定数据表所有字段 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainFormAllField(sqlDb *gorm.DB, formName string) (fieldAry []Result, err error) { + sqlStr := fmt.Sprintf("SHOW FULL COLUMNS FROM `%v`", formName) + err = sqlDb.Raw(sqlStr).Scan(&fieldAry).Error + return +} + +func GainFormAllFieldList(sqlDb *gorm.DB, formName string) (fieldList []Result, err error) { + sqlStr := fmt.Sprintf("SHOW FULL COLUMNS FROM `%v`", formName) + err = sqlDb.Raw(sqlStr).Scan(&fieldList).Error + for i, v := range fieldList { + attFiled := strings.Split(v.Type, " ") + if len(attFiled) >= 2 { + fieldList[i].Attribute = attFiled[1] + fieldList[i].Type = attFiled[0] + + } + if v.Field == "id" { + fieldList[i].Comment = "Id" + } + patternInfo := strings.Split(v.Type, "(") + if len(patternInfo) >= 1 { + fieldList[i].Pattern = patternInfo[0] + } + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 09:09:54 +@ 功能: 处理数据源数据表 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *CustomerFormMaster) CreateActiveFormTable(sqlDb *gorm.DB, formName string) (relevance string, err error) { + tableFieldList, err := GainFormAllField(sqlDb, formName) //获取当前主表的字段 + var tableFormSqlAry FormTableSql + tableFormSqlAry.TableSubUnitAnalysis(c.Form.DataSourceConfig.TableKey, c.List, true, tableFieldList) + jsonStr, _ := json.Marshal(tableFormSqlAry) + fmt.Printf("数据表-----》%v\n", string(jsonStr)) + // 存在要新增或修改的主表字段 + if len(tableFormSqlAry.MasterSql) > 0 { + CreateDataSourceFormFiled(sqlDb, c.Form.DataSourceConfig.TableKey, c.Form.FormName, true, tableFormSqlAry.MasterSql) //添加主表字段 + } + sunFormNameAry := make(map[string]string) + var sunTableNameAry []string + //当存在子表时进行子表操作 + if len(tableFormSqlAry.SunSql) > 0 { + 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 = CreateDataSourceForm(sqlDb, 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 { + CreateDataSourceFormFiled(sqlDb, 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 +} diff --git a/api/version1/customerform/form.go b/api/version1/customerform/form.go index 0a49c74..dbdf001 100644 --- a/api/version1/customerform/form.go +++ b/api/version1/customerform/form.go @@ -12,6 +12,7 @@ import ( "time" "github.com/gin-gonic/gin" + "gorm.io/gorm" ) /* @@ -1439,3 +1440,60 @@ func (a *ApiMethod) SetOftenApp(c *gin.Context) { } publicmethod.Result(0, err, c) } + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 13:02:04 +@ 功能: 根据数据源创建表单字段 +@ 参数 + + #sqlDb 数据源指针 + #formName 表单名称 + #formNotes 表单备注 + #isMasters true 主表;false:子表 + #sqlList 语句列表 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func CreateDataSourceFormFiled(sqlDb *gorm.DB, formName, formNotes string, isMasters bool, sqlList interface{}) { + if sql, isOk := sqlList.([]string); isOk { + for k, v := range sql { + syncSeting.Add(1) + go CoroutineDataSourceExecuteSql(sqlDb, k, v) + } + syncSeting.Wait() + } +} + +// 协程执行mysql语句 +func CoroutineDataSourceExecuteSql(sqlDb *gorm.DB, k int, sql string) { + defer syncSeting.Done() + sqlDb.Exec(sql) +} + +func CreateDataSourceForm(sqlDb *gorm.DB, formName, notes, engine string, isMasters bool) (err error) { + if engine == "" { + engine = "MyISAM" + } + //判断表单是否存在 + isTrue := sqlDb.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 '流程识别标识',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',`flowIsOpen` int(1) unsigned NOT NULL DEFAULT '2' 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 = sqlDb.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 '编辑时间',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',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 = sqlDb.Exec(sqlCreateTable).Error + } + } + return +} diff --git a/api/version1/customerform/formTable.go b/api/version1/customerform/formTable.go index aed1b60..6414121 100644 --- a/api/version1/customerform/formTable.go +++ b/api/version1/customerform/formTable.go @@ -1,6 +1,7 @@ package customerform import ( + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -342,9 +343,15 @@ func (c *CustomerFormMaster) CreateFormTable() (relevance string, err error) { func (f *FormTableSql) TableSubUnitAnalysis(tablename string, subUnitAry []MasterStruct, isMaster bool, fieldList []Result) { if len(subUnitAry) > 0 { var sqlAllAry []string - // fmt.Printf("tablename--->%v===>%v\n", tablename, isMaster) + fmt.Printf("tablename--->%v===>%v\n", tablename, isMaster) + + oldTable := []string{"id", "masters_key", "creater", "creater_time", "edit_time", "flow_id", "states", "flowIsOpen"} + var alreadyExists []string + for _, v := range subUnitAry { wordClass := AnalysisFormUnitClass(v) + wordClassJson, _ := json.Marshal(wordClass) + fmt.Printf("wordClass--->%T===>%v\n", wordClass, string(wordClassJson)) switch wordClass.UnitName { case "flex", "table": if len(v.List) > 0 { @@ -381,8 +388,23 @@ func (f *FormTableSql) TableSubUnitAnalysis(tablename string, subUnitAry []Maste // } } + + if publicmethod.IsInTrue[string](wordClass.WordName, oldTable) { + alreadyExists = append(alreadyExists, wordClass.WordName) + } } - // fmt.Printf("tablename--->%v===>%v===>%v\n", tablename, isMaster, sqlAllAry) + + for _, v := range fieldList { + if publicmethod.IsInTrue[string](v.Field, oldTable) { + alreadyExists = append(alreadyExists, v.Field) + } + } + + buConfSql := newFieldOld(tablename, oldTable, alreadyExists) + if len(buConfSql) > 0 { + sqlAllAry = append(sqlAllAry, buConfSql...) + } + fmt.Printf("tablename--->%v===>%v===>%v\n", tablename, isMaster, sqlAllAry) if len(sqlAllAry) > 0 { if isMaster { f.MasterSql = append(f.MasterSql, sqlAllAry...) @@ -413,6 +435,52 @@ func (f *FormTableSql) TableSubUnitAnalysis(tablename string, subUnitAry []Maste } } +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 13:38:30 +@ 功能: 生成数据源没有的字段语句 +@ 参数 + + #tablename 数据表 + #oldTable 表默认字段 + #alreadyExists 已有字段 + +@ 返回值 + + # + +@ 方法原型 + + #oldTable := []string{"id", "masters_key", "creater", "creater_time", "edit_time", "flow_id", "states", "flowIsOpen"} +*/ +func newFieldOld(tablename string, oldTable, alreadyExists []string) (sql []string) { + for _, v := range oldTable { + if !publicmethod.IsInTrue[string](v, alreadyExists) { + switch v { + case "id": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Id';", tablename, v)) + case "masters_key": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识';", tablename, v)) + case "creater": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned DEFAULT '0' COMMENT '创建人';", tablename, v)) + case "creater_time": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间';", tablename, v)) + case "edit_time": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间';", tablename, v)) + case "flow_id": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流程识别标识';", tablename, v)) + case "states": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v int(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)';", tablename, v)) + case "flowIsOpen": + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN %v int(1) unsigned NOT NULL DEFAULT '2' COMMENT '是否开启工作流';", tablename, v)) + default: + } + } + } + return +} + /* * @ 作者: 秦东 @@ -445,14 +513,14 @@ func MakeSql(tablename string, fieldCont AnalysisFormSubUnitClass, fieldList []R isNew = false if fieldCont.FieldType == "bigint" { if fieldCont.ValIsAry { - 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, "开始日期")) + 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, "开始日期")) 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, "结束日期")) + 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, "结束日期")) } else { - 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)) + 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)) } } else { - sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` MODIFY COLUMN %v %v COMMENT '%v'", tablename, fieldCont.WordName, v.Type, fieldCont.Describe)) + sql = append(sql, fmt.Sprintf("ALTER TABLE `%v` MODIFY COLUMN %v %v COMMENT '%v';", tablename, fieldCont.WordName, v.Type, fieldCont.Describe)) } } @@ -463,24 +531,24 @@ func MakeSql(tablename string, fieldCont AnalysisFormSubUnitClass, fieldList []R if isNew { 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)) + 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": if fieldCont.ValIsAry { - 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, "开始日期")) + 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, "开始日期")) 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, "结束日期")) + 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, "结束日期")) } else { - 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)) + 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 "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)) + 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)) + 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)) + 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)) + 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: } } @@ -731,9 +799,35 @@ func (a *ApiMethod) GainFormTableField(c *gin.Context) { masterTable = append(masterTable, myKeyWord) } } + var formJsonCont CustomerFormMaster + json.Unmarshal([]byte(customerFormMaster.MastesFormJson), &formJsonCont) + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + masterTableAll, err := GainFormAllFieldList(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey) + if err == nil { + masterTable = append(masterTable, masterTableAll...) + } + } else { + masterTableAll, err := GainFormTableField(customerFormMaster.TableKey) + if err == nil { + masterTable = append(masterTable, masterTableAll...) + } - masterTableAll, err := GainFormTableField(customerFormMaster.TableKey) - masterTable = append(masterTable, masterTableAll...) + } if err != nil { publicmethod.Result(1, err, c, "未知表单!无法获取字段!") @@ -1255,89 +1349,183 @@ func (a *ApiMethod) GainFormPageListCont(c *gin.Context) { publicmethod.Result(1, err, c, "未知表单!无法获取字段!") return } - // why, err := AnalysisSerachTerm(requestData.SearchData) - // fmt.Printf("why---->%v\n", why) - var formList []map[string]interface{} - // gormDb := overall.CONSTANT_DB_CustomerForm.Table(formInfo.TableKey) - tableName := fmt.Sprintf("`%v` as f", formInfo.TableKey) - gormDb := overall.CONSTANT_DB_CustomerForm.Table(tableName).Select("f.*,t.status as taskStatus,t.runFlowId") - // if err == nil { - // gormDb = gormDb.Where(why) - // } - gormDb = gormDb.Joins("LEFT JOIN `taskrecord` as t ON f.masters_key = t.masters_key") - gormDb = gormDb.Where("f.`creater` = ? ", userCont.Key) - gormDb = gormDb.Where("f.`states` BETWEEN ? AND ?", 1, 2) - - gormDb = AnalysisSerachTermSql(requestData.SearchData, gormDb) - var total int64 - totalErr := gormDb.Count(&total).Error - if totalErr != nil { - total = 0 - } - gormDb = publicmethod.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize) - err = gormDb.Order("f.`id` DESC").Find(&formList).Error - if err != nil && len(formList) < 1 { - publicmethod.Result(0, err, c) - return - } - // for i, _ := range formList { - // // formList[i]["flowIsOpen"] = formInfo.FlowIsOpen - // formList[i]["flowkey"] = strconv.FormatInt(formInfo.Flowkey, 10) - // } - if formInfo.ListJson != "" { - var listFieldsMap ListPageFields - err = json.Unmarshal([]byte(formInfo.ListJson), &listFieldsMap) - // fmt.Printf("%T----------->%v----------->%v\n", listFieldsMap, err, listFieldsMap) - if err == nil { - // fmt.Printf("%T----------->%v\n", listFieldsMap, listFieldsMap) - formList = listFieldsMap.DevelopSpecificationsSend(formList) - // formList = DevelopSpecificationsSend(formList, listFieldsMap) + var formJsonCont CustomerFormMaster + json.Unmarshal([]byte(formInfo.MastesFormJson), &formJsonCont) + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + gormDb := sqlDborm.Table(formJsonCont.Form.DataSourceConfig.TableKey) + gormDb = gormDb.Where("`states` BETWEEN ? AND ?", 1, 2) + + gormDb = AnalysisSerachTermSql(requestData.SearchData, gormDb) + var total int64 + totalErr := gormDb.Count(&total).Error + if totalErr != nil { + total = 0 } + var formList []map[string]interface{} + gormDb = publicmethod.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize) + err = gormDb.Order("`id` DESC").Find(&formList).Error + if err != nil && len(formList) < 1 { + publicmethod.Result(0, err, c) + return + } + // sqlDborm.Table(formJsonCont.Form.DataSourceConfig.TableKey).Find(&formList) + // fmt.Printf("%T----------->%v----------->%v\n", formList, err, formList) + if formInfo.ListJson != "" { + var listFieldsMap ListPageFields + err = json.Unmarshal([]byte(formInfo.ListJson), &listFieldsMap) + // fmt.Printf("%T----------->%v----------->%v\n", listFieldsMap, err, listFieldsMap) + if err == nil { + // fmt.Printf("%T----------->%v\n", listFieldsMap, listFieldsMap) + formList = listFieldsMap.DevelopSpecificationsSend(formList) + // formList = DevelopSpecificationsSend(formList, listFieldsMap) + } - } + } - //获取任务状态 - for i, v := range formList { - formList[i]["isRetract"] = false - if mastrKey, ok := v["runFlowId"]; ok { - // fmt.Printf("masters_key----------->%v\n", v["masters_key"]) - mastrKeyInt, _ := publicmethod.StringToInt64(mastrKey) - if mastrKeyInt != 0 { - var runFlowInfo customerForm.RunWorkflow - runFlowInfo.GetCont(map[string]interface{}{"`id`": mastrKey}, "`id`", "`current_step`", "`next_step`") - formList[i]["runFlowInfo"] = runFlowInfo.Id - // fmt.Printf("runFlowInfo----------->%v--------->%v\n", runFlowInfo, v["taskStatus"]) - if stateVal, ok := v["taskStatus"]; ok { - // fmt.Printf("NextStep----------->%T----------->%v--------->%v--------->%v\n", stateVal, stateVal, runFlowInfo.NextStep, runFlowInfo.CurrentStep) - if stauval, ok := stateVal.(string); ok { - if stauval == "3" && runFlowInfo.NextStep != 0 { - - if runFlowInfo.CurrentStep == 1 { - if createrName, ok := formList[i]["creater"].(string); ok { - if createrName == userCont.Name { - formList[i]["isRetract"] = true + //获取任务状态 + for i, v := range formList { + formList[i]["isRetract"] = false + if mastrKey, ok := v["runFlowId"]; ok { + // fmt.Printf("masters_key----------->%v\n", v["masters_key"]) + mastrKeyInt, _ := publicmethod.StringToInt64(mastrKey) + if mastrKeyInt != 0 { + var runFlowInfo customerForm.RunWorkflow + runFlowInfo.GetCont(map[string]interface{}{"`id`": mastrKey}, "`id`", "`current_step`", "`next_step`") + formList[i]["runFlowInfo"] = runFlowInfo.Id + // fmt.Printf("runFlowInfo----------->%v--------->%v\n", runFlowInfo, v["taskStatus"]) + if stateVal, ok := v["taskStatus"]; ok { + // fmt.Printf("NextStep----------->%T----------->%v--------->%v--------->%v\n", stateVal, stateVal, runFlowInfo.NextStep, runFlowInfo.CurrentStep) + if stauval, ok := stateVal.(string); ok { + if stauval == "3" && runFlowInfo.NextStep != 0 { + + if runFlowInfo.CurrentStep == 1 { + if createrName, ok := formList[i]["creater"].(string); ok { + if createrName == userCont.Name { + formList[i]["isRetract"] = true + } } - } + } } } + } + } + } + if mastrKeyVal, ok := v["masters_key"]; ok { + // fmt.Printf("mastrKeyVal----------->%T----------->%v\n", mastrKeyVal, mastrKeyVal) + if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { + formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) } } + } + + // publicmethod.Result(100, formList, c) + publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(formList)), formList, c) + + } else { + // why, err := AnalysisSerachTerm(requestData.SearchData) + // fmt.Printf("why---->%v\n", why) + var formList []map[string]interface{} + // gormDb := overall.CONSTANT_DB_CustomerForm.Table(formInfo.TableKey) + tableName := fmt.Sprintf("`%v` as f", formInfo.TableKey) + gormDb := overall.CONSTANT_DB_CustomerForm.Table(tableName).Select("f.*,t.status as taskStatus,t.runFlowId") + // if err == nil { + // gormDb = gormDb.Where(why) + // } + gormDb = gormDb.Joins("LEFT JOIN `taskrecord` as t ON f.masters_key = t.masters_key") + gormDb = gormDb.Where("f.`creater` = ? ", userCont.Key) + gormDb = gormDb.Where("f.`states` BETWEEN ? AND ?", 1, 2) + + gormDb = AnalysisSerachTermSql(requestData.SearchData, gormDb) + var total int64 + totalErr := gormDb.Count(&total).Error + if totalErr != nil { + total = 0 } - if mastrKeyVal, ok := v["masters_key"]; ok { - // fmt.Printf("mastrKeyVal----------->%T----------->%v\n", mastrKeyVal, mastrKeyVal) - if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { - formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) + + gormDb = publicmethod.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize) + err = gormDb.Order("f.`id` DESC").Find(&formList).Error + if err != nil && len(formList) < 1 { + publicmethod.Result(0, err, c) + return + } + // for i, _ := range formList { + // // formList[i]["flowIsOpen"] = formInfo.FlowIsOpen + // formList[i]["flowkey"] = strconv.FormatInt(formInfo.Flowkey, 10) + // } + if formInfo.ListJson != "" { + var listFieldsMap ListPageFields + err = json.Unmarshal([]byte(formInfo.ListJson), &listFieldsMap) + // fmt.Printf("%T----------->%v----------->%v\n", listFieldsMap, err, listFieldsMap) + if err == nil { + // fmt.Printf("%T----------->%v\n", listFieldsMap, listFieldsMap) + formList = listFieldsMap.DevelopSpecificationsSend(formList) + // formList = DevelopSpecificationsSend(formList, listFieldsMap) } + } - } - // publicmethod.Result(100, formList, c) - publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(formList)), formList, c) + //获取任务状态 + for i, v := range formList { + formList[i]["isRetract"] = false + if mastrKey, ok := v["runFlowId"]; ok { + // fmt.Printf("masters_key----------->%v\n", v["masters_key"]) + mastrKeyInt, _ := publicmethod.StringToInt64(mastrKey) + if mastrKeyInt != 0 { + var runFlowInfo customerForm.RunWorkflow + runFlowInfo.GetCont(map[string]interface{}{"`id`": mastrKey}, "`id`", "`current_step`", "`next_step`") + formList[i]["runFlowInfo"] = runFlowInfo.Id + // fmt.Printf("runFlowInfo----------->%v--------->%v\n", runFlowInfo, v["taskStatus"]) + if stateVal, ok := v["taskStatus"]; ok { + // fmt.Printf("NextStep----------->%T----------->%v--------->%v--------->%v\n", stateVal, stateVal, runFlowInfo.NextStep, runFlowInfo.CurrentStep) + if stauval, ok := stateVal.(string); ok { + if stauval == "3" && runFlowInfo.NextStep != 0 { + + if runFlowInfo.CurrentStep == 1 { + if createrName, ok := formList[i]["creater"].(string); ok { + if createrName == userCont.Name { + formList[i]["isRetract"] = true + } + } + + } + } + } + + } + } + + } + if mastrKeyVal, ok := v["masters_key"]; ok { + // fmt.Printf("mastrKeyVal----------->%T----------->%v\n", mastrKeyVal, mastrKeyVal) + if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { + formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) + } + } + } + + // publicmethod.Result(100, formList, c) + publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(formList)), formList, c) + } } /* @@ -1354,9 +1542,13 @@ func (l *ListPageFields) DevelopSpecificationsSend(listData []map[string]interfa switch mi { case "creater": - var myInfo modelshr.PersonArchives - myInfo.GetCont(map[string]interface{}{"`key`": mv}, "`name`") - sendInfo[mi] = myInfo.Name + mvInt, _ := publicmethod.StringToInt64(mv) + if mvInt != 0 { + var myInfo modelshr.PersonArchives + myInfo.GetCont(map[string]interface{}{"`key`": mvInt}, "`name`") + sendInfo[mi] = myInfo.Name + } + case "creater_time": timeInt, _ := publicmethod.StringToInt64(mv) sendInfo[mi] = publicmethod.UnixTimeToDay(timeInt, 27) @@ -1778,8 +1970,33 @@ func (a *ApiMethod) GainListTableField(c *gin.Context) { publicmethod.Result(1, err, c, "未知表单!无法获取字段!") return } + var masterTable []Result + var formJsonCont CustomerFormMaster + json.Unmarshal([]byte(customerFormMaster.MastesFormJson), &formJsonCont) + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + masterTable, err = GainFormAllFieldList(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey) + + } else { + masterTable, err = GainFormTableField(customerFormMaster.TableKey) + + } - masterTable, err := GainFormTableField(customerFormMaster.TableKey) + // masterTable, err := GainFormTableField(customerFormMaster.TableKey) if err != nil { publicmethod.Result(1, err, c, "未知表单!无法获取字段!") return diff --git a/api/version1/customerform/type.go b/api/version1/customerform/type.go index 7489c25..0c05cfa 100644 --- a/api/version1/customerform/type.go +++ b/api/version1/customerform/type.go @@ -193,12 +193,33 @@ type UnitConfigStruct struct { // 表单信息 type FormStruct struct { - Size string `json:"size"` - FormName string `json:"formName"` //表单名称 - Name string `json:"name"` //表单标识 - LabelWidth string `json:"labelWidth"` //表单宽度 - Class string `json:"class"` //表单样式 - ShowColon bool `json:"showColon"` + Size string `json:"size"` + FormName string `json:"formName"` //表单名称 + Name string `json:"name"` //表单标识 + LabelWidth string `json:"labelWidth"` //表单宽度 + Class string `json:"class"` //表单样式 + ShowColon bool `json:"showColon"` + DataSource string `json:"dataSource"` //yes:是引用数据集,No:不引用数据集 + DataSourceConfig DataSourceConfigInfo `json:"dataSourceConfig"` +} + +// 数据源设置 +type DataSourceConfigInfo struct { + publicmethod.PublicId //数据源ID + DataBaseName string `json:"dataBaseName"` //数据源名称 + TableName string `json:"tableName"` //数据源 数据库名称 + TableKey string `json:"tableKey"` //数据源 数据库关键字 + DSN DsnConfig `json:"dsn"` //DSN参数 +} + +// DSN设置 +type DsnConfig struct { + SqlType string `json:"sqlType"` //数据库类型 + Ip string `json:"ip"` + DataBaseName string `json:"dataBaseName"` + Port int64 `json:"port"` + UserName string `json:"userName"` + Password string `json:"password"` } // 属性配置 diff --git a/api/version1/dataCenter/databastHanld.go b/api/version1/dataCenter/databastHanld.go new file mode 100644 index 0000000..e3fb801 --- /dev/null +++ b/api/version1/dataCenter/databastHanld.go @@ -0,0 +1,362 @@ +package datacenter + +import ( + "appPlatform/overall/publicmethod" + "encoding/json" + "errors" + "fmt" + "strings" + + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/driver/sqlite" + "gorm.io/driver/sqlserver" + "gorm.io/gorm" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 11:28:46 +@ 功能: 建立SqlServer +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *DatabaseConfig) ConnectToSqlServer() (*gorm.DB, error) { + // connStr := "provider=SQLOLEDB;data source=你的服务器名;initial catalog=你的数据库名;user id=你的用户名;password=你的密码;" + // db, err := sql.Open("adodb", connStr) + // connStr := fmt.Sprintf("server=%v;user id=<%v>;password=<%v>;port=<%v>;database=<%v>;", c.Host, + // c.User, c.Password, c.Port, c.Name) + // db, err := sql.Open("mssql", connStr) + dsn := fmt.Sprintf("sqlserver://gorm:LoremIpsum86@%v:%v?database=%v", c.Host, c.Port, c.Name) + db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{}) + if err != nil { + return nil, err + } + return db, nil +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 09:59:12 +@ 功能: 建立PostgreSQL +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *DatabaseConfig) ConnectToPostgreSQL() (*gorm.DB, error) { + connStr := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%d sslmode=disable", + c.User, c.Password, c.Name, c.Host, c.Port) + // db, err := sql.Open("postgres", connStr) + db, err := gorm.Open(postgres.Open(connStr), &gorm.Config{}) + if err != nil { + return nil, err + } + return db, nil +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 09:59:12 +@ 功能: 建立MySQL +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *DatabaseConfig) ConnectToMySQL() (*gorm.DB, error) { + connStr := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4", c.User, c.Password, c.Host, c.Port, c.Name) + // db, err := sql.Open("mysql", connStr) + fmt.Printf("sqlOpen: %v\n", connStr) + + sqlConfig := mysql.Config{ + DSN: connStr, // DSN + DefaultStringSize: 255, // string 类型字段的默认长度 + DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 + DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 + DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 + SkipInitializeWithVersion: false, // 根据版本自动配置 + } + + db, err := gorm.Open(mysql.New(sqlConfig)) + if err != nil { + return nil, err + } + + return db, nil +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 09:59:12 +@ 功能: 建立SQLite +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *DatabaseConfig) ConnectToSQLite() (*gorm.DB, error) { + // db, err := sql.Open("sqlite3", c.Name) + db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) + if err != nil { + return nil, err + } + return db, nil +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 16:25:17 +@ 功能: Tidb +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (c *DatabaseConfig) ConnectToTiDb() (*gorm.DB, error) { + sql := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", c.User, c.Password, c.Host, c.Port, c.Name) + db, err := gorm.Open(mysql.Open(sql), &gorm.Config{}) + if err != nil { + return nil, err + } + return db, nil +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 10:04:00 +@ 功能: 启动数据库 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (d *DataBastType) StartDataBast() (openDb *gorm.DB, err error) { + var configInfo DatabaseConfig + + configInfo.Name = d.DataBaseName + configInfo.Host = d.Ip + configInfo.Port = d.Port + configInfo.User = d.UserName + configInfo.Password = d.Pwd + switch strings.ToLower(d.Type) { + case "PostgreSQL", "postgresql", "postgre sql": + openDb, err = configInfo.ConnectToPostgreSQL() + case "MySQL", "mysql": + openDb, err = configInfo.ConnectToMySQL() + case "SQLite", "sqlite": + openDb, err = configInfo.ConnectToSQLite() + case "SqlServer", "sql server", "sqlserver": + openDb, err = configInfo.ConnectToSqlServer() + case "Tidb", "tidb", "TiDb", "TIDB": + openDb, err = configInfo.ConnectToMySQL() + default: + msg := fmt.Sprintf("对不起!当前不支持'%v'数据库。", d.DataBaseName) + err = errors.New(msg) + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 13:07:56 +@ 功能: 获取数据库中说有表 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + #获取数据库表comment +*/ +func (d *DataBastType) ObtainDataBaseAllTableMysql() (tableKeyValue []DataBaseTableInfo, err error) { + // tableKeyValue := publicmethod.MapOut[string]() + sqlDb, err := d.StartDataBast() + if err != nil { + return + } + var valData []string + // // sql := fmt.Sprintf("SHOW %v", d.DataBaseName) + sqlDb.Raw("SHOW TABLES").Scan(&valData) + // if err != nil { + // return tableKeyValue, err + // } + // fmt.Println(rows) + fmt.Printf("%T----->%v\n", valData, valData) + // var + for _, v := range valData { + fmt.Printf("%T----->%v\n", v, v) + // sqlStr := fmt.Sprintf("SHOW `%v`", v) + + // sql := "SELECT TABLE_NAME AS `Table`, TABLE_COMMENT AS `Table Comment` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ?" + + // var list []Result + // err = sqlDb.Raw(sqlStr).Scan(&list).Error + // tableKeyValue[v] = list + var tableName string + sql := fmt.Sprintf("SELECT TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = \"%v\" AND TABLE_NAME = \"%v\";", d.DataBaseName, v) + err = sqlDb.Raw(sql).Scan(&tableName).Error + // tableKeyValue[v] = tableInfo + var tableInfo DataBaseTableInfo + tableInfo.TableName = tableName + tableInfo.TableKey = v + sqlStr := fmt.Sprintf("SHOW FULL COLUMNS FROM `%v`", v) + err = sqlDb.Raw(sqlStr).Scan(&tableInfo.Fields).Error + tableKeyValue = append(tableKeyValue, tableInfo) + } + // defer rows.Close() + // var tableName []string + // for rows.Next() { + // var table string + // err = rows.Scan(&table) + // if err == nil { + // tableName = append(tableName, table) + // } + // } + // if len(tableName) > 0 { + + // rows, err = sqlDb.Query("SHOW TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA IS NOT NULL") + // for _,v := range tableName{ + // sql := fmt.Sprintf("SHOW TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %v AND TABLE_NAME = %v",d.DataBaseName,v) + // rows, err = sqlDb.Query("SHOW TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA IS NOT NULL") + // } + // if err != nil { + // return tableKeyValue, err + // } + // defer rows.Close() + + // var tableComments = make(map[string]string) + // for rows.Next() { + // var table, comment string + // if err := rows.Scan(&table, &comment); err != nil { + // // log.Fatal(err) + // fmt.Printf("rows----err---->:%v\n", err) + // } + // tableComments[table] = comment + // } + // fmt.Printf("rows-------->:%v\n", tableComments) + // } + + return tableKeyValue, err +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-30 16:49:14 +@ 功能: 获取数据源 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainDataStorce(dataId string) (openDb *gorm.DB, err error) { + sendUrl := fmt.Sprintf("http://120.224.6.6:29911/prod-api/database/app/datasource/page?pageNum=1&pageSize=%v&databaseName=&dataType=", 100000) + // fmt.Printf("1获取数据源===>%v\n", sendUrl) + getData := publicmethod.CurlGet(sendUrl) + // fmt.Printf("2获取数据源===>%v\n", getData) + var sendMap map[string]interface{} + json.Unmarshal(getData, &sendMap) + var sqlDb DataBastType + // fmt.Printf("3获取数据源===>%v\n", sendMap) + if code, ok := sendMap["code"]; ok { + // fmt.Printf("4获取数据源===>%v\n", code) + + codeInt, _ := publicmethod.StringToInt64(code) + if codeInt == 200 { + // jsonval, _ := json.Marshal(sendMap) + // fmt.Printf("\n\n\n6获取数据源===>%v\n\n\n", string(jsonval)) + if dataval, isOk := sendMap["data"]; isOk { + if dataMap, ok := dataval.(map[string]interface{}); ok { + if records, isOk := dataMap["records"]; isOk { + if recordAry, isOk := records.([]interface{}); isOk { + for _, v := range recordAry { + if vMAp, ok := v.(map[string]interface{}); ok { + // fmt.Printf("5获取数据源===>%T\n===>%v\n\n\n", vMAp, vMAp["id"]) + idStr := publicmethod.TypeToInterface(vMAp["id"]) + if idStr == dataId { + typeVal, _ := publicmethod.StringToInt64(vMAp["datasourceType"]) + sqlDb.Type = publicmethod.DatabaseIntToString(typeVal) + sqlDb.Ip = publicmethod.TypeToInterface(vMAp["ipAddress"]) + sqlDb.DataBaseName = publicmethod.TypeToInterface(vMAp["databaseName"]) + sqlDb.Port, _ = publicmethod.StringToInt64(vMAp["port"]) + sqlDb.UserName = publicmethod.TypeToInterface(vMAp["account"]) + sqlDb.Pwd = publicmethod.TypeToInterface(vMAp["password"]) + } + + } + // fmt.Printf("5获取数据源===>%T\n===>%v\n\n\n", v, v) + } + } + } + } + + } + } + } + // fmt.Printf("7获取数据源===>%T\n===>%v\n\n\n", sqlDb, sqlDb) + openDb, err = sqlDb.StartDataBast() + return +} diff --git a/api/version1/dataCenter/runDataBase.go b/api/version1/dataCenter/runDataBase.go new file mode 100644 index 0000000..6d09185 --- /dev/null +++ b/api/version1/dataCenter/runDataBase.go @@ -0,0 +1,58 @@ +package datacenter + +import ( + "appPlatform/overall/publicmethod" + "fmt" + + "github.com/gin-gonic/gin" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-24 11:43:02 +@ 功能: 获取数据表 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainDataTable(c *gin.Context) { + var requestData DataBastType + err := c.ShouldBindJSON(&requestData) + if err != nil { + publicmethod.Result(100, err, c) + return + } + if requestData.Type == "" { + publicmethod.Result(1, err, c, "未知数据库类型!请先确实是什么数据库类型!") + return + } + if requestData.DataBaseName == "" { + publicmethod.Result(1, err, c, "请输入数据库名称!") + return + } + if requestData.Ip == "" { + publicmethod.Result(1, err, c, "请输入数据库地址!") + return + } + + if requestData.UserName == "" { + publicmethod.Result(1, err, c, "请输入用户名!") + return + } + if requestData.Pwd == "" { + publicmethod.Result(1, err, c, "请输入密码!") + return + } + tableInfo, err := requestData.ObtainDataBaseAllTableMysql() + fmt.Printf("tableInfo:%v\n", tableInfo) + publicmethod.Result(0, tableInfo, c) +} diff --git a/api/version1/dataCenter/type.go b/api/version1/dataCenter/type.go index 65fd4d3..f2b535d 100644 --- a/api/version1/dataCenter/type.go +++ b/api/version1/dataCenter/type.go @@ -47,3 +47,44 @@ type DataInfoPost struct { Url string `json:"url"` DataInfo interface{} `json:"dataInfo"` } + +// 数据库链接参数 +type DataBastType struct { + Type string `json:"type"` //数据库类型 + DataBaseName string `json:"dataBaseName"` //数据库名称 + Ip string `json:"ip"` //数据库地址 + Port int64 `json:"port"` //数据库端口 + UserName string `json:"userName"` //数据库帐号 + Pwd string `json:"password"` //数据库密码 +} +type DatabaseConfig struct { + Name string + Host string + Port int64 + User string + Password string +} + +// 数据库表结构 +type Result struct { + Field string `json:"fieldes"` + Type string `json:"types"` + Attribute string `json:"attribute"` + Collation string `json:"collation"` + Null string `json:"nullVal"` + Key string `json:"key"` + Default string `json:"defaultVal"` + Extra string `json:"extra"` + Privileges string `json:"privileges"` + Comment string `json:"comment"` + Pattern string `json:"pattern"` + Classify string `json:"classify"` + Auxiliary string `json:"auxiliary"` +} + +// 输出数据表数据 +type DataBaseTableInfo struct { + TableName string `json:"tableName"` //数据表名称 + TableKey string `json:"tableKey"` //数据表标识 + Fields []Result `json:"fields"` //表字段 +} diff --git a/api/version1/taskplatform/taskmanagement/appControl.go b/api/version1/taskplatform/taskmanagement/appControl.go index e2a7be2..6ddd005 100644 --- a/api/version1/taskplatform/taskmanagement/appControl.go +++ b/api/version1/taskplatform/taskmanagement/appControl.go @@ -2,6 +2,7 @@ package taskmanagement import ( "appPlatform/api/version1/customerform" + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -123,21 +124,56 @@ func (a *ApiMethod) CreateAppTask(c *gin.Context) { taskCont.FlowRunSing = flowInfo.Id masrWriteMap["flow_id"] = flowInfo.Id } - //判断是否 - if len(sunFieldAry) > 0 { - //有子表 - sunTypeAry := make(map[string]map[string]customerform.MasterStruct) - for _, v := range formUnitCont.SunFormInfo { - sunTypeAry[v.TableName] = v.UbitInfo + + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } } + //判断是否 + 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) + err = WriteSunDatabaseSoucer(sqlDborm, uuid, userCont.Key, cureeTime, formJsonCont.Form.DataSourceConfig.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) + } else { + // //无子表 + err = sqlDborm.Table(formJsonCont.Form.DataSourceConfig.TableKey).Create(masrWriteMap).Error + publicmethod.WriteLog("write", "写入自定义表单", formJsonCont.Form.DataSourceConfig.TableKey, err) + } } else { - // //无子表 - err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masrWriteMap).Error - publicmethod.WriteLog("write", "写入自定义表单", formCont.TableKey, err) + //判断是否 + 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(masrWriteMap).Error + publicmethod.WriteLog("write", "写入自定义表单", formCont.TableKey, err) + } } + if err != nil { publicmethod.Result(104, err, c) return diff --git a/api/version1/taskplatform/taskmanagement/formcontrol.go b/api/version1/taskplatform/taskmanagement/formcontrol.go index da3b573..1b15ab9 100644 --- a/api/version1/taskplatform/taskmanagement/formcontrol.go +++ b/api/version1/taskplatform/taskmanagement/formcontrol.go @@ -2,6 +2,7 @@ package taskmanagement import ( "appPlatform/api/version1/customerform" + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -15,6 +16,7 @@ import ( "time" "github.com/gin-gonic/gin" + "gorm.io/gorm" ) /* @@ -842,6 +844,9 @@ func (a *ApiMethod) AddCustomerForm(c *gin.Context) { } } + var formJsonCont customerform.CustomerFormMaster + json.Unmarshal([]byte(formCont.MastesFormJson), &formJsonCont) + masterField := publicmethod.MapOut[string]() //主表数据 sunFieldAry := publicmethod.MapOut[string]() //子表数据 for k, v := range mapData { @@ -859,9 +864,6 @@ func (a *ApiMethod) AddCustomerForm(c *gin.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) @@ -891,20 +893,56 @@ func (a *ApiMethod) AddCustomerForm(c *gin.Context) { taskCont.FlowRunSing = flowInfo.Id } - //判断是否 - if len(sunFieldAry) > 0 { - //有子表 - sunTypeAry := make(map[string]map[string]customerform.MasterStruct) - for _, v := range formUnitCont.SunFormInfo { - sunTypeAry[v.TableName] = v.UbitInfo + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } } - err = WriteSunDatabase(uuid, userCont.Key, cureeTime, formCont.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) + //判断是否 + if len(sunFieldAry) > 0 { + //有子表 + sunTypeAry := make(map[string]map[string]customerform.MasterStruct) + for _, v := range formUnitCont.SunFormInfo { + sunTypeAry[v.TableName] = v.UbitInfo + } + + err = WriteSunDatabaseSoucer(sqlDborm, uuid, userCont.Key, cureeTime, formJsonCont.Form.DataSourceConfig.TableKey, masrWriteMap, sunFieldAry, sunTypeAry) + + } else { + // //无子表 + err = sqlDborm.Table(formJsonCont.Form.DataSourceConfig.TableKey).Create(masrWriteMap).Error + publicmethod.WriteLog("write", "写入自定义表单", formJsonCont.Form.DataSourceConfig.TableKey, err) + } } else { - // //无子表 - err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(masrWriteMap).Error - publicmethod.WriteLog("write", "写入自定义表单", formCont.TableKey, err) + + //判断是否 + 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(masrWriteMap).Error + publicmethod.WriteLog("write", "写入自定义表单", formCont.TableKey, err) + } } if err != nil { publicmethod.Result(104, err, c) @@ -930,4 +968,97 @@ func (a *ApiMethod) AddCustomerForm(c *gin.Context) { sendData["mapData"] = mapData publicmethod.Result(0, sendData, c) + +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 16:22:20 +@ 功能: 处理有源数据库数据 +@ 参数 + + #sqlDb 数据库句柄 + #uuid 唯一标识 + #creater 创建人 + #createrTime 创建时间 + #masterTableName 主表标识 + #masterDataCont 主表数据 + #sunDataList 字表数据列表 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func WriteSunDatabaseSoucer(sqlDb *gorm.DB, 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 + masterErr := sqlDb.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 { + + publicmethod.WriteLog("write", "写入自定义表单", err, masterDataCont, sunDataList) + } else { + + err = errors.New("表单数据提交失败!请重新提交") + publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) + } + } else { + + masterErr := sqlDb.Table(masterTableName).Create(masterDataCont).Error + if masterErr != nil { + publicmethod.WriteLog("write", "写入自定义表单", masterTableName, masterErr) + } + } + } else { + //子表不存在时,写入主表数据 + err = sqlDb.Table(masterTableName).Create(masterDataCont).Error + publicmethod.WriteLog("write", "写入自定义表单", masterTableName, err) + } + } else { + err = errors.New("表单数据提交失败!请重新提交") + publicmethod.WriteLog("e", "写入自定义表单", masterTableName, err) + } + return } diff --git a/api/version1/taskplatform/taskmanagement/ruanTask.go b/api/version1/taskplatform/taskmanagement/ruanTask.go index dd073c8..4cd1f1f 100644 --- a/api/version1/taskplatform/taskmanagement/ruanTask.go +++ b/api/version1/taskplatform/taskmanagement/ruanTask.go @@ -2,6 +2,7 @@ package taskmanagement import ( "appPlatform/api/version1/customerform" + datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -18,6 +19,7 @@ import ( "time" "github.com/gin-gonic/gin" + "gorm.io/gorm" ) /* @@ -74,10 +76,142 @@ func (a *ApiMethod) GainTaskFormInfo(c *gin.Context) { sendData := publicmethod.MapOut[string]() sendData["structure"] = formVersionInfo - sendData["tableData"] = GainOnlyOneCustomerFormLog(requestData.Id, formVersionInfo.TableKey, formVersionInfo.TableStructure, tableUnitList) + + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + + sendData["tableData"] = GainOnlyOneCustomerFormLogYuan(sqlDborm, requestData.Id, formJsonCont.Form.DataSourceConfig.TableKey, formVersionInfo.TableStructure, tableUnitList) + + } else { + + sendData["tableData"] = GainOnlyOneCustomerFormLog(requestData.Id, formVersionInfo.TableKey, formVersionInfo.TableStructure, tableUnitList) + } + publicmethod.Result(0, sendData, c) } +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 16:31:43 +@ 功能: +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainOnlyOneCustomerFormLogYuan(sqlDb *gorm.DB, id, masterTableName, sunTableJson string, tableUnitList customerform.TableFormUnit) map[string]interface{} { + sendData := publicmethod.MapOut[string]() + if masterTableName == "" || id == "" || id == "0" { + return sendData + } + + err := sqlDb.Table(masterTableName).Where("`masters_key` = ?", id).Find(&sendData).Error + if err != nil { + return sendData + } + + for i, v := range sendData { + switch i { + case "id": + sendData[i] = publicmethod.TypeToInterface(v) + case "masters_key": + sendData[i] = publicmethod.TypeToInterface(v) + case "creater": + sendData[i] = publicmethod.TypeToInterface(v) + case "creater_time": + sendData[i] = publicmethod.TypeToInterface(v) + case "edit_time": + sendData[i] = publicmethod.TypeToInterface(v) + case "flow_id": + sendData[i] = publicmethod.TypeToInterface(v) + default: + // sendData[i] = v + sendData[i] = ChuLiMasterTableData(i, v, tableUnitList.MasterInfo, sendData) + } + } + + if sunTableJson != "" { + sunSqlMap := make(map[string]string) + err = json.Unmarshal([]byte(sunTableJson), &sunSqlMap) + if err == nil { + if len(sunSqlMap) > 0 { + for _, v := range sunSqlMap { + var sunTableData []map[string]interface{} + overall.CONSTANT_DB_CustomerForm.Table(v).Where("`masters_key` = ?", id).Find(&sunTableData) + var sunTableFormInfor []map[string]interface{} + for _, tv := range sunTableData { + sunFormContent := publicmethod.MapOut[string]() + for si, sv := range tv { + switch si { + case "id": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + case "masters_key": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + case "creater": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + case "creater_time": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + case "edit_time": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + case "flow_id": + sunFormContent[si] = publicmethod.TypeToInterface(sv) + default: + if len(tableUnitList.SunFormInfo) > 0 { + isWrite := true + for _, tv := range tableUnitList.SunFormInfo { + if sonUnitCont, ok := tv[v]; ok { + isWrite = false + sunFormContent[si] = ChuLiMasterTableData(si, sv, sonUnitCont, tv) + } + } + if isWrite { + sunFormContent[si] = sv + } + } else { + sunFormContent[si] = sv + } + + } + + } + sunTableFormInfor = append(sunTableFormInfor, sunFormContent) + } + // fmt.Printf("sunTableFormInfor----->%v----->%T----->%v\n", v, sunTableFormInfor, sunTableFormInfor) + if len(sunTableFormInfor) > 0 { + sendData[v] = sunTableFormInfor + } else { + sendData[v] = []string{} + } + + } + } + } + } + return sendData +} + /* * @ 作者: 秦东 @@ -551,8 +685,28 @@ func (a *ApiMethod) EditCustomerTable(c *gin.Context) { var userCont modelshr.ManCont userCont.GetLoginCont(context) //当前操作人 cureeTime := time.Now().Unix() + var masterOldData map[string]interface{} + if formJsonCont.Form.DataSource == "yes" { + var sqlDb datacenter.DataBastType + sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType + sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password + sqlDborm, err := sqlDb.StartDataBast() + if err != nil { + sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id) + if err != nil { + publicmethod.Result(0, sqlDb, c) + return + } + } + masterOldData, err = MasterTableHandleYuanNew(sqlDborm, formJsonCont.Form.DataSourceConfig.TableKey, userCont.Key, cureeTime, masterField, tableUnitList.MasterInfo) + } else { + masterOldData, err = MasterTableHandleNew(tableVersion.TableKey, userCont.Key, cureeTime, masterField, tableUnitList.MasterInfo) + } - masterOldData, err := MasterTableHandleNew(tableVersion.TableKey, userCont.Key, cureeTime, masterField, tableUnitList.MasterInfo) if err != nil { publicmethod.Result(106, err, c) return @@ -600,6 +754,106 @@ func (a *ApiMethod) EditCustomerTable(c *gin.Context) { publicmethod.Result(0, sendInfo, c) } +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-03 16:52:28 +@ 功能: 主表处理数据(新版)有源 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func MasterTableHandleYuanNew(sqlDb *gorm.DB, tableName string, creater, cureeTime int64, newsData map[string]interface{}, MasterInfo []customerform.UnitAttribute) (map[string]interface{}, error) { + var oldData map[string]interface{} + if len(newsData) > 0 { + var id interface{} + editData := publicmethod.MapOut[string]() + for i, v := range newsData { + + if i == "id" { + // if idStr, ok := v.(string); ok { + // id = idStr + // } else { + // id = idStr + // } + id = v + } + if !publicmethod.RemoveReservedWord(i) { + // fmt.Printf("i:%v---->t:%T---->v:%v\n", i, v, v) + + for _, mv := range MasterInfo { + if i == mv.Key { + fmt.Printf("mv:%v---->t:%v---->---->v:%v\n", i, mv.Class, mv.Auxiliary) + switch mv.Class { + case "datePicker": + auxVal := publicmethod.TypeToInterface(mv.Auxiliary) + if !publicmethod.RemoveReservedWordTime(auxVal) { + editData[i] = v + } else { + if valAry, isAry := v.([]interface{}); isAry { + if len(valAry) > 0 { + editData[i] = valAry[0] + endKey := fmt.Sprintf("%v_end", i) + editData[endKey] = valAry[len(valAry)-1] + } + } + } + case "checkbox": + valStrJson, _ := json.Marshal(v) + editData[i] = string(valStrJson) + case "select": + if auxVal, isAc := mv.Auxiliary.(bool); isAc { + if auxVal { + valStrJson, _ := json.Marshal(v) + editData[i] = string(valStrJson) + } else { + editData[i] = v + } + } else { + editData[i] = v + } + + default: + if valAry, isAry := v.([]interface{}); isAry { + + if len(valAry) > 0 { + valStrJson, _ := json.Marshal(valAry) + editData[i] = string(valStrJson) + } else { + editData[i] = "" + } + } else { + editData[i] = v + } + + } + } + + } + } + } + err := sqlDb.Table(tableName).Where("`id` = ?", id).Find(&oldData).Error + if err != nil { + return oldData, err + } + editData["`edit_time`"] = cureeTime + editData["`creater`"] = creater + editData["`states`"] = 1 + err = sqlDb.Table(tableName).Where("`id` = ?", id).Updates(&editData).Error + + return oldData, err + } + return oldData, nil +} + /* * @ 作者: 秦东 diff --git a/api/version1/taskplatform/taskmanagement/runTaskFlow.go b/api/version1/taskplatform/taskmanagement/runTaskFlow.go index 96175cc..7fb54d2 100644 --- a/api/version1/taskplatform/taskmanagement/runTaskFlow.go +++ b/api/version1/taskplatform/taskmanagement/runTaskFlow.go @@ -3,6 +3,7 @@ package taskmanagement import ( "appPlatform/api/version1/customerform" "appPlatform/models/customerForm" + "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" "appPlatform/models/reviseform" "appPlatform/overall" @@ -919,3 +920,228 @@ func HistoryValueHand(field string, val interface{}, nameKey []customerform.Unit } return } + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-19 16:13:29 +@ 功能: 获取web表单数据 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainWebTaskFlowInfo(c *gin.Context) { + var requestData publicmethod.PublicId + err := c.ShouldBindJSON(&requestData) + if err != nil { + publicmethod.Result(100, err, c) + return + } + if requestData.Id == "" { + publicmethod.Result(100, err, c) + return + } + //获取任务 + var taskInfo TaskInfoStruct + err = taskInfo.GetCont(map[string]interface{}{"`masters_key`": requestData.Id}) + if err != nil { + publicmethod.Result(107, err, c) + return + } + taskInfo.MastersKeyStr = strconv.FormatInt(taskInfo.MastersKey, 10) + taskInfo.FlowKeyStr = strconv.FormatInt(taskInfo.FlowKey, 10) + taskInfo.TableKeyStr = strconv.FormatInt(taskInfo.TableKey, 10) + taskInfo.AppKeyStr = strconv.FormatInt(taskInfo.AppKey, 10) + taskInfo.RunFlowIdStr = strconv.FormatInt(taskInfo.Id, 10) + taskInfo.RunFlowId = taskInfo.Id + taskInfo.FormVersionId = strconv.FormatInt(taskInfo.VersionId, 10) + taskInfo.IdStr = strconv.FormatInt(taskInfo.Id, 10) + taskInfo.RunFlowIdStr = strconv.FormatInt(taskInfo.Id, 10) + taskInfo.FlowKeys = strconv.FormatInt(taskInfo.FlowKey, 10) + taskInfo.CreaterInfo = GainSmaillUserInfo[int64](taskInfo.Creater) + taskInfo.MastersKeyStr = strconv.FormatInt(taskInfo.MastersKey, 10) + taskInfo.AppKeyStr = strconv.FormatInt(taskInfo.AppKey, 10) + taskInfo.TableKeyStr = strconv.FormatInt(taskInfo.TableKey, 10) + if taskInfo.NextExecutor != "" { + nextAry := strings.Split(taskInfo.NextExecutor, ",") + for _, v := range nextAry { + taskInfo.CurrentNodeUser = append(taskInfo.CurrentNodeUser, GainSmaillUserInfo[string](v)) + } + } + taskInfo.StartDate = publicmethod.UnixTimeToDay(taskInfo.StartTime, 27) + if taskInfo.NextStep != 0 { + nodeCont, idTrue := GainCurreNode(taskInfo.FlowCont, taskInfo.CurrentStep, taskInfo.NextStep, taskInfo.Status) + if idTrue { + taskInfo.CurrentNodeName = nodeCont.NodeName + } + } + if taskInfo.MastesForm == "" || taskInfo.MastesFormJson == "" { + taskInfo.MastesForm, taskInfo.MastesFormJson = GainTaskFormData(taskInfo.FlowKey) + } + if taskInfo.Status == 3 && taskInfo.NextStep != 0 { + if taskInfo.CurrentStep == 1 { + taskInfo.IsRetract = true + } + } + + //获取表单数据 + var formVersionInfo CallBackFormStruct + err = formVersionInfo.GetCont(map[string]interface{}{"`id`": taskInfo.VersionId}) + if err != nil { + publicmethod.Result(107, err, c) + return + } + formVersionInfo.FlowkeyStr = strconv.FormatInt(formVersionInfo.Flowkey, 10) + formVersionInfo.CreaterStr = strconv.FormatInt(formVersionInfo.Creater, 10) + formVersionInfo.MastesForm = taskInfo.MastesForm + formVersionInfo.MastesFormJson = taskInfo.MastesFormJson + + //展开表单 + var formJsonCont customerform.CustomerFormMaster + json.Unmarshal([]byte(taskInfo.MastesFormJson), &formJsonCont) + + var tableUnitList customerform.TableFormUnit + tableUnitList.AnalysisTableFormUnitAttribute("", formJsonCont.List) + + sendData := publicmethod.MapOut[string]() + sendData["taskInfo"] = taskInfo + sendData["structure"] = formVersionInfo + sendData["tableData"] = GainOnlyOneCustomerFormLog(requestData.Id, formVersionInfo.TableKey, formVersionInfo.TableStructure, tableUnitList) + publicmethod.Result(0, sendData, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2023-11-23 16:17:17 +@ 功能: 获取简短人员信息 +@ 参数 + + #userKey 操作人 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainSmaillUserInfo[T publicmethod.GenericityVariable](userKey T) (createrInfo UserSmallInfo) { + var userInfo modelshr.ManCont + err := userInfo.GetCont(map[string]interface{}{"`key`": userKey}, "`id`", "`key`", "`name`", "`number`", "`icon`", "`icon_photo`", "`wechat`", "`work_wechat`") + if err != nil { + return + } + createrInfo.Id = userInfo.Id + createrInfo.Key = strconv.FormatInt(userInfo.Key, 10) + createrInfo.Name = userInfo.Name + createrInfo.Number = userInfo.Number + createrInfo.Icon = userInfo.Icon + if userInfo.IconPhpto != "" { + createrInfo.Icon = userInfo.IconPhpto + } + createrInfo.WeChat = userInfo.Wechat + if userInfo.WorkWechat != "" { + createrInfo.WeChat = userInfo.WorkWechat + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2023-11-23 16:34:22 +@ 功能: 获取当前节点 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainCurreNode(flowStr string, step, nextStep, state int) (nodeInfo RunFlow, isOk bool) { + if flowStr == "" { + return + } + var flowAry []RunFlow + err := json.Unmarshal([]byte(flowStr), &flowAry) + if err != nil { + return + } + if nextStep == 0 { + step = len(flowAry) + } else { + switch state { + case 1: + step = 0 + case 2: + if step != 1 { + step = step + 1 + } + case 3: + step = step + 1 + case 4: + step = len(flowAry) + default: + step = step + 1 + } + } + for _, v := range flowAry { + if v.Step == step { + nodeInfo = v + isOk = true + return + } + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2023-11-24 11:36:32 +@ 功能: 获取表单数据 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainTaskFormData(taskId int64) (mastesform, mastesformjson string) { + if taskId > 0 { + var taskInfo modelAppPlatform.Task + err := taskInfo.GetCont(map[string]interface{}{"`masters_key`": taskId}, "`version_id`") + if err != nil { + return + } + var formVerInfo modelAppPlatform.CustomerFormVersion + err = formVerInfo.GetCont(map[string]interface{}{"`id`": taskInfo.VersionId}, "`mastesform`", "`mastesformjson`") + if err != nil { + return + } + mastesform = formVerInfo.MastesForm + mastesformjson = formVerInfo.MastesFormJson + taskInfo.EiteCont(map[string]interface{}{"`masters_key`": taskId}, map[string]interface{}{"`mastesform`": formVerInfo.MastesForm, "`mastesformjson`": formVerInfo.MastesFormJson}) + } + return +} diff --git a/api/version1/taskplatform/taskmanagement/sendWechatMsg.go b/api/version1/taskplatform/taskmanagement/sendWechatMsg.go index 8a740fd..dfbe75b 100644 --- a/api/version1/taskplatform/taskmanagement/sendWechatMsg.go +++ b/api/version1/taskplatform/taskmanagement/sendWechatMsg.go @@ -136,7 +136,7 @@ func (r *RunWorkFlow) SendWecharMsgTextCard(runStep int, nodeTitle, content stri sendMsg.Msgtype = "textcard" sendMsg.Textcard.Title = nodeTitle sendMsg.Textcard.Description = fmt.Sprintf("
%v
%v
%v
驳回原因:%v
", publicmethod.UnixTimeToDay(time.Now().Unix(), 11), tableName, qouteTitle, content) - sendMsg.Textcard.Url = "wap.gyhlw.group" + sendMsg.Textcard.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, r.SendWecharMsg.MastersKey) sendMsg.Textcard.Btntxt = "前往查看" fmt.Printf("驳回数据接收人2:%v", sendMsg) sendMsg.SendMsg("stzl", 1) diff --git a/api/version1/taskplatform/taskmanagement/types.go b/api/version1/taskplatform/taskmanagement/types.go index 8241434..63e790b 100644 --- a/api/version1/taskplatform/taskmanagement/types.go +++ b/api/version1/taskplatform/taskmanagement/types.go @@ -1,6 +1,7 @@ package taskmanagement import ( + "appPlatform/models/customerForm" "appPlatform/models/modelAppPlatform" "appPlatform/overall/publicmethod" "sync" @@ -128,3 +129,32 @@ type TaskLogInfo struct { Value interface{} `json:"value"` //结果 Sort int `json:"sort"` // } + +// 任务结构体 +type TaskInfoStruct struct { + customerForm.RunFlowTask + FlowKeyStr string `json:"flowKeyStr" gorm:"-"` + FlowKeys string `json:"flowkeys" gorm:"-"` //唯一标识符 + CreaterInfo UserSmallInfo `json:"creatorInfo" gorm:"-"` //创建人信息 + StartDate string `json:"startDate" gorm:"-"` //创建日期 + CurrentNodeName string `json:"currentNodeName" gorm:"-"` //当前节点名称 + CurrentNodeUser []UserSmallInfo `json:"currentNodeUser" gorm:"-"` //节点操作人 + IdStr string `json:"idStr" gorm:"-"` // + FormVersionId string `json:"formVersionId" gorm:"-"` + IsRetract bool `json:"isRetract" gorm:"-"` //是否可以撤回 + MastersKeyStr string `json:"mastersKeyStr" gorm:"-"` //唯一标识符 + AppKeyStr string `json:"appKeyStr" gorm:"-"` //唯一标识符 + TableKeyStr string `json:"tableKeyStr" gorm:"-"` //唯一标识符 + RunFlowIdStr string `json:"runFlowIdStr" gorm:"-"` //唯一标识符 + RunFlowId int64 `json:"runFlowId" gorm:"-"` //唯一标识符 +} + +// 人员剪短信息 +type UserSmallInfo struct { + Id int64 `json:"id"` + Key string `json:"key"` + Name string `json:"name"` + Number string `json:"number"` + Icon string `json:"icon"` + WeChat string `json:"weChat"` +} diff --git a/api/version1/workFlow/common.go b/api/version1/workFlow/common.go index 2248765..0e8b403 100644 --- a/api/version1/workFlow/common.go +++ b/api/version1/workFlow/common.go @@ -218,11 +218,11 @@ func (r *RunWorkFlow) SendWecharMsgTopct(userKey string, nextStep int) { sendMsg.TemplateCard.HorizontalContentList = append(sendMsg.TemplateCard.HorizontalContentList, contList...) var jumpInfo workWechat.Jump_list jumpInfo.Title = "前往处理" - jumpInfo.Url = "wap.gyhlw.group" + jumpInfo.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, r.SendWecharMsg.MastersKey) jumpInfo.Type = 1 sendMsg.TemplateCard.JumpList = append(sendMsg.TemplateCard.JumpList, jumpInfo) sendMsg.TemplateCard.CardAction.Type = 1 - sendMsg.TemplateCard.CardAction.Url = "wap.gyhlw.group" + sendMsg.TemplateCard.CardAction.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, r.SendWecharMsg.MastersKey) sendMsg.SendMsg("stzl", 1) } } @@ -1053,7 +1053,7 @@ func (r *RunWorkFlow) SendWecharMsgTextCard(runStep int, nodeTitle, content stri sendMsg.Msgtype = "textcard" sendMsg.Textcard.Title = nodeTitle sendMsg.Textcard.Description = fmt.Sprintf("
%v
%v
%v
驳回原因:%v
", publicmethod.UnixTimeToDay(time.Now().Unix(), 11), tableName, qouteTitle, content) - sendMsg.Textcard.Url = "wap.gyhlw.group" + sendMsg.Textcard.Url = fmt.Sprintf("%v/#/work_wechat?masters_key=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, r.SendWecharMsg.MastersKey) sendMsg.Textcard.Btntxt = "前往查看" fmt.Printf("驳回数据接收人2:%v", sendMsg) sendMsg.SendMsg("stzl", 1) diff --git a/api/version1/workWechat/wechat.go b/api/version1/workWechat/wechat.go index 2819ff5..1c3f7e6 100644 --- a/api/version1/workWechat/wechat.go +++ b/api/version1/workWechat/wechat.go @@ -403,3 +403,154 @@ func SetUpWechatInfo(wechatOpenId string) (sendData WechatVerifyIdentity, err er redisClient.HashMsetAdd(wechatRedisToekn, saveInfo) return } + +/* +* +@ 作者: 秦东 +@ 时间: 2024-12-19 13:42:30 +@ 功能: 查看手机流程表单详情单页企业微信网页授权code +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) ObtaOnePage(c *gin.Context) { + //保障获取渠道一致 + md5Token := GainTokenKey(c) + + //来源于哪个系统 + systemApp := c.Query("systemapp") + if systemApp == "" { + systemApp = "stzl" + } + isAgain := c.Query("isagain") //是否强制重新授权 + isAgainInt, _ := strconv.Atoi(isAgain) + if isAgainInt == 0 { + isAgainInt = 1 + } + //获取token + token, err := GainWechatToken(systemApp, md5Token, isAgainInt) + if err != nil { + publicmethod.Result(1, err, c, "身份认证失败") + return + } + //组装企业微信重定向地址参数 + var urlRedirectKey []string + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("systemapp=%v", systemApp)) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("isagain=%v", isAgainInt)) + userNum := c.Query("userid") + if userNum != "" { + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("userid=%v", userNum)) + } + + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("appKey=%v", c.Query("appKey"))) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("appId=%v", c.Query("appId"))) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("taskTitle=%v", c.Query("taskTitle"))) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("taskId=%v", c.Query("taskId"))) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("taskKey=%v", c.Query("taskKey"))) + + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("masters_key=%v", c.Query("masters_key"))) + + urlParameter := strings.Join(urlRedirectKey, "&") //合并成参数字符串 + //企业微信重定向地址 + watchWorkCallBackUrl := url.QueryEscape(fmt.Sprintf("%v/systemapi/wechat/wechatCallBackPage?%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, urlParameter)) + redirectUrl := fmt.Sprintf("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%v&redirect_uri=%v&response_type=code&scope=snsapi_base&state=%v#wechat_redirect", overall.CONSTANT_CONFIG.WechatCompany.CompanyId, watchWorkCallBackUrl, token) + c.Redirect(http.StatusMovedPermanently, redirectUrl) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-10-23 14:41:12 +@ 功能: 查看手机流程表单企业微信参数地址重定向回调 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) WechatCallBackPage(c *gin.Context) { + code := c.Query("code") + state := c.Query("state") + if code == "" || state == "" { + publicmethod.Result(0, code, c, "未能查询到您的信息!企业微信授权失败!") + return + } + systemApp := c.Query("systemapp") + if systemApp == "" { + systemApp = "stzl" + } + isAgain := c.Query("isagain") + isAgainInt, _ := strconv.Atoi(isAgain) + userNum := c.Query("userid") + md5Token := GainTokenKey(c) //保障获取渠道一致 + token, _ := GainWechatToken(systemApp, md5Token, isAgainInt) + gainWechatInfo := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%v&code=%v", token, code) + wechatInfoByte := publicmethod.CurlGet(gainWechatInfo) + var callBackWechatInfo WorkWechatUserAuter + err := json.Unmarshal(wechatInfoByte, &callBackWechatInfo) + if err != nil { + publicmethod.Result(0, err, c, "未能查询到您的信息!企业微信授权失败!2") + return + } + if callBackWechatInfo.Errcode != 0 { + + if callBackWechatInfo.Errcode == 42001 { + a.ObtainAuthorization(c) + return + } + publicmethod.Result(12, callBackWechatInfo, c, "未能查询到您的信息!企业微信授权失败!3") + return + } + var userWechatId string + if callBackWechatInfo.OpenId != "" { + userWechatId = callBackWechatInfo.OpenId + } + if callBackWechatInfo.Userid != "" { + userWechatId = callBackWechatInfo.Userid + } + if userWechatId == "" { + publicmethod.Result(1, err, c, "未能查询到您的信息!企业微信授权失败!") + return + } + wechatCont, err := SetUpWechatInfo(userWechatId) + if err != nil { + publicmethod.Result(13, err, c, "未能查询到您的信息!企业微信授权失败!") + return + } + + var urlRedirectKey []string + + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("callback=%v", 1)) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("usernum=%v", userNum)) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("openid=%v", wechatCont.UserInfo.Number)) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("userkey=%v", wechatCont.UserKey)) + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("token=%v", wechatCont.Token)) + + // urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("appKey=%v", c.Query("appKey"))) + // urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("appId=%v", c.Query("appId"))) + // urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("taskId=%v", c.Query("taskId"))) + // urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("taskKey=%v", c.Query("taskKey"))) + + urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("masters_key=%v", c.Query("masters_key"))) + // urlRedirectKey = append(urlRedirectKey, fmt.Sprintf("runFlowId=%v", c.Query("runFlowId"))) + + urlParameter := strings.Join(urlRedirectKey, "&") //合并成参数字符串 + // callBackLoginUrl := fmt.Sprintf("%v/#/?callback=1&usernum=%v&openid=%v&userkey=%v&token=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, userNum, wechatCont.UserInfo.Number, wechatCont.UserKey, wechatCont.Token) + // callBackLoginUrl := fmt.Sprintf("%v?callback=1&usernum=%v&openid=%v&userkey=%v&token=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, userNum, wechatCont.UserInfo.Number, wechatCont.UserKey, wechatCont.Token) + callBackLoginUrl := fmt.Sprintf("%v/#/work_wechat?%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, urlParameter) + c.Redirect(http.StatusMovedPermanently, callBackLoginUrl) +} diff --git a/apirouter/v1/customerformrouter/router.go b/apirouter/v1/customerformrouter/router.go index 876c506..fd0e789 100644 --- a/apirouter/v1/customerformrouter/router.go +++ b/apirouter/v1/customerformrouter/router.go @@ -100,5 +100,8 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { appApiRouter.POST("getGroupAndApp", methodAppHand.GetGroupAndApp) //获取分组及App appApiRouter.POST("gainMenuGroupForm", methodAppHand.GainMenuGroupForm) //按菜单顶级分组和表单 + + appApiRouter.POST("gainDataStorceAllField", methodAppHand.GainDataStorceAllField) //获取有源数据表字段 + } } diff --git a/apirouter/v1/dataCenterRouter/router.go b/apirouter/v1/dataCenterRouter/router.go index 467db26..58782a8 100644 --- a/apirouter/v1/dataCenterRouter/router.go +++ b/apirouter/v1/dataCenterRouter/router.go @@ -17,5 +17,7 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { apiRouter.POST("gaindataCenter", dataApi.GaindataCenter) //通用地址 apiRouter.POST("postSaveData", dataApi.PostSaveData) //数据中台POST提交数据 + + apiRouter.POST("gainDataTable", dataApi.GainDataTable) //获取数据表 } } diff --git a/apirouter/v1/taskrouter/taskrouter.go b/apirouter/v1/taskrouter/taskrouter.go index 75b1893..38bd591 100644 --- a/apirouter/v1/taskrouter/taskrouter.go +++ b/apirouter/v1/taskrouter/taskrouter.go @@ -48,6 +48,8 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { apiRouter.POST("createAppTask", taskManagementRouter.CreateAppTask) //自定义App表单新增记录 apiRouter.POST("runTaskFlow", taskManagementRouter.RunTaskFlow) //执行工作流 + + apiRouter.POST("gainWebTaskFlowInfo", taskManagementRouter.GainWebTaskFlowInfo) // 获取web表单数据 } taskFlowApi := router.Group("task_flow") diff --git a/apirouter/v1/workWechatRouter/router.go b/apirouter/v1/workWechatRouter/router.go index 8494c4c..dacd376 100644 --- a/apirouter/v1/workWechatRouter/router.go +++ b/apirouter/v1/workWechatRouter/router.go @@ -18,5 +18,8 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { apiRouter.GET("obtainAuthorization", methodBinding.ObtainAuthorization) //构造企业微信网页授权code apiRouter.GET("wechatCallBack", methodBinding.WechatCallBack) //企业微信参数地址重定向回调 apiRouter.POST("sendMsg", methodBinding.SendMsg) //向企业微信发送消息 + + apiRouter.GET("obtaOnePage", methodBinding.ObtaOnePage) //查看手机流程表单详情单页企业微信网页授权code + apiRouter.GET("wechatCallBackPage", methodBinding.WechatCallBackPage) //查看手机流程表单企业微信参数地址重定向回调 } } diff --git a/go.mod b/go.mod index 34eeb04..5b2ffb4 100644 --- a/go.mod +++ b/go.mod @@ -17,20 +17,32 @@ require ( github.com/tjfoc/gmsm v1.4.1 gopkg.in/ini.v1 v1.67.0 gorm.io/driver/mysql v1.5.2 - gorm.io/gorm v1.25.5 + gorm.io/gorm v1.25.10 +) + +require ( + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + golang.org/x/sync v0.5.0 // indirect ) require ( github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/denisenkom/go-mssqldb v0.12.3 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/go-sql-driver/mysql v1.7.1 github.com/goccy/go-json v0.10.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect @@ -38,8 +50,10 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect + github.com/lib/pq v1.10.9 github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-sqlite3 v1.14.24 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect @@ -51,11 +65,14 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/postgres v1.5.11 + gorm.io/driver/sqlite v1.5.7 + gorm.io/driver/sqlserver v1.5.4 ) diff --git a/go.sum b/go.sum index 766e119..c811f87 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -18,8 +32,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dengsgo/math-engine v0.0.0-20230823154425-78f211b48149 h1:TkVfb0s14IUHDGvjQfq3f0PZnV1zh609did4DrnD4q4= github.com/dengsgo/math-engine v0.0.0-20230823154425-78f211b48149/go.mod h1:zkR27k4K0I8FS6rkEd8qBhPeS8i3X2FKfvSPdF64OpQ= +github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= +github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -46,6 +64,14 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -65,10 +91,31 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -78,14 +125,24 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -93,10 +150,15 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ= github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -122,6 +184,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -137,41 +200,106 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -179,6 +307,10 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -200,16 +332,31 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= +gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= +gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/overall/publicmethod/technique.go b/overall/publicmethod/technique.go index 67e3260..f4b0c3d 100644 --- a/overall/publicmethod/technique.go +++ b/overall/publicmethod/technique.go @@ -2945,3 +2945,20 @@ func GetMaxNum[T GenericityVariable](ary []T) T { return maxVal } + +// 数据库关系转换 +func DatabaseIntToString(typeId int64) string { + switch typeId { + case 2: + return "RTD" + case 3: + return "TIDB" + case 4: + return "SqlServer" + case 5: + return "redis" + default: + return "mysql" + } + return "mysql" +}