Browse Source

增加数据源

li_v1
hreenshan112 11 months ago
parent
commit
7b2a4af5bd
  1. 98
      api/version1/customerApp/appControll.go
  2. 81
      api/version1/customerApp/runAppControll.go
  3. 11
      api/version1/customerApp/type.go
  4. 111
      api/version1/customerform/dataSourcSql.go
  5. 58
      api/version1/customerform/form.go
  6. 389
      api/version1/customerform/formTable.go
  7. 33
      api/version1/customerform/type.go
  8. 362
      api/version1/dataCenter/databastHanld.go
  9. 58
      api/version1/dataCenter/runDataBase.go
  10. 41
      api/version1/dataCenter/type.go
  11. 56
      api/version1/taskplatform/taskmanagement/appControl.go
  12. 157
      api/version1/taskplatform/taskmanagement/formcontrol.go
  13. 258
      api/version1/taskplatform/taskmanagement/ruanTask.go
  14. 226
      api/version1/taskplatform/taskmanagement/runTaskFlow.go
  15. 2
      api/version1/taskplatform/taskmanagement/sendWechatMsg.go
  16. 30
      api/version1/taskplatform/taskmanagement/types.go
  17. 6
      api/version1/workFlow/common.go
  18. 151
      api/version1/workWechat/wechat.go
  19. 3
      apirouter/v1/customerformrouter/router.go
  20. 2
      apirouter/v1/dataCenterRouter/router.go
  21. 2
      apirouter/v1/taskrouter/taskrouter.go
  22. 3
      apirouter/v1/workWechatRouter/router.go
  23. 29
      go.mod
  24. 147
      go.sum
  25. 17
      overall/publicmethod/technique.go

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

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

11
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"`
}

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

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

389
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

33
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"`
}
// 属性配置

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

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

41
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"` //表字段
}

56
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

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

258
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
}
/*
*
@ 作者: 秦东

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

2
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("<div class='gray'>%v</div> <div class='normal'>%v</div><div class='gray'>%v</div><div class='highlight'>驳回原因:%v</div>", 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)

30
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"`
}

6
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("<div class='gray'>%v</div> <div class='normal'>%v</div><div class='gray'>%v</div><div class='highlight'>驳回原因:%v</div>", 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)

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

3
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) //获取有源数据表字段
}
}

2
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) //获取数据表
}
}

2
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")

3
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) //查看手机流程表单企业微信参数地址重定向回调
}
}

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

147
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=

17
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"
}

Loading…
Cancel
Save