package controllers import ( "ERP_user/Nats/NatsServer" "ERP_user/conf" "ERP_user/logs" "ERP_user/models/Account" "ERP_user/models/System" "encoding/json" "fmt" beego "github.com/beego/beego/v2/server/web" menulibs "gogs.baozhida.cn/zoie/ERP_libs/Menu" "gogs.baozhida.cn/zoie/ERP_libs/lib" ) type MenuController struct { beego.Controller User Account.User } func (c *MenuController) Prepare() { c.User = *Account.User_r } // 列表 - func (c *MenuController) List() { T_code := c.GetString("T_code") sysName := Account.Get_Sys_Name(T_code) if sysName == T_code { // 不存在这个code c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"} c.ServeJSON() return } var r_jsons lib.R_JSONS var menu []menulibs.Menu var err error switch T_code { case conf.ERP_ACCOUNT_Sys: menu, err = Account.Read_Menu_List() if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取用户系统菜单失败!"} c.ServeJSON() return } default: menu, err = NatsServer.ERP_Read_Menu_List(T_code) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("获取%s菜单失败!", Account.Get_Sys_Name(T_code))} c.ServeJSON() return } } r_jsons.Data = menu c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + "ok!", Data: r_jsons} c.ServeJSON() } // 列表 - func (c *MenuController) User_List() { var r_jsons lib.R_JSONS var menuList []menulibs.Menu if r, is := Account.Redis_Menu_Get(c.User.T_power); is { r_jsons.Data = r c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons} c.ServeJSON() return } power, err := Account.Read_Power_ByT_id(c.User.T_power) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"} c.ServeJSON() return } menu, err := Account.Read_User_Bind_Menu_List(power.T_menu) sysName := Account.Get_Sys_Name(conf.ERP_ACCOUNT_Sys) if err != nil { logs.Error(lib.FuncName(), Account.Get_Sys_Name(conf.ERP_ACCOUNT_Sys), err) c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + "查询失败!"} c.ServeJSON() return } if len(menu) > 0 { menuList = append(menuList, menu...) } // 获取其他系统菜单 for _, prefix := range Account.ERP_Sys_prefix { // Nats 发送失败 重试3次 menu, err = NatsServer.ERP_Read_User_Bind_Menu_List(prefix, c.User.T_power) sysName = Account.Get_Sys_Name(prefix) if err != nil { logs.Error(lib.FuncName(), sysName, err) c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + "查询失败!"} c.ServeJSON() return } if len(menu) > 0 { menuList = append(menuList, menu...) } } if len(menuList) == 0 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "该用户暂无任务菜单权限!"} c.ServeJSON() return } r_jsons.Data = menuList Account.Redis_Munu_Set(c.User.T_power, menuList) c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons} c.ServeJSON() } // 获取单个菜单详情 func (c *MenuController) Get() { id, _ := c.GetInt("id") if id < 1 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"} c.ServeJSON() return } T_code := c.GetString("T_code") if len(T_code) == 0 { T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统 } sysName := Account.Get_Sys_Name(T_code) if sysName == T_code { // 不存在这个code c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"} c.ServeJSON() return } var menu menulibs.Menu var apis []menulibs.API var err error // 根据T_code判断是本地系统还是其他系统 if T_code == conf.ERP_ACCOUNT_Sys { menu, err = Account.Read_Menu_ById(id) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"} c.ServeJSON() return } // 获取关联的API列表 apis, err = Account.Read_API_List_ByMenuId(id) if err != nil { logs.Error(lib.FuncName(), "获取API列表失败:", err) } } else { // 其他系统,通过NATS调用 menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 查询失败!"} c.ServeJSON() return } // 注意:其他系统的API列表需要通过各自的系统获取,这里暂时不获取 } type MenuWithAPIs struct { menulibs.Menu APIs []menulibs.API `json:"apis"` } menuWithAPIs := MenuWithAPIs{ Menu: menu, APIs: apis, } var r_jsons lib.R_JSONS r_jsons.Data = menuWithAPIs c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons} c.ServeJSON() } // 添加菜单 func (c *MenuController) Add() { T_name := c.GetString("T_name") T_mid, _ := c.GetInt("T_mid") T_permission := c.GetString("T_permission") T_icon := c.GetString("T_icon") T_uri := c.GetString("T_uri") T_type := c.GetString("T_type") T_code := c.GetString("T_code") T_sort, _ := c.GetInt("T_sort") T_apis := c.GetString("T_apis") // API JSON字符串 if len(T_name) < 1 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "菜单名称不能为空!"} c.ServeJSON() return } sysName := Account.Get_Sys_Name(T_code) if sysName == T_code { // 不存在这个code c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"} c.ServeJSON() return } // 如果未指定类型,默认为菜单类型 if len(T_type) == 0 { T_type = menulibs.MenuType } var_ := menulibs.Menu{ T_mid: T_mid, T_name: T_name, T_permission: T_permission, T_icon: T_icon, T_uri: T_uri, T_type: T_type, T_sort: T_sort, T_State: 1, } var id int var err error // 根据T_code判断是本地系统还是其他系统 if T_code == conf.ERP_ACCOUNT_Sys { // 本地系统,直接调用 id, err = Account.Add_Menu(var_) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"} c.ServeJSON() return } // 处理API JSON字符串 if len(T_apis) > 0 { var apiList []struct { T_name string `json:"T_name"` T_uri string `json:"T_uri"` T_method string `json:"T_method"` } err = json.Unmarshal([]byte(T_apis), &apiList) if err != nil { logs.Error(lib.FuncName(), "解析API JSON失败:", err) c.Data["json"] = lib.JSONS{Code: 202, Msg: "API JSON格式错误!"} c.ServeJSON() return } // 批量添加API if len(apiList) > 0 { var apis []menulibs.API for _, api := range apiList { if len(api.T_method) == 0 { api.T_method = "POST" } apis = append(apis, menulibs.API{ T_Menu_Id: id, T_name: api.T_name, T_uri: api.T_uri, T_method: api.T_method, T_enable: 1, }) } _, err = Account.InsertMulti_API(apis) if err != nil { logs.Error(lib.FuncName(), "添加API失败:", err) c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加API失败!"} c.ServeJSON() return } } } } else { // 其他系统,通过NATS调用 id, err = NatsServer.ERP_Add_Menu(T_code, var_, T_apis) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 添加失败!"} c.ServeJSON() return } } // 清除所有权限的API缓存 Account.Redis_API_DelAll() // 确保菜单缓存已清除(Add_Menu中已清除,这里再次确保) Account.Redis_Menu_DelAll() System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 新增", var_) c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id} c.ServeJSON() } // 修改菜单 func (c *MenuController) Edit() { id, _ := c.GetInt("id") if id < 1 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"} c.ServeJSON() return } T_code := c.GetString("T_code") if len(T_code) == 0 { T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统 } sysName := Account.Get_Sys_Name(T_code) if sysName == T_code { // 不存在这个code c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"} c.ServeJSON() return } var menu menulibs.Menu var err error // 根据T_code判断是本地系统还是其他系统 if T_code == conf.ERP_ACCOUNT_Sys { menu, err = Account.Read_Menu_ById(id) } else { menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id) } if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"} c.ServeJSON() return } var cols []string // 获取需要更新的字段 // 检查参数是否存在(通过检查原始请求参数) input, _ := c.Input() if _, exists := input["T_mid"]; exists { if T_mid, err := c.GetInt("T_mid"); err == nil { menu.T_mid = T_mid cols = append(cols, "T_mid") } } if _, exists := input["T_name"]; exists { if T_name := c.GetString("T_name"); T_name != "" { menu.T_name = T_name cols = append(cols, "T_name") } } // T_permission, T_icon, T_uri 允许为空字符串,只要参数存在就更新 if _, exists := input["T_permission"]; exists { menu.T_permission = c.GetString("T_permission") cols = append(cols, "T_permission") } if _, exists := input["T_icon"]; exists { menu.T_icon = c.GetString("T_icon") cols = append(cols, "T_icon") } if _, exists := input["T_uri"]; exists { menu.T_uri = c.GetString("T_uri") cols = append(cols, "T_uri") } if _, exists := input["T_type"]; exists { if T_type := c.GetString("T_type"); T_type != "" { menu.T_type = T_type cols = append(cols, "T_type") } } if _, exists := input["T_sort"]; exists { if T_sort, err := c.GetInt("T_sort"); err == nil { menu.T_sort = T_sort cols = append(cols, "T_sort") } } if _, exists := input["T_State"]; exists { if T_State, err := c.GetInt("T_State"); err == nil && T_State >= 0 { menu.T_State = T_State cols = append(cols, "T_State") } } // 处理API JSON字符串 T_apis := c.GetString("T_apis") if len(cols) == 0 && len(T_apis) == 0 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有需要更新的字段!"} c.ServeJSON() return } // 根据T_code判断是本地系统还是其他系统 if T_code == conf.ERP_ACCOUNT_Sys { // 本地系统,直接调用 // 处理API JSON字符串 if _, exists := input["T_apis"]; exists { // 先删除旧的API(软删除) _, err = Account.Delete_API_ByMenuId(id) if err != nil { logs.Error(lib.FuncName(), "删除旧API失败:", err) } // 如果有新的API,则添加 if len(T_apis) > 0 { var apiList []struct { T_name string `json:"T_name"` T_uri string `json:"T_uri"` T_method string `json:"T_method"` } err = json.Unmarshal([]byte(T_apis), &apiList) if err != nil { logs.Error(lib.FuncName(), "解析API JSON失败:", err) c.Data["json"] = lib.JSONS{Code: 202, Msg: "API JSON格式错误!"} c.ServeJSON() return } // 批量添加API if len(apiList) > 0 { var apis []menulibs.API for _, api := range apiList { if len(api.T_method) == 0 { api.T_method = "POST" } apis = append(apis, menulibs.API{ T_Menu_Id: id, T_name: api.T_name, T_uri: api.T_uri, T_method: api.T_method, T_enable: 1, }) } _, err = Account.InsertMulti_API(apis) if err != nil { logs.Error(lib.FuncName(), "添加API失败:", err) c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加API失败!"} c.ServeJSON() return } } } } // 如果有菜单字段需要更新,则更新菜单 if len(cols) > 0 { _, err = Account.Update_Menu(menu, cols...) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} c.ServeJSON() return } } } else { // 其他系统,通过NATS调用 _, err = NatsServer.ERP_Update_Menu(T_code, menu, cols, T_apis) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 修改失败!"} c.ServeJSON() return } } Account.Redis_Menu_DelAll() Account.Redis_API_DelAll() System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 修改", menu) c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id} c.ServeJSON() } // 删除菜单(软删除) func (c *MenuController) Del() { id, _ := c.GetInt("id") if id < 1 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"} c.ServeJSON() return } T_code := c.GetString("T_code") if len(T_code) == 0 { T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统 } sysName := Account.Get_Sys_Name(T_code) if sysName == T_code { // 不存在这个code c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"} c.ServeJSON() return } var menu menulibs.Menu var err error // 根据T_code判断是本地系统还是其他系统 if T_code == conf.ERP_ACCOUNT_Sys { menu, err = Account.Read_Menu_ById(id) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"} c.ServeJSON() return } _, err = Account.Delete_Menu(menu) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"} c.ServeJSON() return } } else { // 其他系统,先获取菜单,然后删除 menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"} c.ServeJSON() return } _, err = NatsServer.ERP_Delete_Menu(T_code, menu) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 删除失败!"} c.ServeJSON() return } } Account.Redis_Menu_DelAll() Account.Redis_API_DelAll() System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 删除", menu) c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id} c.ServeJSON() }