mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-17 16:56:39 +08:00
260 lines
10 KiB
Go
260 lines
10 KiB
Go
// Package views
|
|
// @Link https://github.com/bufanyun/hotgo
|
|
// @Copyright Copyright (c) 2023 HotGo CLI
|
|
// @Author Ms <133814250@qq.com>
|
|
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
|
package views
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"hotgo/internal/consts"
|
|
"hotgo/internal/model/input/sysin"
|
|
)
|
|
|
|
const (
|
|
LogicWhereComments = "\n\t// 查询%s\n"
|
|
LogicWhereNoSupport = "\t// TODO 暂不支持生成[ %s ]查询方式,请自行补充此处代码!"
|
|
LogicListSimpleSelect = "\tfields, err := hgorm.GenSelect(ctx, sysin.%sListModel{}, dao.%s)\n\tif err != nil {\n\t\treturn\n\t}"
|
|
LogicListJoinSelect = "\t//关联表select\n\tfields, err := hgorm.GenJoinSelect(ctx, %sin.%sListModel{}, dao.%s, []*hgorm.Join{\n%v\t})"
|
|
LogicListJoinOnRelation = "\t// 关联表%s\n\tmod = mod.%s(hgorm.GenJoinOnRelation(\n\t\tdao.%s.Table(), dao.%s.Columns().%s, // 主表表名,关联字段\n\t\tdao.%s.Table(), \"%s\", dao.%s.Columns().%s, // 关联表表名,别名,关联字段\n\t)...)\n\n"
|
|
LogicEditUpdate = "\t\t_, err = s.Model(ctx%s).\n\t\t\tFieldsEx(\n%s\t\t\t).\n\t\t\tWhere(dao.%s.Columns().%s, in.%s).Data(in).Update()\n\t\treturn "
|
|
LogicEditInsert = "\t_, err = s.Model(ctx, &handler.Option{FilterAuth: false}).\n\t\tFieldsEx(\n%s\t\t).\n\t\tData(in).Insert()"
|
|
LogicEditUnique = "\t// 验证'%s'唯一\n\tif err = hgorm.IsUnique(ctx, dao.%s, g.Map{dao.%s.Columns().%s: in.%s}, \"%s已存在\", in.Id); err != nil {\n\t\treturn\n\t}\n"
|
|
LogicSwitchUpdate = "g.Map{\n\t\tin.Key: in.Value,\n%s}"
|
|
LogicStatusUpdate = "g.Map{\n\t\tdao.%s.Columns().Status: in.Status,\n%s}"
|
|
)
|
|
|
|
func (l *gCurd) logicTplData(ctx context.Context, in *CurdPreviewInput) (data g.Map, err error) {
|
|
data = make(g.Map)
|
|
data["listWhere"] = l.generateLogicListWhere(ctx, in)
|
|
data["listJoin"] = l.generateLogicListJoin(ctx, in)
|
|
data["listOrder"] = l.generateLogicListOrder(ctx, in)
|
|
data["edit"] = l.generateLogicEdit(ctx, in)
|
|
data["switchFields"] = l.generateLogicSwitchFields(ctx, in)
|
|
data["switchUpdate"] = l.generateLogicSwitchUpdate(ctx, in)
|
|
data["statusUpdate"] = l.generateLogicStatusUpdate(ctx, in)
|
|
return
|
|
}
|
|
|
|
func (l *gCurd) generateLogicStatusUpdate(ctx context.Context, in *CurdPreviewInput) string {
|
|
var update string
|
|
for _, field := range in.masterFields {
|
|
if field.GoName == "UpdatedBy" {
|
|
update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n"
|
|
}
|
|
}
|
|
|
|
update += "\t"
|
|
return fmt.Sprintf(LogicStatusUpdate, in.In.DaoName, update)
|
|
}
|
|
|
|
func (l *gCurd) generateLogicSwitchUpdate(ctx context.Context, in *CurdPreviewInput) string {
|
|
var update string
|
|
for _, field := range in.masterFields {
|
|
if field.GoName == "UpdatedBy" {
|
|
update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n"
|
|
}
|
|
}
|
|
|
|
update += "\t"
|
|
return fmt.Sprintf(LogicSwitchUpdate, update)
|
|
}
|
|
|
|
func (l *gCurd) generateLogicSwitchFields(ctx context.Context, in *CurdPreviewInput) string {
|
|
buffer := bytes.NewBuffer(nil)
|
|
if in.options.Step.HasSwitch {
|
|
for _, field := range in.masterFields {
|
|
if field.FormMode == "Switch" {
|
|
buffer.WriteString("\t\tdao." + in.In.DaoName + ".Columns()." + field.GoName + ",\n")
|
|
}
|
|
}
|
|
}
|
|
return buffer.String()
|
|
}
|
|
|
|
func (l *gCurd) generateLogicEdit(ctx context.Context, in *CurdPreviewInput) g.Map {
|
|
var (
|
|
data = make(g.Map)
|
|
updateFieldsEx = ""
|
|
updateBuffer = bytes.NewBuffer(nil)
|
|
insertFieldsEx = ""
|
|
insertBuffer = bytes.NewBuffer(nil)
|
|
uniqueBuffer = bytes.NewBuffer(nil)
|
|
)
|
|
|
|
for _, field := range in.masterFields {
|
|
if field.GoName == "UpdatedBy" {
|
|
updateBuffer.WriteString("\t\tin.UpdatedBy = contexts.GetUserId(ctx)\n")
|
|
}
|
|
|
|
if field.GoName == "CreatedBy" {
|
|
insertBuffer.WriteString("\tin.CreatedBy = contexts.GetUserId(ctx)\n")
|
|
}
|
|
|
|
if field.Index == consts.GenCodesIndexPK || field.GoName == "CreatedAt" || field.GoName == "CreatedBy" || field.GoName == "DeletedAt" {
|
|
updateFieldsEx = updateFieldsEx + "\t\t\t\tdao." + in.In.DaoName + ".Columns()." + field.GoName + ",\n"
|
|
}
|
|
|
|
if field.Index == consts.GenCodesIndexPK || field.GoName == "UpdatedBy" || field.GoName == "DeletedAt" {
|
|
insertFieldsEx = insertFieldsEx + "\t\t\t\tdao." + in.In.DaoName + ".Columns()." + field.GoName + ",\n"
|
|
}
|
|
|
|
if field.Unique {
|
|
uniqueBuffer.WriteString(fmt.Sprintf(LogicEditUnique, field.GoName, in.In.DaoName, in.In.DaoName, field.GoName, field.GoName, field.Dc))
|
|
}
|
|
}
|
|
|
|
notFilterAuth := ""
|
|
if gstr.InArray(in.options.ColumnOps, "notFilterAuth") {
|
|
notFilterAuth = ", &handler.Option{FilterAuth: false}"
|
|
}
|
|
|
|
updateBuffer.WriteString(fmt.Sprintf(LogicEditUpdate, notFilterAuth, updateFieldsEx, in.In.DaoName, in.pk.GoName, in.pk.GoName))
|
|
insertBuffer.WriteString(fmt.Sprintf(LogicEditInsert, insertFieldsEx))
|
|
|
|
data["update"] = updateBuffer.String()
|
|
data["insert"] = insertBuffer.String()
|
|
data["unique"] = uniqueBuffer.String()
|
|
return data
|
|
}
|
|
|
|
func (l *gCurd) generateLogicListOrder(ctx context.Context, in *CurdPreviewInput) string {
|
|
buffer := bytes.NewBuffer(nil)
|
|
if in.options.Step.HasMaxSort {
|
|
buffer.WriteString("OrderAsc(dao." + in.In.DaoName + ".Columns().Sort).")
|
|
}
|
|
buffer.WriteString("OrderDesc(dao." + in.In.DaoName + ".Columns()." + in.pk.GoName + ")")
|
|
return buffer.String()
|
|
}
|
|
|
|
func (l *gCurd) generateLogicListJoin(ctx context.Context, in *CurdPreviewInput) g.Map {
|
|
var data = make(g.Map)
|
|
data["link"] = ""
|
|
if hasEffectiveJoins(in.options.Join) {
|
|
var (
|
|
selectBuffer = bytes.NewBuffer(nil)
|
|
linkBuffer = bytes.NewBuffer(nil)
|
|
joinSelectRows string
|
|
)
|
|
|
|
for _, join := range in.options.Join {
|
|
if isEffectiveJoin(join) {
|
|
joinSelectRows = joinSelectRows + fmt.Sprintf("\t\t{Dao: dao.%s, Alias: \"%s\"},\n", join.DaoName, join.Alias)
|
|
linkBuffer.WriteString(fmt.Sprintf(LogicListJoinOnRelation, join.Alias, consts.GenCodesJoinLinkMap[join.LinkMode], in.In.DaoName, in.In.DaoName, gstr.CaseCamel(join.MasterField), join.DaoName, join.Alias, join.DaoName, gstr.CaseCamel(join.Field)))
|
|
}
|
|
}
|
|
|
|
selectBuffer.WriteString(fmt.Sprintf(LogicListJoinSelect, in.options.TemplateGroup, in.In.VarName, in.In.DaoName, joinSelectRows))
|
|
|
|
data["select"] = selectBuffer.String()
|
|
data["fields"] = "fields"
|
|
data["link"] = linkBuffer.String()
|
|
|
|
} else {
|
|
data["fields"] = fmt.Sprintf("%sin.%sListModel{}", in.options.TemplateGroup, in.In.VarName)
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
func (l *gCurd) generateLogicListWhere(ctx context.Context, in *CurdPreviewInput) string {
|
|
buffer := bytes.NewBuffer(nil)
|
|
|
|
// 主表
|
|
l.generateLogicListWhereEach(buffer, in.masterFields, in.In.DaoName, "")
|
|
|
|
// 关联表
|
|
if hasEffectiveJoins(in.options.Join) {
|
|
for _, v := range in.options.Join {
|
|
if isEffectiveJoin(v) {
|
|
l.generateLogicListWhereEach(buffer, v.Columns, v.DaoName, v.Alias)
|
|
}
|
|
}
|
|
}
|
|
|
|
return buffer.String()
|
|
}
|
|
|
|
func (l *gCurd) generateLogicListWhereEach(buffer *bytes.Buffer, fields []*sysin.GenCodesColumnListModel, daoName string, alias string) {
|
|
isLink := false
|
|
if alias != "" {
|
|
alias = `"` + alias + `."+`
|
|
isLink = true
|
|
}
|
|
for _, field := range fields {
|
|
if !field.IsQuery || field.QueryWhere == "" {
|
|
continue
|
|
}
|
|
|
|
var (
|
|
linkMode string
|
|
whereTag string
|
|
columnName string
|
|
)
|
|
|
|
if IsNumberType(field.GoType) {
|
|
linkMode = `in.` + field.GoName + ` > 0`
|
|
} else if field.GoType == GoTypeGTime {
|
|
linkMode = `in.` + field.GoName + ` != nil`
|
|
} else if field.GoType == GoTypeJson {
|
|
linkMode = `!in.` + field.GoName + `.IsNil()`
|
|
} else {
|
|
linkMode = `in.` + field.GoName + ` != ""`
|
|
}
|
|
|
|
if field.QueryWhere == WhereModeBetween || field.QueryWhere == WhereModeNotBetween {
|
|
linkMode = `len(in.` + field.GoName + `) == 2`
|
|
}
|
|
|
|
buffer.WriteString(fmt.Sprintf(LogicWhereComments, field.Dc))
|
|
|
|
// 如果是关联表重新转换字段
|
|
columnName = field.GoName
|
|
if isLink {
|
|
columnName = gstr.CaseCamel(field.Name)
|
|
}
|
|
|
|
switch field.QueryWhere {
|
|
case WhereModeEq:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.Where(" + alias + "dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeNeq:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereNot(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeGt:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereGT(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeGte:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereGTE(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeLt:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereLT(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeLte:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereLTE(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeIn:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereIn(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeNotIn:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereNotIn(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeBetween:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereBetween(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + "[0], in." + field.GoName + "[1])\n\t}"
|
|
case WhereModeNotBetween:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereNotBetween(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + "[0], in." + field.GoName + "[1])\n\t}"
|
|
case WhereModeLike:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereLike(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeLikeAll:
|
|
val := `"%"+in.` + field.GoName + `+"%"`
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereLike(dao." + daoName + ".Columns()." + columnName + ", " + val + ")\n\t}"
|
|
case WhereModeNotLike:
|
|
whereTag = "\tif " + linkMode + " {\n\t\tmod = mod.WhereNotLike(dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")\n\t}"
|
|
case WhereModeJsonContains:
|
|
val := "fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, dao." + daoName + ".Columns()." + columnName + ", in." + field.GoName + ")"
|
|
whereTag = "\tif in." + field.GoName + linkMode + " {\n\t\tmod = mod.Where(" + val + ")\n\t}"
|
|
|
|
default:
|
|
buffer.WriteString(fmt.Sprintf(LogicWhereNoSupport, field.QueryWhere))
|
|
}
|
|
|
|
buffer.WriteString(whereTag + "\n")
|
|
}
|
|
}
|