Files
gfast/app/service/admin/gen_service/table.go
T
2020-08-13 17:24:29 +08:00

502 lines
12 KiB
Go

package gen_service
import (
"gfast/app/model/admin/gen_table"
"gfast/app/model/admin/gen_table_column"
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"strings"
)
//根据条件分页查询数据
func SelectDbTableList(param *gen_table.SelectPageReq) (total int, list []*gen_table.Entity, err error) {
return gen_table.SelectDbTableList(param)
}
//根据条件分页查询数据
func SelectListByPage(param *gen_table.SelectPageReq) (total int, list []*gen_table.Entity, err error) {
return gen_table.SelectListByPage(param)
}
//查询据库列表
func SelectDbTableListByNames(tableNames []string) ([]*gen_table.Entity, error) {
return gen_table.SelectDbTableListByNames(tableNames)
}
//导入表结构
func ImportGenTable(tableList []*gen_table.Entity, operName string) error {
if tableList != nil && operName != "" {
tx, err := g.DB().Begin()
if err != nil {
return err
}
for _, table := range tableList {
tableName := table.TableName
InitTable(table, operName)
result, err := tx.Table(gen_table.Table).Insert(table)
if err != nil {
return err
}
tmpid, err := result.LastInsertId()
if err != nil || tmpid <= 0 {
tx.Rollback()
return gerror.New("保存数据失败")
}
table.TableId = tmpid
// 保存列信息
genTableColumns, err := gen_table_column.SelectDbTableColumnsByName(tableName)
if err != nil || len(genTableColumns) <= 0 {
tx.Rollback()
return gerror.New("获取列数据失败")
}
for _, column := range genTableColumns {
InitColumnField(column, table)
_, err = tx.Table("gen_table_column").Insert(column)
if err != nil {
tx.Rollback()
return gerror.New("保存列数据失败")
}
}
}
return tx.Commit()
} else {
return gerror.New("参数错误")
}
}
//获取数据库类型字段
func GetDbType(columnType string) string {
if strings.Index(columnType, "(") > 0 {
return columnType[0:strings.Index(columnType, "(")]
} else {
return columnType
}
}
//将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
func ConvertToCamelCase(name string) string {
if name == "" {
return ""
} else if !strings.Contains(name, "_") {
// 不含下划线,仅将首字母大写
return strings.ToUpper(name[0:1]) + name[1:len(name)]
}
var result string = ""
camels := strings.Split(name, "_")
for index := range camels {
if camels[index] == "" {
continue
}
camel := camels[index]
result = result + strings.ToUpper(camel[0:1]) + strings.ToLower(camel[1:len(camel)])
}
return result
}
////将下划线大写方式命名的字符串转换为驼峰式,首字母小写。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->helloWorld
func ConvertToCamelCase1(name string) string {
if name == "" {
return ""
} else if !strings.Contains(name, "_") {
// 不含下划线,原值返回
return name
}
var result string = ""
camels := strings.Split(name, "_")
for index := range camels {
if camels[index] == "" {
continue
}
camel := camels[index]
if result == "" {
result = strings.ToLower(camel[0:1]) + strings.ToLower(camel[1:len(camel)])
} else {
result = result + strings.ToUpper(camel[0:1]) + strings.ToLower(camel[1:len(camel)])
}
}
return result
}
//获取字段长度
func GetColumnLength(columnType string) int {
start := strings.Index(columnType, "(")
end := strings.Index(columnType, ")")
result := ""
if start >= 0 && end >= 0 {
result = columnType[start+1 : end-1]
}
return gconv.Int(result)
}
//初始化列属性字段
func InitColumnField(column *gen_table_column.Entity, table *gen_table.Entity) {
dataType := GetDbType(column.ColumnType)
columnName := column.ColumnName
column.TableId = table.TableId
column.CreateBy = table.CreateBy
column.CreateTime = gtime.Now()
column.UpdateTime = column.CreateTime
//设置字段名
column.GoField = ConvertToCamelCase(columnName)
column.HtmlField = ConvertToCamelCase1(columnName)
if gen_table_column.IsStringObject(dataType) {
//字段为字符串类型
column.GoType = "string"
columnLength := GetColumnLength(column.ColumnType)
if columnLength >= 500 {
column.HtmlType = "textarea"
} else {
column.HtmlType = "input"
}
} else if gen_table_column.IsTimeObject(dataType) {
//字段为时间类型
column.GoType = "Time"
column.HtmlType = "datatime"
} else if gen_table_column.IsNumberObject(dataType) {
//字段为数字类型
column.HtmlType = "input"
// 如果是浮点型
tmp := column.ColumnType
start := strings.Index(tmp, "(")
end := strings.Index(tmp, ")")
result := "0"
if start > 0 && end > 0 {
result = tmp[start+1 : end]
}
arr := strings.Split(result, ",")
if len(arr) == 2 && gconv.Int(arr[1]) > 0 {
column.GoType = "float64"
} else if len(arr) == 1 && gconv.Int(arr[0]) <= 10 {
column.GoType = "int"
} else {
column.GoType = "int64"
}
}
//新增字段
if columnName == "create_by" || columnName == "create_time" || columnName == "update_by" || columnName == "update_time" {
column.IsRequired = "0"
column.IsInsert = "0"
} else {
column.IsRequired = "0"
column.IsInsert = "1"
if strings.Index(columnName, "name") >= 0 || strings.Index(columnName, "status") >= 0 {
column.IsRequired = "1"
}
}
// 编辑字段
if gen_table_column.IsNotEdit(columnName) {
if column.IsPk == "1" {
column.IsEdit = "0"
} else {
column.IsEdit = "1"
}
} else {
column.IsEdit = "0"
}
// 列表字段
if gen_table_column.IsNotList(columnName) {
column.IsList = "1"
} else {
column.IsList = "0"
}
// 查询字段
if gen_table_column.IsNotQuery(columnName) {
column.IsQuery = "1"
} else {
column.IsQuery = "0"
}
// 查询字段类型
if CheckNameColumn(columnName) {
column.QueryType = "LIKE"
} else {
column.QueryType = "EQ"
}
// 状态字段设置单选框
if CheckStatusColumn(columnName) {
column.HtmlType = "radio"
} else if CheckTypeColumn(columnName) || CheckSexColumn(columnName) {
// 类型&性别字段设置下拉框
column.HtmlType = "select"
}
}
//检查字段名后3位是否是sex
func CheckSexColumn(columnName string) bool {
if len(columnName) >= 3 {
end := len(columnName)
start := end - 3
if start <= 0 {
start = 0
}
if columnName[start:end] == "sex" {
return true
}
}
return false
}
//检查字段名后4位是否是type
func CheckTypeColumn(columnName string) bool {
if len(columnName) >= 4 {
end := len(columnName)
start := end - 4
if start <= 0 {
start = 0
}
if columnName[start:end] == "type" {
return true
}
}
return false
}
//检查字段名后6位是否是status
func CheckStatusColumn(columnName string) bool {
if len(columnName) >= 6 {
end := len(columnName)
start := end - 6
if start <= 0 {
start = 0
}
tmp := columnName[start:end]
if tmp == "status" {
return true
}
}
return false
}
//检查字段名后4位是否是name
func CheckNameColumn(columnName string) bool {
if len(columnName) >= 4 {
end := len(columnName)
start := end - 4
if start <= 0 {
start = 0
}
tmp := columnName[start:end]
if tmp == "name" {
return true
}
}
return false
}
//初始化表信息
func InitTable(table *gen_table.Entity, operName string) {
table.ClassName = ConvertClassName(table.TableName)
table.PackageName = g.Cfg().GetString("gen.packageName")
table.ModuleName = g.Cfg().GetString("gen.moduleName")
table.BusinessName = GetBusinessName(table.TableName)
table.FunctionName = strings.ReplaceAll(table.TableComment, "表", "")
table.FunctionAuthor = g.Cfg().GetString("gen.author")
table.CreateBy = operName
table.TplCategory = "crud"
table.CreateTime = gtime.Now()
table.UpdateTime = table.CreateTime
}
//表名转换成类名
func ConvertClassName(tableName string) string {
autoRemovePre := g.Cfg().GetBool("gen.autoRemovePre")
tablePrefix := g.Cfg().GetString("gen.tablePrefix")
if autoRemovePre && tablePrefix != "" {
searchList := strings.Split(tablePrefix, ",")
for _, str := range searchList {
tableName = strings.ReplaceAll(tableName, str, "")
}
}
return tableName
}
//获取业务名
func GetBusinessName(tableName string) string {
lastIndex := strings.LastIndex(tableName, "_")
nameLength := len(tableName)
businessName := tableName[lastIndex+1 : nameLength]
return businessName
}
//根据table_id查询表列数据
func SelectGenTableColumnListByTableId(tableId int64) ([]*gen_table_column.Entity, error) {
return gen_table_column.SelectGenTableColumnListByTableId(tableId)
}
func GetTableInfoByTableId(tableId int64) (info *gen_table.Entity, err error) {
return gen_table.GetInfoById(tableId)
}
//修改表和列信息
func SaveEdit(req *gen_table.EditReq) (err error) {
if req == nil {
err = gerror.New("参数错误")
return
}
table, err := gen_table.FindOne("table_id=?", req.TableId)
if err != nil || table == nil {
err = gerror.New("数据不存在")
return
}
if req.TableName != "" {
table.TableName = req.TableName
}
if req.TableComment != "" {
table.TableComment = req.TableComment
}
if req.BusinessName != "" {
table.BusinessName = req.BusinessName
}
if req.ClassName != "" {
table.ClassName = req.ClassName
}
if req.FunctionAuthor != "" {
table.FunctionAuthor = req.FunctionAuthor
}
if req.FunctionName != "" {
table.FunctionName = req.FunctionName
}
if req.ModuleName != "" {
table.ModuleName = req.ModuleName
}
if req.PackageName != "" {
table.PackageName = req.PackageName
}
if req.Remark != "" {
table.Remark = req.Remark
}
if req.TplCategory != "" {
table.TplCategory = req.TplCategory
}
if req.Params != "" {
table.Options = req.Params
}
table.UpdateTime = gtime.Now()
table.UpdateBy = req.UserName
if req.TplCategory == "tree" {
//树表设置options
options := g.Map{
"tree_code": req.TreeCode,
"tree_parent_code": req.TreeParentCode,
"tree_name": req.TreeName,
}
table.Options = gconv.String(options)
} else {
table.Options = ""
}
var tx *gdb.TX
tx, err = g.DB().Begin()
if err != nil {
return
}
_, err = tx.Table(gen_table.Table).Save(table)
if err != nil {
tx.Rollback()
return err
}
//保存列数据
if req.Columns != "" {
var j *gjson.Json
if j, err = gjson.DecodeToJson([]byte(req.Columns)); err != nil {
tx.Rollback()
return
} else {
var columnList []gen_table_column.Entity
err = j.ToStructs(&columnList)
if err == nil && columnList != nil && len(columnList) > 0 {
for _, column := range columnList {
if column.ColumnId > 0 {
tmp, _ := gen_table_column.FindOne("column_id=?", column.ColumnId)
if tmp != nil {
tmp.ColumnComment = column.ColumnComment
tmp.GoType = column.GoType
tmp.HtmlType = column.HtmlType
tmp.QueryType = column.QueryType
tmp.GoField = column.GoField
tmp.DictType = column.DictType
tmp.IsInsert = column.IsInsert
tmp.IsEdit = column.IsEdit
tmp.IsList = column.IsList
tmp.IsQuery = column.IsQuery
_, err = tx.Table(gen_table_column.Table).Save(tmp)
if err != nil {
tx.Rollback()
return
}
}
}
}
}
}
}
tx.Commit()
return
}
//删除表格
func Delete(ids []int) error {
tx, err := g.DB().Begin()
if err != nil {
g.Log().Error(err)
return gerror.New("开启删除事务出错")
}
_, err = tx.Table(gen_table.Table).Where(gen_table.Columns.TableId+" in(?)", ids).Delete()
if err != nil {
g.Log().Error(err)
tx.Rollback()
return gerror.New("删除表格数据失败")
}
_, err = tx.Table(gen_table_column.Table).Where(gen_table_column.Columns.TableId+" in(?)", ids).Delete()
if err != nil {
g.Log().Error(err)
tx.Rollback()
return gerror.New("删除表格字段数据失败")
}
tx.Commit()
return nil
}
func SelectRecordById(tableId int64) (entity *gen_table.EntityExtend, err error) {
entity, err = gen_table.SelectRecordById(tableId)
return
}
//设置主键列信息
func SetPkColumn(table *gen_table.EntityExtend, columns []*gen_table_column.Entity) {
for _, column := range columns {
if column.IsPk == "1" {
table.PkColumn = column
break
}
}
if table.PkColumn == nil {
table.PkColumn = columns[0]
}
}