Menu.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. package controllers
  2. import (
  3. "ERP_user/Nats/NatsServer"
  4. "ERP_user/conf"
  5. "ERP_user/logs"
  6. "ERP_user/models/Account"
  7. "ERP_user/models/System"
  8. "encoding/json"
  9. "fmt"
  10. beego "github.com/beego/beego/v2/server/web"
  11. menulibs "gogs.baozhida.cn/zoie/ERP_libs/Menu"
  12. "gogs.baozhida.cn/zoie/ERP_libs/lib"
  13. )
  14. type MenuController struct {
  15. beego.Controller
  16. User Account.User
  17. }
  18. func (c *MenuController) Prepare() {
  19. c.User = *Account.User_r
  20. }
  21. // 列表 -
  22. func (c *MenuController) List() {
  23. T_code := c.GetString("T_code")
  24. sysName := Account.Get_Sys_Name(T_code)
  25. if sysName == T_code {
  26. // 不存在这个code
  27. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"}
  28. c.ServeJSON()
  29. return
  30. }
  31. var r_jsons lib.R_JSONS
  32. var menu []menulibs.Menu
  33. var err error
  34. switch T_code {
  35. case conf.ERP_ACCOUNT_Sys:
  36. menu, err = Account.Read_Menu_List()
  37. if err != nil {
  38. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取用户系统菜单失败!"}
  39. c.ServeJSON()
  40. return
  41. }
  42. default:
  43. menu, err = NatsServer.ERP_Read_Menu_List(T_code)
  44. if err != nil {
  45. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("获取%s菜单失败!", Account.Get_Sys_Name(T_code))}
  46. c.ServeJSON()
  47. return
  48. }
  49. }
  50. r_jsons.Data = menu
  51. c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + "ok!", Data: r_jsons}
  52. c.ServeJSON()
  53. }
  54. // 列表 -
  55. func (c *MenuController) User_List() {
  56. var r_jsons lib.R_JSONS
  57. var menuList []menulibs.Menu
  58. if r, is := Account.Redis_Menu_Get(c.User.T_power); is {
  59. r_jsons.Data = r
  60. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  61. c.ServeJSON()
  62. return
  63. }
  64. power, err := Account.Read_Power_ByT_id(c.User.T_power)
  65. if err != nil {
  66. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  67. c.ServeJSON()
  68. return
  69. }
  70. menu, err := Account.Read_User_Bind_Menu_List(power.T_menu)
  71. sysName := Account.Get_Sys_Name(conf.ERP_ACCOUNT_Sys)
  72. if err != nil {
  73. logs.Error(lib.FuncName(), Account.Get_Sys_Name(conf.ERP_ACCOUNT_Sys), err)
  74. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + "查询失败!"}
  75. c.ServeJSON()
  76. return
  77. }
  78. if len(menu) > 0 {
  79. menuList = append(menuList, menu...)
  80. }
  81. // 获取其他系统菜单
  82. for _, prefix := range Account.ERP_Sys_prefix {
  83. // Nats 发送失败 重试3次
  84. menu, err = NatsServer.ERP_Read_User_Bind_Menu_List(prefix, c.User.T_power)
  85. sysName = Account.Get_Sys_Name(prefix)
  86. if err != nil {
  87. logs.Error(lib.FuncName(), sysName, err)
  88. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + "查询失败!"}
  89. c.ServeJSON()
  90. return
  91. }
  92. if len(menu) > 0 {
  93. menuList = append(menuList, menu...)
  94. }
  95. }
  96. if len(menuList) == 0 {
  97. c.Data["json"] = lib.JSONS{Code: 202, Msg: "该用户暂无任务菜单权限!"}
  98. c.ServeJSON()
  99. return
  100. }
  101. r_jsons.Data = menuList
  102. Account.Redis_Munu_Set(c.User.T_power, menuList)
  103. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  104. c.ServeJSON()
  105. }
  106. // 获取单个菜单详情
  107. func (c *MenuController) Get() {
  108. id, _ := c.GetInt("id")
  109. if id < 1 {
  110. c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"}
  111. c.ServeJSON()
  112. return
  113. }
  114. T_code := c.GetString("T_code")
  115. if len(T_code) == 0 {
  116. T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统
  117. }
  118. sysName := Account.Get_Sys_Name(T_code)
  119. if sysName == T_code {
  120. // 不存在这个code
  121. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"}
  122. c.ServeJSON()
  123. return
  124. }
  125. var menu menulibs.Menu
  126. var apis []menulibs.API
  127. var err error
  128. // 根据T_code判断是本地系统还是其他系统
  129. if T_code == conf.ERP_ACCOUNT_Sys {
  130. menu, err = Account.Read_Menu_ById(id)
  131. if err != nil {
  132. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  133. c.ServeJSON()
  134. return
  135. }
  136. // 获取关联的API列表
  137. apis, err = Account.Read_API_List_ByMenuId(id)
  138. if err != nil {
  139. logs.Error(lib.FuncName(), "获取API列表失败:", err)
  140. }
  141. } else {
  142. // 其他系统,通过NATS调用
  143. menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id)
  144. if err != nil {
  145. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 查询失败!"}
  146. c.ServeJSON()
  147. return
  148. }
  149. // 注意:其他系统的API列表需要通过各自的系统获取,这里暂时不获取
  150. }
  151. type MenuWithAPIs struct {
  152. menulibs.Menu
  153. APIs []menulibs.API `json:"apis"`
  154. }
  155. menuWithAPIs := MenuWithAPIs{
  156. Menu: menu,
  157. APIs: apis,
  158. }
  159. var r_jsons lib.R_JSONS
  160. r_jsons.Data = menuWithAPIs
  161. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  162. c.ServeJSON()
  163. }
  164. // 添加菜单
  165. func (c *MenuController) Add() {
  166. T_name := c.GetString("T_name")
  167. T_mid, _ := c.GetInt("T_mid")
  168. T_permission := c.GetString("T_permission")
  169. T_icon := c.GetString("T_icon")
  170. T_uri := c.GetString("T_uri")
  171. T_type := c.GetString("T_type")
  172. T_code := c.GetString("T_code")
  173. T_sort, _ := c.GetInt("T_sort")
  174. T_apis := c.GetString("T_apis") // API JSON字符串
  175. if len(T_name) < 1 {
  176. c.Data["json"] = lib.JSONS{Code: 202, Msg: "菜单名称不能为空!"}
  177. c.ServeJSON()
  178. return
  179. }
  180. sysName := Account.Get_Sys_Name(T_code)
  181. if sysName == T_code {
  182. // 不存在这个code
  183. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"}
  184. c.ServeJSON()
  185. return
  186. }
  187. // 如果未指定类型,默认为菜单类型
  188. if len(T_type) == 0 {
  189. T_type = menulibs.MenuType
  190. }
  191. var_ := menulibs.Menu{
  192. T_mid: T_mid,
  193. T_name: T_name,
  194. T_permission: T_permission,
  195. T_icon: T_icon,
  196. T_uri: T_uri,
  197. T_type: T_type,
  198. T_sort: T_sort,
  199. T_State: 1,
  200. }
  201. var id int
  202. var err error
  203. // 根据T_code判断是本地系统还是其他系统
  204. if T_code == conf.ERP_ACCOUNT_Sys {
  205. // 本地系统,直接调用
  206. id, err = Account.Add_Menu(var_)
  207. if err != nil {
  208. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  209. c.ServeJSON()
  210. return
  211. }
  212. // 处理API JSON字符串
  213. if len(T_apis) > 0 {
  214. var apiList []struct {
  215. T_name string `json:"T_name"`
  216. T_uri string `json:"T_uri"`
  217. T_method string `json:"T_method"`
  218. }
  219. err = json.Unmarshal([]byte(T_apis), &apiList)
  220. if err != nil {
  221. logs.Error(lib.FuncName(), "解析API JSON失败:", err)
  222. c.Data["json"] = lib.JSONS{Code: 202, Msg: "API JSON格式错误!"}
  223. c.ServeJSON()
  224. return
  225. }
  226. // 批量添加API
  227. if len(apiList) > 0 {
  228. var apis []menulibs.API
  229. for _, api := range apiList {
  230. if len(api.T_method) == 0 {
  231. api.T_method = "POST"
  232. }
  233. apis = append(apis, menulibs.API{
  234. T_Menu_Id: id,
  235. T_name: api.T_name,
  236. T_uri: api.T_uri,
  237. T_method: api.T_method,
  238. T_enable: 1,
  239. })
  240. }
  241. _, err = Account.InsertMulti_API(apis)
  242. if err != nil {
  243. logs.Error(lib.FuncName(), "添加API失败:", err)
  244. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加API失败!"}
  245. c.ServeJSON()
  246. return
  247. }
  248. }
  249. }
  250. } else {
  251. // 其他系统,通过NATS调用
  252. id, err = NatsServer.ERP_Add_Menu(T_code, var_, T_apis)
  253. if err != nil {
  254. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 添加失败!"}
  255. c.ServeJSON()
  256. return
  257. }
  258. }
  259. // 清除所有权限的API缓存
  260. Account.Redis_API_DelAll()
  261. // 确保菜单缓存已清除(Add_Menu中已清除,这里再次确保)
  262. Account.Redis_Menu_DelAll()
  263. System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 新增", var_)
  264. c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id}
  265. c.ServeJSON()
  266. }
  267. // 修改菜单
  268. func (c *MenuController) Edit() {
  269. id, _ := c.GetInt("id")
  270. if id < 1 {
  271. c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"}
  272. c.ServeJSON()
  273. return
  274. }
  275. T_code := c.GetString("T_code")
  276. if len(T_code) == 0 {
  277. T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统
  278. }
  279. sysName := Account.Get_Sys_Name(T_code)
  280. if sysName == T_code {
  281. // 不存在这个code
  282. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"}
  283. c.ServeJSON()
  284. return
  285. }
  286. var menu menulibs.Menu
  287. var err error
  288. // 根据T_code判断是本地系统还是其他系统
  289. if T_code == conf.ERP_ACCOUNT_Sys {
  290. menu, err = Account.Read_Menu_ById(id)
  291. } else {
  292. menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id)
  293. }
  294. if err != nil {
  295. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  296. c.ServeJSON()
  297. return
  298. }
  299. var cols []string
  300. // 获取需要更新的字段
  301. // 检查参数是否存在(通过检查原始请求参数)
  302. input, _ := c.Input()
  303. if _, exists := input["T_mid"]; exists {
  304. if T_mid, err := c.GetInt("T_mid"); err == nil {
  305. menu.T_mid = T_mid
  306. cols = append(cols, "T_mid")
  307. }
  308. }
  309. if _, exists := input["T_name"]; exists {
  310. if T_name := c.GetString("T_name"); T_name != "" {
  311. menu.T_name = T_name
  312. cols = append(cols, "T_name")
  313. }
  314. }
  315. // T_permission, T_icon, T_uri 允许为空字符串,只要参数存在就更新
  316. if _, exists := input["T_permission"]; exists {
  317. menu.T_permission = c.GetString("T_permission")
  318. cols = append(cols, "T_permission")
  319. }
  320. if _, exists := input["T_icon"]; exists {
  321. menu.T_icon = c.GetString("T_icon")
  322. cols = append(cols, "T_icon")
  323. }
  324. if _, exists := input["T_uri"]; exists {
  325. menu.T_uri = c.GetString("T_uri")
  326. cols = append(cols, "T_uri")
  327. }
  328. if _, exists := input["T_type"]; exists {
  329. if T_type := c.GetString("T_type"); T_type != "" {
  330. menu.T_type = T_type
  331. cols = append(cols, "T_type")
  332. }
  333. }
  334. if _, exists := input["T_sort"]; exists {
  335. if T_sort, err := c.GetInt("T_sort"); err == nil {
  336. menu.T_sort = T_sort
  337. cols = append(cols, "T_sort")
  338. }
  339. }
  340. if _, exists := input["T_State"]; exists {
  341. if T_State, err := c.GetInt("T_State"); err == nil && T_State >= 0 {
  342. menu.T_State = T_State
  343. cols = append(cols, "T_State")
  344. }
  345. }
  346. // 处理API JSON字符串
  347. T_apis := c.GetString("T_apis")
  348. if len(cols) == 0 && len(T_apis) == 0 {
  349. c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有需要更新的字段!"}
  350. c.ServeJSON()
  351. return
  352. }
  353. // 根据T_code判断是本地系统还是其他系统
  354. if T_code == conf.ERP_ACCOUNT_Sys {
  355. // 本地系统,直接调用
  356. // 处理API JSON字符串
  357. if _, exists := input["T_apis"]; exists {
  358. // 先删除旧的API(软删除)
  359. _, err = Account.Delete_API_ByMenuId(id)
  360. if err != nil {
  361. logs.Error(lib.FuncName(), "删除旧API失败:", err)
  362. }
  363. // 如果有新的API,则添加
  364. if len(T_apis) > 0 {
  365. var apiList []struct {
  366. T_name string `json:"T_name"`
  367. T_uri string `json:"T_uri"`
  368. T_method string `json:"T_method"`
  369. }
  370. err = json.Unmarshal([]byte(T_apis), &apiList)
  371. if err != nil {
  372. logs.Error(lib.FuncName(), "解析API JSON失败:", err)
  373. c.Data["json"] = lib.JSONS{Code: 202, Msg: "API JSON格式错误!"}
  374. c.ServeJSON()
  375. return
  376. }
  377. // 批量添加API
  378. if len(apiList) > 0 {
  379. var apis []menulibs.API
  380. for _, api := range apiList {
  381. if len(api.T_method) == 0 {
  382. api.T_method = "POST"
  383. }
  384. apis = append(apis, menulibs.API{
  385. T_Menu_Id: id,
  386. T_name: api.T_name,
  387. T_uri: api.T_uri,
  388. T_method: api.T_method,
  389. T_enable: 1,
  390. })
  391. }
  392. _, err = Account.InsertMulti_API(apis)
  393. if err != nil {
  394. logs.Error(lib.FuncName(), "添加API失败:", err)
  395. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加API失败!"}
  396. c.ServeJSON()
  397. return
  398. }
  399. }
  400. }
  401. }
  402. // 如果有菜单字段需要更新,则更新菜单
  403. if len(cols) > 0 {
  404. _, err = Account.Update_Menu(menu, cols...)
  405. if err != nil {
  406. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  407. c.ServeJSON()
  408. return
  409. }
  410. }
  411. } else {
  412. // 其他系统,通过NATS调用
  413. _, err = NatsServer.ERP_Update_Menu(T_code, menu, cols, T_apis)
  414. if err != nil {
  415. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 修改失败!"}
  416. c.ServeJSON()
  417. return
  418. }
  419. }
  420. Account.Redis_Menu_DelAll()
  421. Account.Redis_API_DelAll()
  422. System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 修改", menu)
  423. c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id}
  424. c.ServeJSON()
  425. }
  426. // 删除菜单(软删除)
  427. func (c *MenuController) Del() {
  428. id, _ := c.GetInt("id")
  429. if id < 1 {
  430. c.Data["json"] = lib.JSONS{Code: 202, Msg: "id Err!"}
  431. c.ServeJSON()
  432. return
  433. }
  434. T_code := c.GetString("T_code")
  435. if len(T_code) == 0 {
  436. T_code = conf.ERP_ACCOUNT_Sys // 默认本地系统
  437. }
  438. sysName := Account.Get_Sys_Name(T_code)
  439. if sysName == T_code {
  440. // 不存在这个code
  441. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_code Err!"}
  442. c.ServeJSON()
  443. return
  444. }
  445. var menu menulibs.Menu
  446. var err error
  447. // 根据T_code判断是本地系统还是其他系统
  448. if T_code == conf.ERP_ACCOUNT_Sys {
  449. menu, err = Account.Read_Menu_ById(id)
  450. if err != nil {
  451. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  452. c.ServeJSON()
  453. return
  454. }
  455. _, err = Account.Delete_Menu(menu)
  456. if err != nil {
  457. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  458. c.ServeJSON()
  459. return
  460. }
  461. } else {
  462. // 其他系统,先获取菜单,然后删除
  463. menu, err = NatsServer.ERP_Read_Menu_ById(T_code, id)
  464. if err != nil {
  465. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  466. c.ServeJSON()
  467. return
  468. }
  469. _, err = NatsServer.ERP_Delete_Menu(T_code, menu)
  470. if err != nil {
  471. c.Data["json"] = lib.JSONS{Code: 202, Msg: sysName + " 删除失败!"}
  472. c.ServeJSON()
  473. return
  474. }
  475. }
  476. Account.Redis_Menu_DelAll()
  477. Account.Redis_API_DelAll()
  478. System.Add_UserLogs_T(c.User.T_uuid, "菜单", sysName+" 删除", menu)
  479. c.Data["json"] = lib.JSONS{Code: 200, Msg: sysName + " ok!", Data: id}
  480. c.ServeJSON()
  481. }