diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index 901b7449..f02b2b4f 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -19,12 +19,12 @@ INSERT INTO "sys_i18n" VALUES (3, 'menu.system', '系统', 'System'); INSERT INTO "sys_i18n" VALUES (4, 'menu.monitor', '监控', 'Monitor'); INSERT INTO "sys_i18n" VALUES (5, 'menu.tools', '工具', 'Tools'); INSERT INTO "sys_i18n" VALUES (6, 'menu.ne', '网元', 'NE'); -INSERT INTO "sys_i18n" VALUES (7, 'menu.ueUser', '终端', 'UE'); +INSERT INTO "sys_i18n" VALUES (7, 'menu.ue', '终端', 'UE'); INSERT INTO "sys_i18n" VALUES (8, 'menu.systemRemark', '系统管理目录', 'System Management Catalog'); INSERT INTO "sys_i18n" VALUES (9, 'menu.monitorRemark', '系统监控目录', 'System Monitor Catalog'); INSERT INTO "sys_i18n" VALUES (10, 'menu.toolsRemark', '系统工具目录', 'System Tools Catalog'); INSERT INTO "sys_i18n" VALUES (11, 'menu.neRemark', '网元配置管理目录', 'NE Configuration Management Catalog'); -INSERT INTO "sys_i18n" VALUES (12, 'menu.ueUserRemark', '网元终端信息目录', 'Network Element Terminal Information Catalog'); +INSERT INTO "sys_i18n" VALUES (12, 'menu.ueRemark', '网元终端信息目录', 'Network Element Terminal Information Catalog'); INSERT INTO "sys_i18n" VALUES (13, 'menu.security.user', '用户管理', 'User Management'); INSERT INTO "sys_i18n" VALUES (14, 'menu.security.role', '角色管理', 'Role Management'); INSERT INTO "sys_i18n" VALUES (15, 'menu.security.roleUser', '分配角色', 'Assigning Roles'); @@ -73,13 +73,13 @@ INSERT INTO "sys_i18n" VALUES (57, 'menu.common.resetPwd', '重置密码', 'Rese INSERT INTO "sys_i18n" VALUES (58, 'menu.common.unlock', '账户解锁', 'Account Unlock'); INSERT INTO "sys_i18n" VALUES (59, 'menu.forcedQuit.batch ', '批量强退', 'Batch Undo'); INSERT INTO "sys_i18n" VALUES (60, 'menu.forcedQuit.single', '单条强退', 'Individual Forced Retirement'); -INSERT INTO "sys_i18n" VALUES (61, 'menu.ueUser.authUDM', 'UDM鉴权用户', 'UDM Authentication'); -INSERT INTO "sys_i18n" VALUES (62, 'menu.ueUser.subUDM', 'UDM签约用户', 'UDM Subscribers'); -INSERT INTO "sys_i18n" VALUES (63, 'menu.ueUser.authUDMRemark', 'UDM鉴权用户菜单', 'UDM Authentication Menu'); -INSERT INTO "sys_i18n" VALUES (64, 'menu.ueUser.subUDMRemark', 'UDM签约用户菜单', 'UDM Subscriber Menu'); -INSERT INTO "sys_i18n" VALUES (65, 'menu.ueUser.onlineIMS', 'IMS在线用户', 'IMS Online Users'); -INSERT INTO "sys_i18n" VALUES (66, 'menu.ueUser.onlineUE', 'UE在线信息', 'UE Online Information'); -INSERT INTO "sys_i18n" VALUES (67, 'menu.ueUser.base5G', '基站信息', 'Radio Information'); +INSERT INTO "sys_i18n" VALUES (61, 'menu.neData.udmAuth', 'UDM鉴权用户', 'UDM Authentication'); +INSERT INTO "sys_i18n" VALUES (62, 'menu.neData.udmSub', 'UDM签约用户', 'UDM Subscribers'); +INSERT INTO "sys_i18n" VALUES (63, 'menu.neData.udmVOIP', 'VOIP鉴权用户', 'VOIP Authentication'); +INSERT INTO "sys_i18n" VALUES (64, 'menu.neData.udmVolte', 'IMS签约用户', 'IMS Subscribers'); +INSERT INTO "sys_i18n" VALUES (65, 'menu.neData.imsSub', 'IMS在线用户', 'IMS Online Users'); +INSERT INTO "sys_i18n" VALUES (66, 'menu.neData.smfSub', 'UE在线信息', 'UE Online Information'); +INSERT INTO "sys_i18n" VALUES (67, 'menu.neData.baseOnline', '基站在线', 'Radio Online'); INSERT INTO "sys_i18n" VALUES (68, 'menu.trace', '跟踪', 'Trace'); INSERT INTO "sys_i18n" VALUES (69, 'menu.trace.task', '网元跟踪任务', 'NE Trace Task'); INSERT INTO "sys_i18n" VALUES (70, 'menu.trace.taskData', '网元跟踪任务数据', 'NE Trace Task Data'); @@ -87,9 +87,6 @@ INSERT INTO "sys_i18n" VALUES (71, 'menu.trace.pcap', '信令抓包', 'Signaling INSERT INTO "sys_i18n" VALUES (72, 'menu.fault', '监控', 'Monitor'); INSERT INTO "sys_i18n" VALUES (73, 'config.neData.exportTableFTP', '网元数据导出备份文件FTP服务', 'NeData Backup file FTP service'); INSERT INTO "sys_i18n" VALUES (74, 'config.neData.exportTableFTPRemark', '请通过网元数据导出列表页面进行设置FTP信息', 'Please set the FTP information through the export list page.'); -INSERT INTO "sys_i18n" VALUES (75, 'menu.ueUser.onlineIMSRemark', 'IMS在线用户菜单', 'IMS Online User Menu'); -INSERT INTO "sys_i18n" VALUES (76, 'menu.ueUser.onlineUERemark', 'UE在线信息菜单', 'UE Online Information Menu'); -INSERT INTO "sys_i18n" VALUES (77, 'menu.ueUser.base5GRemark', '5G基站信息菜单', '5G Base Station Information Menu'); INSERT INTO "sys_i18n" VALUES (78, 'menu.traceRemark', '跟踪管理目录', 'Tracking Management Menu'); INSERT INTO "sys_i18n" VALUES (79, 'menu.trace.taskRemark', '跟踪任务菜单', 'Tracking Task Menu'); INSERT INTO "sys_i18n" VALUES (80, 'config.sys.user.fristPasswdChange', '用户管理-首次登录密码修改', 'User Management-First Login Password Change'); @@ -503,7 +500,7 @@ INSERT INTO "sys_i18n" VALUES (479, 'config.sys.helpDocRemark', '静态文件目 INSERT INTO "sys_i18n" VALUES (480, 'log.operate.title.neAction', '网元处理', 'Network Element Processing'); INSERT INTO "sys_i18n" VALUES (481, 'log.operate.title.helpDoc', '系统使用文档', 'System Usage Documentation'); INSERT INTO "sys_i18n" VALUES (482, 'menu.ueUser.n3iwf', 'N3IWF在线用户', 'N3IWF Online User'); -INSERT INTO "sys_i18n" VALUES (483, 'menu.ueUser.pcf', '用户策略控制信息', 'User PCC Information'); +INSERT INTO "sys_i18n" VALUES (483, 'menu.neData.pcfSub', '用户策略控制信息', 'User PCC Information'); INSERT INTO "sys_i18n" VALUES (484, 'menu.system.user.editRole', '修改用户角色', 'Modifying User Role'); INSERT INTO "sys_i18n" VALUES (485, 'config.sys.i18nOpen', '国际化切换', 'Internationalization Switching'); INSERT INTO "sys_i18n" VALUES (486, 'config.sys.i18nDefault', '国际化默认语言', 'Internationalization Default Language'); diff --git a/build/database/lite/install/sys_menu.sql b/build/database/lite/install/sys_menu.sql index 6d8897db..668db3ec 100644 --- a/build/database/lite/install/sys_menu.sql +++ b/build/database/lite/install/sys_menu.sql @@ -29,8 +29,8 @@ CREATE TABLE "sys_menu" ( -- Records of sys_menu -- ---------------------------- INSERT INTO "sys_menu" VALUES (1, 'menu.system', 0, 16, 'system', '', '1', '1', 'D', '1', '1', '', 'icon-xiangmu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.systemRemark'); -INSERT INTO "sys_menu" VALUES (4, 'menu.ne', 0, 3, 'configManage', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.configRemark'); -INSERT INTO "sys_menu" VALUES (5, 'menu.ueUser', 0, 7, 'neUser', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUserRemark'); +INSERT INTO "sys_menu" VALUES (4, 'menu.ne', 0, 3, 'ne', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.configRemark'); +INSERT INTO "sys_menu" VALUES (5, 'menu.ue', 0, 7, 'ue', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueRemark'); INSERT INTO "sys_menu" VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.toolsRemark'); INSERT INTO "sys_menu" VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.tools.helpRemark'); @@ -109,11 +109,18 @@ INSERT INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); -INSERT INTO "sys_menu" VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUser.authUDMRemark'); -INSERT INTO "sys_menu" VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUser.subUDMRemark'); -INSERT INTO "sys_menu" VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUser.onlineIMSRemark'); -INSERT INTO "sys_menu" VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUser.onlineUERemark'); -INSERT INTO "sys_menu" VALUES (2082, 'menu.ueUser.base5G', 5, 7, 'base5G', 'neUser/base5G/index', '1', '0', 'M', '0', '1', 'neUser:base5G:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueUser.base5GRemark'); +INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm:voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm:volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme:base-online:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf:sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.traceRemark'); INSERT INTO "sys_menu" VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark'); INSERT INTO "sys_menu" VALUES (2085, 'menu.trace.taskData', 2083, 4, 'task/inline/data', 'traceManage/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, ''); @@ -125,7 +132,6 @@ INSERT INTO "sys_menu" VALUES (2091, 'menu.log.mml', 2089, 30, 'mml', 'logManage INSERT INTO "sys_menu" VALUES (2092, 'menu.log.alarm', 2089, 40, 'alarm-log', 'logManage/alarm/index', '1', '0', 'M', '1', '1', 'logManage:alarm:index', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.alarmRemark'); INSERT INTO "sys_menu" VALUES (2094, 'menu.log.forwarding', 2089, 41, 'forwarding', 'logManage/forwarding/index', '1', '0', 'M', '1', '1', 'logManage:forwarding:index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.forwardingRemark'); INSERT INTO "sys_menu" VALUES (2095, 'menu.log.set', 2089, 45, 'logSet', 'logManage/logSet/index', '1', '0', 'M', '0', '0', 'logManage:logSet:index', 'icon-you', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.log.setRemark'); -INSERT INTO "sys_menu" VALUES (2096, 'menu.neData.baseStation', 5, 12, 'base-station', 'ne-data/base-station/index', '1', '0', 'M', '1', '1', 'ne-data:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2097, 'menu.fault.history', 2129, 2, 'history-alarm', 'faultManage/history-alarm/index', '1', '1', 'M', '1', '1', 'faultManage/history-alarm/index', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.fault.historyRemark'); INSERT INTO "sys_menu" VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '0', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.fault.setRemark'); INSERT INTO "sys_menu" VALUES (2099, 'menu.perf', 0, 5, 'perfManage', '', '1', '0', 'D', '1', '1', '', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.perfRemark'); @@ -148,13 +154,9 @@ INSERT INTO "sys_menu" VALUES (2115, 'menu.system.systemResource', 1, 6, 'monito INSERT INTO "sys_menu" VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); -INSERT INTO "sys_menu" VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); -INSERT INTO "sys_menu" VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.setting.i18nRemark'); INSERT INTO "sys_menu" VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'logManage/neFile/index', '1', '0', 'M', '1', '1', 'logManage:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588, 'system', 1728641403588, ''); -INSERT INTO "sys_menu" VALUES (2124, 'menu.neUser.nssf', 5, 10, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, ''); -INSERT INTO "sys_menu" VALUES (2125, 'menu.neUser.nssfAmf', 5, 11, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2126, 'menu.monitor.topology', 2130, 10, 'topology', 'monitor/topology/index', '1', '0', 'M', '1', '1', 'monitor:topology:index', 'icon-fangda', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2127, 'menu.monitor.topologyBuild', 2130, 30, 'topologyBuild', 'monitor/topologyBuild/index', '1', '0', 'M', '1', '1', 'monitor:topologyBuild:index', 'icon-fangda', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2128, 'menu.monitor.topologyArchitecture', 2130, 20, 'topologyArchitecture', 'monitor/topologyArchitecture/index', '1', '0', 'M', '1', '1', 'monitor:topologyArchitecture:index', 'icon-soutubiao', '0', 'system', 1728641403588, 'system', 1728641403588, ''); diff --git a/build/database/lite/install/sys_role_menu.sql b/build/database/lite/install/sys_role_menu.sql index 10c3f33e..a23c5721 100644 --- a/build/database/lite/install/sys_role_menu.sql +++ b/build/database/lite/install/sys_role_menu.sql @@ -60,9 +60,7 @@ INSERT INTO "sys_role_menu" VALUES (2, 1022); INSERT INTO "sys_role_menu" VALUES (2, 1023); INSERT INTO "sys_role_menu" VALUES (2, 1024); INSERT INTO "sys_role_menu" VALUES (2, 1030); -INSERT INTO "sys_role_menu" VALUES (2, 1031); INSERT INTO "sys_role_menu" VALUES (2, 1032); -INSERT INTO "sys_role_menu" VALUES (2, 1033); INSERT INTO "sys_role_menu" VALUES (2, 1034); INSERT INTO "sys_role_menu" VALUES (2, 1039); INSERT INTO "sys_role_menu" VALUES (2, 1040); @@ -80,11 +78,15 @@ INSERT INTO "sys_role_menu" VALUES (2, 1053); INSERT INTO "sys_role_menu" VALUES (2, 1054); INSERT INTO "sys_role_menu" VALUES (2, 1055); INSERT INTO "sys_role_menu" VALUES (2, 1056); +INSERT INTO "sys_role_menu" VALUES (2, 2000); +INSERT INTO "sys_role_menu" VALUES (2, 2001); +INSERT INTO "sys_role_menu" VALUES (2, 2002); +INSERT INTO "sys_role_menu" VALUES (2, 2003); +INSERT INTO "sys_role_menu" VALUES (2, 2004); +INSERT INTO "sys_role_menu" VALUES (2, 2005); +INSERT INTO "sys_role_menu" VALUES (2, 2007); INSERT INTO "sys_role_menu" VALUES (2, 2009); INSERT INTO "sys_role_menu" VALUES (2, 2010); -INSERT INTO "sys_role_menu" VALUES (2, 2080); -INSERT INTO "sys_role_menu" VALUES (2, 2081); -INSERT INTO "sys_role_menu" VALUES (2, 2082); INSERT INTO "sys_role_menu" VALUES (2, 2083); INSERT INTO "sys_role_menu" VALUES (2, 2084); INSERT INTO "sys_role_menu" VALUES (2, 2086); @@ -94,9 +96,7 @@ INSERT INTO "sys_role_menu" VALUES (2, 2089); INSERT INTO "sys_role_menu" VALUES (2, 2091); INSERT INTO "sys_role_menu" VALUES (2, 2092); INSERT INTO "sys_role_menu" VALUES (2, 2094); -INSERT INTO "sys_role_menu" VALUES (2, 2096); INSERT INTO "sys_role_menu" VALUES (2, 2097); -INSERT INTO "sys_role_menu" VALUES (2, 2098); INSERT INTO "sys_role_menu" VALUES (2, 2099); INSERT INTO "sys_role_menu" VALUES (2, 2100); INSERT INTO "sys_role_menu" VALUES (2, 2101); @@ -107,7 +107,6 @@ INSERT INTO "sys_role_menu" VALUES (2, 2105); INSERT INTO "sys_role_menu" VALUES (2, 2107); INSERT INTO "sys_role_menu" VALUES (2, 2108); INSERT INTO "sys_role_menu" VALUES (2, 2109); -INSERT INTO "sys_role_menu" VALUES (2, 2111); INSERT INTO "sys_role_menu" VALUES (2, 2112); INSERT INTO "sys_role_menu" VALUES (2, 2113); INSERT INTO "sys_role_menu" VALUES (2, 2114); @@ -115,13 +114,9 @@ INSERT INTO "sys_role_menu" VALUES (2, 2115); INSERT INTO "sys_role_menu" VALUES (2, 2116); INSERT INTO "sys_role_menu" VALUES (2, 2117); INSERT INTO "sys_role_menu" VALUES (2, 2118); -INSERT INTO "sys_role_menu" VALUES (2, 2119); -INSERT INTO "sys_role_menu" VALUES (2, 2120); INSERT INTO "sys_role_menu" VALUES (2, 2121); INSERT INTO "sys_role_menu" VALUES (2, 2122); INSERT INTO "sys_role_menu" VALUES (2, 2123); -INSERT INTO "sys_role_menu" VALUES (2, 2124); -INSERT INTO "sys_role_menu" VALUES (2, 2125); INSERT INTO "sys_role_menu" VALUES (2, 2126); INSERT INTO "sys_role_menu" VALUES (2, 2128); INSERT INTO "sys_role_menu" VALUES (2, 2129); @@ -172,17 +167,20 @@ INSERT INTO "sys_role_menu" VALUES (3, 115); INSERT INTO "sys_role_menu" VALUES (3, 500); INSERT INTO "sys_role_menu" VALUES (3, 501); INSERT INTO "sys_role_menu" VALUES (3, 1030); -INSERT INTO "sys_role_menu" VALUES (3, 1031); INSERT INTO "sys_role_menu" VALUES (3, 1032); INSERT INTO "sys_role_menu" VALUES (3, 1034); INSERT INTO "sys_role_menu" VALUES (3, 1039); INSERT INTO "sys_role_menu" VALUES (3, 1042); INSERT INTO "sys_role_menu" VALUES (3, 1048); +INSERT INTO "sys_role_menu" VALUES (3, 2000); +INSERT INTO "sys_role_menu" VALUES (3, 2001); +INSERT INTO "sys_role_menu" VALUES (3, 2002); +INSERT INTO "sys_role_menu" VALUES (3, 2003); +INSERT INTO "sys_role_menu" VALUES (3, 2004); +INSERT INTO "sys_role_menu" VALUES (3, 2005); +INSERT INTO "sys_role_menu" VALUES (3, 2007); INSERT INTO "sys_role_menu" VALUES (3, 2009); INSERT INTO "sys_role_menu" VALUES (3, 2010); -INSERT INTO "sys_role_menu" VALUES (3, 2080); -INSERT INTO "sys_role_menu" VALUES (3, 2081); -INSERT INTO "sys_role_menu" VALUES (3, 2082); INSERT INTO "sys_role_menu" VALUES (3, 2083); INSERT INTO "sys_role_menu" VALUES (3, 2086); INSERT INTO "sys_role_menu" VALUES (3, 2087); @@ -199,8 +197,7 @@ INSERT INTO "sys_role_menu" VALUES (3, 2111); INSERT INTO "sys_role_menu" VALUES (3, 2113); INSERT INTO "sys_role_menu" VALUES (3, 2114); INSERT INTO "sys_role_menu" VALUES (3, 2115); -INSERT INTO "sys_role_menu" VALUES (3, 2119); -INSERT INTO "sys_role_menu" VALUES (3, 2120); +INSERT INTO "sys_role_menu" VALUES (3, 2116); INSERT INTO "sys_role_menu" VALUES (3, 2123); INSERT INTO "sys_role_menu" VALUES (3, 2126); INSERT INTO "sys_role_menu" VALUES (3, 2128); @@ -227,6 +224,10 @@ INSERT INTO "sys_role_menu" VALUES (3, 2156); INSERT INTO "sys_role_menu" VALUES (3, 2157); INSERT INTO "sys_role_menu" VALUES (3, 2158); INSERT INTO "sys_role_menu" VALUES (3, 2165); +INSERT INTO "sys_role_menu" VALUES (3, 2166); +INSERT INTO "sys_role_menu" VALUES (3, 2167); +INSERT INTO "sys_role_menu" VALUES (3, 2168); +INSERT INTO "sys_role_menu" VALUES (3, 2169); INSERT INTO "sys_role_menu" VALUES (4, 1); INSERT INTO "sys_role_menu" VALUES (4, 4); @@ -247,12 +248,12 @@ INSERT INTO "sys_role_menu" VALUES (4, 2086); INSERT INTO "sys_role_menu" VALUES (4, 2087); INSERT INTO "sys_role_menu" VALUES (4, 2088); INSERT INTO "sys_role_menu" VALUES (4, 2089); -INSERT INTO "sys_role_menu" VALUES (4, 2091); INSERT INTO "sys_role_menu" VALUES (4, 2092); INSERT INTO "sys_role_menu" VALUES (4, 2094); INSERT INTO "sys_role_menu" VALUES (4, 2097); INSERT INTO "sys_role_menu" VALUES (4, 2113); INSERT INTO "sys_role_menu" VALUES (4, 2114); +INSERT INTO "sys_role_menu" VALUES (4, 2116); INSERT INTO "sys_role_menu" VALUES (4, 2126); INSERT INTO "sys_role_menu" VALUES (4, 2128); INSERT INTO "sys_role_menu" VALUES (4, 2129); @@ -272,6 +273,10 @@ INSERT INTO "sys_role_menu" VALUES (4, 2153); INSERT INTO "sys_role_menu" VALUES (4, 2157); INSERT INTO "sys_role_menu" VALUES (4, 2163); INSERT INTO "sys_role_menu" VALUES (4, 2165); +INSERT INTO "sys_role_menu" VALUES (4, 2166); +INSERT INTO "sys_role_menu" VALUES (4, 2167); +INSERT INTO "sys_role_menu" VALUES (4, 2168); +INSERT INTO "sys_role_menu" VALUES (4, 2169); INSERT INTO "sys_role_menu" VALUES (5, 1); INSERT INTO "sys_role_menu" VALUES (5, 4); diff --git a/build/database/lite/install/udm_voip.sql b/build/database/lite/install/udm_voip.sql new file mode 100644 index 00000000..6a3fdd67 --- /dev/null +++ b/build/database/lite/install/udm_voip.sql @@ -0,0 +1,24 @@ +-- ---------------------------- +-- Table structure for udm_voip +-- ---------------------------- +DROP TABLE IF EXISTS "udm_voip"; +CREATE TABLE "udm_voip" ( + "id" integer NOT NULL, + "ne_id" text(50), + "username" text(50), + "password" text(128), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table udm_voip +-- ---------------------------- +CREATE UNIQUE INDEX "uk_voip_user_ne" +ON "udm_voip" ( + "username" ASC, + "ne_id" ASC +); + +-- ---------------------------- +-- Records of udm_voip +-- ---------------------------- diff --git a/build/database/lite/install/udm_volte_ims.sql b/build/database/lite/install/udm_volte_ims.sql new file mode 100644 index 00000000..8946b2a6 --- /dev/null +++ b/build/database/lite/install/udm_volte_ims.sql @@ -0,0 +1,31 @@ +-- ---------------------------- +-- Table structure for udm_volte_ims +-- ---------------------------- +DROP TABLE IF EXISTS "udm_volte_ims"; +CREATE TABLE "udm_volte_ims" ( + "id" integer NOT NULL, + "imsi" text(50) NOT NULL, + "msisdn" text(50), + "ne_id" text(50), + "tag" text(50), + "vni" text(128), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table udm_volte_ims +-- ---------------------------- +CREATE INDEX "idx_volte_tag" +ON "udm_volte_ims" ( + "tag" ASC +); + +CREATE UNIQUE INDEX "uk_volte_imsi_ne" +ON "udm_volte_ims" ( + "imsi" ASC, + "msisdn" ASC, + "ne_id" ASC +); +-- ---------------------------- +-- Records of udm_volte_ims +-- ---------------------------- diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index d8c23737..27e11d8f 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -21,12 +21,12 @@ INSERT INTO `sys_i18n` VALUES (3, 'menu.system', '系统', 'System'); INSERT INTO `sys_i18n` VALUES (4, 'menu.monitor', '监控', 'Monitor'); INSERT INTO `sys_i18n` VALUES (5, 'menu.tools', '工具', 'Tools'); INSERT INTO `sys_i18n` VALUES (6, 'menu.ne', '网元', 'NE'); -INSERT INTO `sys_i18n` VALUES (7, 'menu.ueUser', '终端', 'UE'); +INSERT INTO `sys_i18n` VALUES (7, 'menu.ue', '终端', 'UE'); INSERT INTO `sys_i18n` VALUES (8, 'menu.systemRemark', '系统管理目录', 'System Management Catalog'); INSERT INTO `sys_i18n` VALUES (9, 'menu.monitorRemark', '系统监控目录', 'System Monitor Catalog'); INSERT INTO `sys_i18n` VALUES (10, 'menu.toolsRemark', '系统工具目录', 'System Tools Catalog'); INSERT INTO `sys_i18n` VALUES (11, 'menu.neRemark', '网元配置管理目录', 'NE Configuration Management Catalog'); -INSERT INTO `sys_i18n` VALUES (12, 'menu.ueUserRemark', '网元终端信息目录', 'Network Element Terminal Information Catalog'); +INSERT INTO `sys_i18n` VALUES (12, 'menu.ueRemark', '网元终端信息目录', 'Network Element Terminal Information Catalog'); INSERT INTO `sys_i18n` VALUES (13, 'menu.security.user', '用户管理', 'User Management'); INSERT INTO `sys_i18n` VALUES (14, 'menu.security.role', '角色管理', 'Role Management'); INSERT INTO `sys_i18n` VALUES (15, 'menu.security.roleUser', '分配角色', 'Assigning Roles'); @@ -75,13 +75,13 @@ INSERT INTO `sys_i18n` VALUES (57, 'menu.common.resetPwd', '重置密码', 'Rese INSERT INTO `sys_i18n` VALUES (58, 'menu.common.unlock', '账户解锁', 'Account Unlock'); INSERT INTO `sys_i18n` VALUES (59, 'menu.forcedQuit.batch ', '批量强退', 'Batch Undo'); INSERT INTO `sys_i18n` VALUES (60, 'menu.forcedQuit.single', '单条强退', 'Individual Forced Retirement'); -INSERT INTO `sys_i18n` VALUES (61, 'menu.ueUser.authUDM', 'UDM鉴权用户', 'UDM Authentication'); -INSERT INTO `sys_i18n` VALUES (62, 'menu.ueUser.subUDM', 'UDM签约用户', 'UDM Subscribers'); -INSERT INTO `sys_i18n` VALUES (63, 'menu.ueUser.authUDMRemark', 'UDM鉴权用户菜单', 'UDM Authentication Menu'); -INSERT INTO `sys_i18n` VALUES (64, 'menu.ueUser.subUDMRemark', 'UDM签约用户菜单', 'UDM Subscriber Menu'); -INSERT INTO `sys_i18n` VALUES (65, 'menu.ueUser.onlineIMS', 'IMS在线用户', 'IMS Online Users'); -INSERT INTO `sys_i18n` VALUES (66, 'menu.ueUser.onlineUE', 'UE在线信息', 'UE Online Information'); -INSERT INTO `sys_i18n` VALUES (67, 'menu.ueUser.base5G', '基站信息', 'Radio Information'); +INSERT INTO `sys_i18n` VALUES (61, 'menu.neData.udmAuth', 'UDM鉴权用户', 'UDM Authentication'); +INSERT INTO `sys_i18n` VALUES (62, 'menu.neData.udmSub', 'UDM签约用户', 'UDM Subscribers'); +INSERT INTO `sys_i18n` VALUES (63, 'menu.neData.udmVOIP', 'VOIP鉴权用户', 'VOIP Authentication'); +INSERT INTO `sys_i18n` VALUES (64, 'menu.neData.udmVolte', 'IMS签约用户', 'IMS Subscribers'); +INSERT INTO `sys_i18n` VALUES (65, 'menu.neData.imsSub', 'IMS在线用户', 'IMS Online Users'); +INSERT INTO `sys_i18n` VALUES (66, 'menu.neData.smfSub', 'UE在线信息', 'UE Online Information'); +INSERT INTO `sys_i18n` VALUES (67, 'menu.neData.baseOnline', '基站在线', 'Radio Online'); INSERT INTO `sys_i18n` VALUES (68, 'menu.trace', '跟踪', 'Trace'); INSERT INTO `sys_i18n` VALUES (69, 'menu.trace.task', '网元跟踪任务', 'NE Trace Task'); INSERT INTO `sys_i18n` VALUES (70, 'menu.trace.taskData', '网元跟踪任务数据', 'NE Trace Task Data'); @@ -89,9 +89,9 @@ INSERT INTO `sys_i18n` VALUES (71, 'menu.trace.pcap', '信令抓包', 'Signaling INSERT INTO `sys_i18n` VALUES (72, 'menu.fault', '监控', 'Monitor'); INSERT INTO `sys_i18n` VALUES (73, 'config.neData.exportTableFTP', '网元数据导出备份文件FTP服务', 'NeData Backup file FTP service'); INSERT INTO `sys_i18n` VALUES (74, 'config.neData.exportTableFTPRemark', '请通过网元数据导出列表页面进行设置FTP信息', 'Please set the FTP information through the export list page.'); -INSERT INTO `sys_i18n` VALUES (75, 'menu.ueUser.onlineIMSRemark', 'IMS在线用户菜单', 'IMS Online User Menu'); -INSERT INTO `sys_i18n` VALUES (76, 'menu.ueUser.onlineUERemark', 'UE在线信息菜单', 'UE Online Information Menu'); -INSERT INTO `sys_i18n` VALUES (77, 'menu.ueUser.base5GRemark', '5G基站信息菜单', '5G Base Station Information Menu'); +-- INSERT INTO `sys_i18n` VALUES (75, 'menu.ueUser.onlineIMSRemark', 'IMS在线用户菜单', 'IMS Online User Menu'); +-- INSERT INTO `sys_i18n` VALUES (76, 'menu.ueUser.onlineUERemark', 'UE在线信息菜单', 'UE Online Information Menu'); +-- INSERT INTO `sys_i18n` VALUES (77, 'menu.ueUser.base5GRemark', '5G基站信息菜单', '5G Base Station Information Menu'); INSERT INTO `sys_i18n` VALUES (78, 'menu.traceRemark', '跟踪管理目录', 'Tracking Management Menu'); INSERT INTO `sys_i18n` VALUES (79, 'menu.trace.taskRemark', '跟踪任务菜单', 'Tracking Task Menu'); INSERT INTO `sys_i18n` VALUES (80, 'config.sys.user.fristPasswdChange', '用户管理-首次登录密码修改', 'User Management-First Login Password Change'); @@ -497,7 +497,7 @@ INSERT INTO `sys_i18n` VALUES (479, 'config.sys.helpDocRemark', '静态文件目 INSERT INTO `sys_i18n` VALUES (480, 'log.operate.title.neAction', '网元处理', 'Network Element Processing'); INSERT INTO `sys_i18n` VALUES (481, 'log.operate.title.helpDoc', '系统使用文档', 'System Usage Documentation'); INSERT INTO `sys_i18n` VALUES (482, 'menu.ueUser.n3iwf', 'N3IWF在线用户', 'N3IWF Online User'); -INSERT INTO `sys_i18n` VALUES (483, 'menu.ueUser.pcf', '用户策略控制信息', 'User PCC Information'); +INSERT INTO `sys_i18n` VALUES (483, 'menu.neData.pcfSub', '用户策略控制信息', 'User PCC Information'); INSERT INTO `sys_i18n` VALUES (484, 'menu.system.user.editRole', '修改用户角色', 'Modifying User Role'); INSERT INTO `sys_i18n` VALUES (485, 'config.sys.i18nOpen', '国际化切换', 'Internationalization Switching'); INSERT INTO `sys_i18n` VALUES (486, 'config.sys.i18nDefault', '国际化默认语言', 'Internationalization Default Language'); diff --git a/build/database/std/install/sys_menu.sql b/build/database/std/install/sys_menu.sql index f5289cfe..d0559bf7 100644 --- a/build/database/std/install/sys_menu.sql +++ b/build/database/std/install/sys_menu.sql @@ -32,8 +32,8 @@ CREATE TABLE `sys_menu` ( -- Records of sys_menu -- ---------------------------- INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', '', '1', '1', 'D', '1', '1', '', 'icon-xiangmu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.systemRemark'); -INSERT INTO `sys_menu` VALUES (4, 'menu.ne', 0, 3, 'configManage', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.configRemark'); -INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUserRemark'); +INSERT INTO `sys_menu` VALUES (4, 'menu.ne', 0, 3, 'ne', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.configRemark'); +INSERT INTO `sys_menu` VALUES (5, 'menu.ue', 0, 7, 'ue', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueRemark'); INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.toolsRemark'); INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.tools.helpRemark'); @@ -112,14 +112,18 @@ INSERT INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUser.authUDMRemark'); -INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUser.subUDMRemark'); --- INSERT INTO `sys_menu` VALUES (2075, 'menu.config.neManage', 4, 1, 'neManage', 'configManage/neManage/index', '1', '0', 'M', '1', '0', 'configManage:neManage:index', 'icon-biaoqing', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.config.neManageRemark'); --- INSERT INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 100, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.config.backupManageRemark'); --- INSERT INTO `sys_menu` VALUES (2079, 'menu.config.softwareManage', 4, 4, 'softwareManage', 'configManage/softwareManage/index', '1', '0', 'M', '1', '0', 'configManage:softwareManage:index', 'icon-huidingbu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.config.softwareManageRemark'); -INSERT INTO `sys_menu` VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUser.onlineIMSRemark'); -INSERT INTO `sys_menu` VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUser.onlineUERemark'); -INSERT INTO `sys_menu` VALUES (2082, 'menu.ueUser.base5G', 5, 7, 'base5G', 'neUser/base5G/index', '1', '0', 'M', '0', '1', 'neUser:base5G:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.ueUser.base5GRemark'); +INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm:auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm:voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2003, 'menu.neData.udmVolte', 5, 7, 'udm-volte', 'neData/udm-volte/index', '1', '0', 'M', '1', '1', 'udm:volte:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2004, 'menu.neData.imsSub', 5, 9, 'ims-sub', 'neData/ims-sub/index', '1', '0', 'M', '1', '1', 'ims:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2005, 'menu.neData.smfSub', 5, 12, 'smf-sub', 'neData/smf-sub/index', '1', '0', 'M', '1', '1', 'smf:sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2006, 'menu.neData.baseOnline', 5, 15, 'base-online', 'neData/base-online/index', '1', '0', 'M', '0', '1', 'amf,mme:base-online:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2007, 'menu.neData.baseStation', 5, 18, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'amf,mme:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2008, 'menu.ueUser.n3iwf', 5, 20, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf:sub:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2010, 'menu.neUser.nssf', 5, 26, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (2011, 'menu.neUser.nssfAmf', 5, 28, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2083, 'menu.trace', 2087, 30, 'traceManage', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.traceRemark'); INSERT INTO `sys_menu` VALUES (2084, 'menu.trace.task', 2083, 1, 'task', 'traceManage/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark'); INSERT INTO `sys_menu` VALUES (2085, 'menu.trace.taskData', 2083, 4, 'task/inline/data', 'traceManage/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, ''); @@ -131,7 +135,7 @@ INSERT INTO `sys_menu` VALUES (2091, 'menu.log.mml', 2089, 30, 'mml', 'logManage INSERT INTO `sys_menu` VALUES (2092, 'menu.log.alarm', 2089, 40, 'alarm-log', 'logManage/alarm/index', '1', '0', 'M', '1', '1', 'logManage:alarm:index', 'icon-fuzhidaima', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.log.alarmRemark'); INSERT INTO `sys_menu` VALUES (2094, 'menu.log.forwarding', 2089, 41, 'forwarding', 'logManage/forwarding/index', '1', '0', 'M', '1', '1', 'logManage:forwarding:index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.log.forwardingRemark'); INSERT INTO `sys_menu` VALUES (2095, 'menu.log.set', 2089, 45, 'logSet', 'logManage/logSet/index', '1', '0', 'M', '0', '0', 'logManage:logSet:index', 'icon-you', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.log.setRemark'); -INSERT INTO `sys_menu` VALUES (2096, 'menu.neData.baseStation', 5, 12, 'base-station', 'ne-data/base-station/index', '1', '0', 'M', '1', '1', 'ne-data:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588,'system', 1728641403588, ''); +-- INSERT INTO `sys_menu` VALUES (2096, 'menu.neData.baseStation', 5, 12, 'base-station', 'neData/base-station/index', '1', '0', 'M', '1', '1', 'ne-data:base-station:list', 'icon-fenxiang', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2097, 'menu.fault.history', 2129, 2, 'history-alarm', 'faultManage/history-alarm/index', '1', '1', 'M', '1', '1', 'faultManage/history-alarm/index', 'icon-huizhiguize', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.fault.historyRemark'); INSERT INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting', 'faultManage/fault-setting/index', '1', '0', 'M', '0', '1', 'faultManage/fault-setting/index', 'icon-gonggaodayi', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.fault.setRemark'); INSERT INTO `sys_menu` VALUES (2099, 'menu.perf', 0, 5, 'perfManage', '', '1', '0', 'D', '1', '1', '', 'icon-soutubiao', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.perfRemark'); @@ -154,13 +158,13 @@ INSERT INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monito INSERT INTO `sys_menu` VALUES (2116, 'menu.dashboard.smscCDR.content', 2157, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:smsc:content', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2117, 'menu.common.delete', 2140, 1, '', '', '1', '1', 'B', '1', '1', 'cdr:ne:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2118, 'menu.dashboard.smfCDRByIMSI', 2140, 7, 'smfCDRByIMSI', 'dashboard/smfCDRByIMSI/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-gerenzhanghu', '0', 'system', 1728641403588,'system', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +-- INSERT INTO `sys_menu` VALUES (2119, 'menu.ueUser.n3iwf', 5, 8, 'n3iwf', 'neUser/n3iwf/index', '1', '0', 'M', '0', '1', 'neUser:n3iwf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +-- INSERT INTO `sys_menu` VALUES (2120, 'menu.ueUser.pcf', 5, 9, 'pcf', 'neUser/pcf/index', '1', '0', 'M', '1', '1', 'neUser:pcf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2121, 'menu.system.user.editRole', 100, 8, '', '', '1', '1', 'B', '1', '1', 'system:user:editRole', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2122, 'menu.system.setting.i18n', 2114, 1, '', '', '1', '1', 'B', '1', '1', 'system:setting:i18n', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.setting.i18nRemark'); INSERT INTO `sys_menu` VALUES (2123, 'menu.log.neFile', 2089, 9, 'neFile', 'logManage/neFile/index', '1', '0', 'M', '1', '1', 'logManage:neFile:index', 'icon-tubiaohuizhi', '0', 'system', 1728641403588,'system', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (2124, 'menu.neUser.nssf', 5, 10, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588,'system', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (2125, 'menu.neUser.nssfAmf', 5, 11, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); +-- INSERT INTO `sys_menu` VALUES (2124, 'menu.neUser.nssf', 5, 10, 'nssf', 'neUser/nssf/index', '1', '0', 'M', '0', '1', 'neUser:nssf:index', 'icon-daimayingyong', '0', 'system', 1728641403588,'system', 1728641403588, ''); +-- INSERT INTO `sys_menu` VALUES (2125, 'menu.neUser.nssfAmf', 5, 11, 'nssfAmf', 'neUser/nssfAmf/index', '1', '0', 'M', '0', '1', 'neUser:nssfAmf:index', 'icon-paixu', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2126, 'menu.monitor.topology', 2130, 10, 'topology', 'monitor/topology/index', '1', '0', 'M', '1', '1', 'monitor:topology:index', 'icon-fangda', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2127, 'menu.monitor.topologyBuild', 2130, 30, 'topologyBuild', 'monitor/topologyBuild/index', '1', '0', 'M', '1', '1', 'monitor:topologyBuild:index', 'icon-fangda', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2128, 'menu.monitor.topologyArchitecture', 2130, 20, 'topologyArchitecture', 'monitor/topologyArchitecture/index', '1', '0', 'M', '1', '1', 'monitor:topologyArchitecture:index', 'icon-soutubiao', '0', 'system', 1728641403588,'system', 1728641403588, ''); diff --git a/build/database/std/install/sys_role_menu.sql b/build/database/std/install/sys_role_menu.sql index 9a3ae126..35474759 100644 --- a/build/database/std/install/sys_role_menu.sql +++ b/build/database/std/install/sys_role_menu.sql @@ -66,9 +66,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1022); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1023); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1024); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1030); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1031); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1032); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1033); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1039); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1040); @@ -86,11 +84,15 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1054); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1056); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2000); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2001); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2002); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2003); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2004); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2005); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2007); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2083); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2084); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2086); @@ -100,9 +102,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2089); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2094); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2096); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2098); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2099); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2100); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2101); @@ -113,7 +113,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2105); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2114); @@ -121,13 +120,9 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2116); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2117); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2118); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2120); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2121); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2122); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2123); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2125); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2129); @@ -178,17 +173,20 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 500); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 501); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1030); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1031); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1039); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1048); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2000); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2001); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2002); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2003); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2004); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2005); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2007); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2010); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); @@ -205,8 +203,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2120); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2116); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); @@ -233,6 +230,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2169); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); @@ -253,12 +254,12 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2089); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2116); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); @@ -278,6 +279,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2169); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); diff --git a/build/database/std/install/udm_voip.sql b/build/database/std/install/udm_voip.sql new file mode 100644 index 00000000..37837eea --- /dev/null +++ b/build/database/std/install/udm_voip.sql @@ -0,0 +1,15 @@ +-- +-- Table structure for table `udm_voip` +-- + +DROP TABLE IF EXISTS `udm_voip`; +CREATE TABLE `udm_voip` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户名', + `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_voip_user_ne` (`username`,`ne_id`) USING BTREE COMMENT 'user_neid唯一主键' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM用户数据_VOIP'; + +-- Dump completed on 2025-04-22 15:26:56 diff --git a/build/database/std/install/udm_volte_ims.sql b/build/database/std/install/udm_volte_ims.sql new file mode 100644 index 00000000..b2debc57 --- /dev/null +++ b/build/database/std/install/udm_volte_ims.sql @@ -0,0 +1,18 @@ +-- +-- Table structure for table `udm_volte_ims` +-- + +DROP TABLE IF EXISTS `udm_volte_ims`; +CREATE TABLE `udm_volte_ims` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', + `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', + `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', + `tag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '0=VoIP, 1=VoLTE', + `vni` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'VNI', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_volte_imsi_ne` (`imsi`,`msisdn`,`ne_id`) USING BTREE COMMENT 'imsi_msisdn_neid唯一主键', + KEY `idx_volte_tag` (`tag`) USING BTREE COMMENT 'tag索引' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_VolteIMS用户'; + +-- Dump completed on 2025-04-22 15:26:56 diff --git a/src/framework/telnet/parse.go b/src/framework/telnet/parse.go index 31e46bcf..fc6847a8 100644 --- a/src/framework/telnet/parse.go +++ b/src/framework/telnet/parse.go @@ -24,7 +24,7 @@ func ConvertToStr(telnetClient *ConnTelnet, cmd string) (string, error) { return str, nil } - return "", fmt.Errorf(str) + return "", fmt.Errorf("%s", str) } // ConvertToMap 转换为map @@ -41,7 +41,7 @@ func ConvertToMap(telnetClient *ConnTelnet, cmd string) (map[string]string, erro if index != -1 { output = output[:index] } - return nil, fmt.Errorf(output) + return nil, fmt.Errorf("%s", output) } // 初始化一个map用于存储拆分后的键值对 diff --git a/src/modules/network_data/controller/udm_voip.go b/src/modules/network_data/controller/udm_voip.go new file mode 100644 index 00000000..c2000b48 --- /dev/null +++ b/src/modules/network_data/controller/udm_voip.go @@ -0,0 +1,552 @@ +package controller + +import ( + "fmt" + "path/filepath" + "strings" + "time" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 UDMVOIPController 结构体 +var NewUDMVOIP = &UDMVOIPController{ + udmVOIPService: neDataService.NewUDMVOIPUser, + neInfoService: neService.NewNeInfo, +} + +// UDMVOIP用户 +// +// PATH /udm/voip +type UDMVOIPController struct { + udmVOIPService *neDataService.UDMVOIPUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 +} + +// UDMVOIP用户重载数据 +// +// PUT /resetData/:neId +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User Data Refresh +// @Description UDM VOIP User Data List Refresh Synchronization Latest +// @Router /neData/udm/voip/resetData/{neId} [put] +func (s *UDMVOIPController) ResetData(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + data := s.udmVOIPService.ResetData(neId) + c.JSON(200, resp.OkData(data)) +} + +// UDMVOIP用户列表 +// +// GET /list +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Param username query string false "User Name" +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User List +// @Description UDM VOIP User List +// @Router /neData/udm/voip/list [get] +func (s *UDMVOIPController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + total, rows := s.udmVOIPService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) +} + +// UDMVOIP用户信息 +// +// GET /:neId/:username +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path string true "User Name" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User Information +// @Description UDM VOIP User Information +// @Router /neData/udm/voip/{neId}/{value} [get] +func (s *UDMVOIPController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + username := c.Param("username") + if neId == "" || username == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("dsp voip:username=%s", username) + data, err := telnet.ConvertToMap(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + if len(data) == 0 { + c.JSON(200, resp.ErrMsg("No VOIP Data")) + return + } + + // 解析返回的数据 + u := s.udmVOIPService.ParseInfo(username, neId, data) + s.udmVOIPService.Insert(neId, u) + c.JSON(200, resp.OkData(u)) +} + +// UDMVOIP用户新增 +// +// POST /:neId +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User Added +// @Description UDM VOIP User Added +// @Router /neData/udm/voip/{neId} [post] +func (s *UDMVOIPController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var body model.UDMVOIPUser + err := c.ShouldBindBodyWithJSON(&body) + if err != nil || body.UserName == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("add voip:username=%s,password=%s", body.UserName, body.Password) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVOIPService.Insert(neId, body) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVOIP用户批量新增 +// +// POST /:neId/:num +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path number true "Number of releases, value includes start username" +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User Batch Add +// @Description UDM VOIP User Batch Add +// @Router /neData/udm/voip/{neId}/{value} [post] +func (s *UDMVOIPController) Adds(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + num := c.Param("num") + if neId == "" || num == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var body model.UDMVOIPUser + err := c.ShouldBindBodyWithJSON(&body) + if err != nil || body.UserName == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("baa voip:sub_num=%s,start_username=%s,password=%s", num, body.UserName, body.Password) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVOIPService.LoadData(neId, body.UserName, num) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVOIP用户删除 +// +// DELETE /:neId/:username +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path string true "User Name, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Deletion +// @Description UDM Authenticated User Deletion +// @Router /neData/udm/voip/{neId}/{value} [delete] +func (s *UDMVOIPController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + username := c.Param("username") + if neId == "" || username == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 处理字符转id数组后去重 + usernameArr := strings.Split(username, ",") + uniqueIDs := parse.RemoveDuplicates(usernameArr) + if len(uniqueIDs) <= 0 { + c.JSON(200, resp.Err(nil)) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + resultData := map[string]string{} + for _, v := range uniqueIDs { + // 发送MML + cmd := fmt.Sprintf("del voip:username=%s", v) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + resultData[v] = err.Error() + continue + } + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVOIPService.Delete(v, neId) + } + resultData[v] = data + } + + c.JSON(200, resp.OkData(resultData)) +} + +// UDMVOIP用户批量删除 +// +// DELETE /:neId/:username/:num +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param username path string true "User Name" +// @Param num path number true "Number of releases, value includes start username" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM VOIP User Batch Deletion +// @Description UDM VOIP User Batch Deletion +// @Router /neData/udm/voip/{neId}/{username}/{num} [delete] +func (s *UDMVOIPController) Removes(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + username := c.Param("username") + num := c.Param("num") + if neId == "" || username == "" || num == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("bde voip:start_username=%s,sub_num=%s", username, num) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVOIPService.LoadData(neId, username, num) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVOIP用户导出 +// +// GET /export +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Param type query string true "File Type" Enums(csv,txt) default(txt) +// @Param username query string false "User Name" +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Export +// @Description UDM Authenticated User Export +// @Router /neData/udm/voip/export [get] +func (s *UDMVOIPController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + // 查询结果,根据查询条件结果,单页最大值限制 + neId := c.Query("neId") + fileType := c.Query("type") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if !(fileType == "csv" || fileType == "txt") { + c.JSON(200, resp.ErrMsg("File Type Error, only support csv,txt")) + return + } + + query := reqctx.QueryMap(c) + total, rows := s.udmVOIPService.FindByPage(query) + if total == 0 { + // 导出数据记录为空 + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // rows := s.udmVOIPService.SelectList(model.UDMVOIPUser{NeId: neId}) + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // 文件名 + fileName := fmt.Sprintf("udm_voip_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) + filePath := filepath.Join(file.ParseUploadFileDir(constants.UPLOAD_EXPORT), fileName) + + if fileType == "csv" { + // 转换数据 + data := [][]string{} + data = append(data, []string{"username", "password"}) + for _, v := range rows { + data = append(data, []string{v.UserName, v.Password}) + } + // 输出到文件 + err := file.WriterFileCSV(data, filePath) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + } + + if fileType == "txt" { + // 转换数据 + data := [][]string{} + for _, v := range rows { + data = append(data, []string{v.UserName, v.Password}) + } + // 输出到文件 + + if err := file.WriterFileTXT(data, ",", filePath); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + } + + c.FileAttachment(filePath, fileName) +} + +// UDMVOIP用户导入 +// +// POST /import +// +// @Tags network_data/udm/voip +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Import +// @Description UDM Authenticated User Import +// @Router /neData/udm/voip/import [post] +func (s *UDMVOIPController) Import(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + NeId string `json:"neId" binding:"required"` // 网元ID + UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + + // 判断文件名 + if !(strings.HasSuffix(body.UploadPath, ".csv") || strings.HasSuffix(body.UploadPath, ".txt")) { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserAuthFileFormat"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", body.NeId) + if neInfo.NeId != body.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer sftpClient.Close() + + // 本地文件 + localFilePath := file.ParseUploadFileAbsPath(body.UploadPath) + neFilePath := fmt.Sprintf("/tmp/%s", filepath.Base(localFilePath)) + // 复制到远程 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + c.JSON(200, resp.ErrMsg("error uploading file")) + return + } + + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 结果信息 + var resultMsg string + var resultErr error + + // 发送MML + cmd := fmt.Sprintf("import voip:path=%s", neFilePath) + resultMsg, resultErr = telnet.ConvertToStr(telnetClient, cmd) + if resultErr != nil { + c.JSON(200, resp.ErrMsg(resultErr.Error())) + return + } + + // 命令ok时 + if strings.Contains(resultMsg, "ok") { + if strings.HasSuffix(body.UploadPath, ".csv") { + data := file.ReadFileCSV(localFilePath) + go s.udmVOIPService.InsertData(neInfo.NeId, "csv", data) + } + if strings.HasSuffix(body.UploadPath, ".txt") { + data := file.ReadFileTXT(",", localFilePath) + go s.udmVOIPService.InsertData(neInfo.NeId, "txt", data) + } + } + c.JSON(200, resp.OkMsg(resultMsg)) +} diff --git a/src/modules/network_data/controller/udm_volte_ims.go b/src/modules/network_data/controller/udm_volte_ims.go new file mode 100644 index 00000000..d6d09ce0 --- /dev/null +++ b/src/modules/network_data/controller/udm_volte_ims.go @@ -0,0 +1,580 @@ +package controller + +import ( + "fmt" + "path/filepath" + "strings" + "time" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 UDMVolteIMSController 结构体 +var NewUDMVolteIMS = &UDMVolteIMSController{ + udmVolteIMSService: neDataService.NewUDMVolteIMSUser, + neInfoService: neService.NewNeInfo, +} + +// UDMVolteIMS用户 +// +// PATH /udm/volte-ims +type UDMVolteIMSController struct { + udmVolteIMSService *neDataService.UDMVolteIMSUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 +} + +// UDMVolteIMS用户重载数据 +// +// PUT /resetData/:neId +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User Data Refresh +// @Description UDM Authenticated User Data List Refresh Synchronization Latest +// @Router /neData/udm/volte-ims/resetData/{neId} [put] +func (s *UDMVolteIMSController) ResetData(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + data := s.udmVolteIMSService.ResetData(neId) + c.JSON(200, resp.OkData(data)) +} + +// UDMVolteIMS用户列表 +// +// GET /list +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Param imsi query string false "IMSI" +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User List +// @Description UDM Authentication User List +// @Router /neData/udm/volte-ims/list [get] +func (s *UDMVolteIMSController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + total, rows := s.udmVolteIMSService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) +} + +// UDMVolteIMS用户信息 +// +// GET /:neId/:imsi +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path string true "IMSI" +// @Param msisdn query string true "MSISDN" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User Information +// @Description UDM Authentication User Information +// @Router /neData/udm/volte-ims/{neId}/{value} [get] +func (s *UDMVolteIMSController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + imsi := c.Param("imsi") + msisdn := c.Query("msisdn") + if neId == "" || imsi == "" || msisdn == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("dsp imsuser:imsi=%s,msisdn=%s", imsi, msisdn) + data, err := telnet.ConvertToMap(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + if len(data) == 0 { + c.JSON(200, resp.ErrMsg("No Volte IMS Data")) + return + } + + // 解析返回的数据 + u := s.udmVolteIMSService.ParseInfo(neId, data) + if u.ID != "" { + s.udmVolteIMSService.InsertByIMSI(imsi, neId) + c.JSON(200, resp.OkData(u)) + } + c.JSON(200, resp.ErrMsg("No Volte IMS Data")) +} + +// UDMVolteIMS用户新增 +// +// POST /:neId +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User Added +// @Description UDM Authentication User Added +// @Router /neData/udm/volte-ims/{neId} [post] +func (s *UDMVolteIMSController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var body model.UDMVolteIMSUser + err := c.ShouldBindBodyWithJSON(&body) + if err != nil || body.IMSI == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 检查同IMSI下msisdn是否存在 + hasMsisdns := s.udmVolteIMSService.Find(model.UDMVolteIMSUser{IMSI: body.IMSI, MSISDN: body.MSISDN, NeId: neId}) + if len(hasMsisdns) > 0 { + c.JSON(200, resp.ErrMsg("IMSI and MSISDN already exist")) + return + } + + // 发送MML + cmd := fmt.Sprintf("add imsuser:imsi=%s,msisdn=%s,volte=%s,vni=%s", body.IMSI, body.MSISDN, body.Tag, body.VNI) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVolteIMSService.InsertByIMSI(body.IMSI, neId) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVolteIMS用户批量新增 +// +// POST /:neId/:num +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path number true "Number of releases, value includes start imsi" +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User Batch Add +// @Description UDM Authentication User Batch Add +// @Router /neData/udm/volte-ims/{neId}/{value} [post] +func (s *UDMVolteIMSController) Adds(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + num := c.Param("num") + if neId == "" || num == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var body model.UDMVolteIMSUser + err := c.ShouldBindBodyWithJSON(&body) + if err != nil || body.IMSI == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("baa imsuser:sub_num=%s,start_imsi=%s,start_msisdn=%s,volte=%s,vni=%s", num, body.IMSI, body.MSISDN, body.Tag, body.VNI) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVolteIMSService.LoadData(neId, body.IMSI, num) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVolteIMS用户删除 +// +// DELETE /:neId/:imsi +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param value path string true "IMSI, multiple separated by a , sign" +// @Param msisdn query string false "MSISDN" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Deletion +// @Description UDM Authenticated User Deletion +// @Router /neData/udm/volte-ims/{neId}/{value} [delete] +func (s *UDMVolteIMSController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + imsi := c.Param("imsi") + msisdn := c.Query("msisdn") + if neId == "" || imsi == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + imsiArr := strings.Split(imsi, ",") + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 精确msisdn删除 + if msisdn != "" { + // 发送MML + cmd := fmt.Sprintf("del imsuser:imsi=%s,msisdn=%s", imsiArr[0], msisdn) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVolteIMSService.Delete(imsi, neId) + } + c.JSON(200, resp.OkData(data)) + return + } else { + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicates(imsiArr) + if len(uniqueIDs) <= 0 { + c.JSON(200, resp.Err(nil)) + return + } + resultData := map[string]string{} + for _, imsi := range uniqueIDs { + // 发送MML + cmd := fmt.Sprintf("del imsuser:imsi=%s", imsi) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + resultData[imsi] = err.Error() + continue + } + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVolteIMSService.Delete(imsi, neId) + } + resultData[imsi] = data + } + c.JSON(200, resp.OkData(resultData)) + return + } +} + +// UDMVolteIMS用户批量删除 +// +// DELETE /:neId/:imsi/:num +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId path string true "NE ID" default(001) +// @Param imsi path string true "IMSI" +// @Param num path number true "Number of releases, value includes start imsi" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authentication User Batch Deletion +// @Description UDM Authentication User Batch Deletion +// @Router /neData/udm/volte-ims/{neId}/{imsi}/{num} [delete] +func (s *UDMVolteIMSController) Removes(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + neId := c.Param("neId") + imsi := c.Param("imsi") + num := c.Param("num") + if neId == "" || imsi == "" || num == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 发送MML + cmd := fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s", imsi, num) + data, err := telnet.ConvertToStr(telnetClient, cmd) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.udmVolteIMSService.LoadData(neId, imsi, num) + } + c.JSON(200, resp.OkData(data)) +} + +// UDMVolteIMS用户导出 +// +// GET /export +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param neId query string true "NE ID" default(001) +// @Param type query string true "File Type" Enums(csv,txt) default(txt) +// @Param imsi query string false "IMSI" +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Export +// @Description UDM Authenticated User Export +// @Router /neData/udm/volte-ims/export [get] +func (s *UDMVolteIMSController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + // 查询结果,根据查询条件结果,单页最大值限制 + neId := c.Query("neId") + fileType := c.Query("type") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if !(fileType == "csv" || fileType == "txt") { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) + return + } + + query := reqctx.QueryMap(c) + total, rows := s.udmVolteIMSService.FindByPage(query) + if total == 0 { + // 导出数据记录为空 + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + + // 文件名 + fileName := fmt.Sprintf("udm_volte_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) + filePath := filepath.Join(file.ParseUploadFileDir(constants.UPLOAD_EXPORT), fileName) + + if fileType == "csv" { + // 转换数据 + data := [][]string{} + data = append(data, []string{"IMSI", "MSISDN", "Tag", "VNI"}) + for _, v := range rows { + data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI}) + } + // 输出到文件 + err := file.WriterFileCSV(data, filePath) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + } + + if fileType == "txt" { + // 转换数据 + data := [][]string{} + for _, v := range rows { + data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI}) + } + // 输出到文件 + + if err := file.WriterFileTXT(data, ",", filePath); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + } + + c.FileAttachment(filePath, fileName) +} + +// UDMVolteIMS用户导入 +// +// POST /import +// +// @Tags network_data/udm/volte-ims +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary UDM Authenticated User Import +// @Description UDM Authenticated User Import +// @Router /neData/udm/volte-ims/import [post] +func (s *UDMVolteIMSController) Import(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + NeId string `json:"neId" binding:"required"` // 网元ID + UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + + // 判断文件名 + if !(strings.HasSuffix(body.UploadPath, ".csv") || strings.HasSuffix(body.UploadPath, ".txt")) { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserAuthFileFormat"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", body.NeId) + if neInfo.NeId != body.NeId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer sftpClient.Close() + + // 本地文件 + localFilePath := file.ParseUploadFileAbsPath(body.UploadPath) + neFilePath := fmt.Sprintf("/tmp/%s", filepath.Base(localFilePath)) + // 复制到远程 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + c.JSON(200, resp.ErrMsg("error uploading file")) + return + } + + // 网元主机的Telnet客户端 + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, 1) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + defer telnetClient.Close() + + // 结果信息 + var resultMsg string + var resultErr error + + // 发送MML + cmd := fmt.Sprintf("import imsuser:path=%s", neFilePath) + resultMsg, resultErr = telnet.ConvertToStr(telnetClient, cmd) + if resultErr != nil { + c.JSON(200, resp.ErrMsg(resultErr.Error())) + return + } + + // 命令ok时 + if strings.Contains(resultMsg, "ok") { + if strings.HasSuffix(body.UploadPath, ".csv") { + data := file.ReadFileCSV(localFilePath) + go s.udmVolteIMSService.InsertData(neInfo.NeId, "csv", data) + } + if strings.HasSuffix(body.UploadPath, ".txt") { + data := file.ReadFileTXT(",", localFilePath) + go s.udmVolteIMSService.InsertData(neInfo.NeId, "txt", data) + } + } + c.JSON(200, resp.OkMsg(resultMsg)) +} diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index 72e90efa..8ea6b8aa 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -27,7 +27,7 @@ type UPFController struct { // 总流量数 N3上行 N6下行 // 单位 比特(bit) // -// GET /totalFlow +// GET /flow-total // // @Tags network_data/upf // @Accept json @@ -38,8 +38,8 @@ type UPFController struct { // @Security TokenAuth // @Summary Total number of flows N3 upstream N6 downstream // @Description Total number of flows N3 upstream N6 downstream -// @Router /neData/upf/totalFlow [get] -func (s UPFController) TotalFlow(c *gin.Context) { +// @Router /neData/upf/flow-total [get] +func (s UPFController) FlowTotal(c *gin.Context) { language := reqctx.AcceptLanguage(c) var querys struct { NeID string `form:"neId" binding:"required"` diff --git a/src/modules/network_data/model/udm_voip.go b/src/modules/network_data/model/udm_voip.go new file mode 100644 index 00000000..2fbd1ae9 --- /dev/null +++ b/src/modules/network_data/model/udm_voip.go @@ -0,0 +1,15 @@ +package model + +// UDMVOIPUser UDMVOIP用户 udm_voip +type UDMVOIPUser struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + + UserName string `json:"username" gorm:"column:username"` // 用户名 + Password string `json:"password" gorm:"column:password"` // 密码 +} + +// TableName 表名称 +func (*UDMVOIPUser) TableName() string { + return "udm_voip" +} diff --git a/src/modules/network_data/model/udm_volte_ims.go b/src/modules/network_data/model/udm_volte_ims.go new file mode 100644 index 00000000..0dd4277b --- /dev/null +++ b/src/modules/network_data/model/udm_volte_ims.go @@ -0,0 +1,17 @@ +package model + +// UDMVolteIMSUser UDMVolteIMS用户 udm_volte_ims +type UDMVolteIMSUser struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + + Tag string `json:"tag" gorm:"column:tag"` // 0=VoIP, 1=VoLTE + VNI string `json:"vni" gorm:"column:vni"` // VNI +} + +// TableName 表名称 +func (*UDMVolteIMSUser) TableName() string { + return "udm_volte_ims" +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 17b57002..3749e197 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -200,9 +200,9 @@ func Setup(router *gin.Engine) { // 网元UPF upfGroup := neDataGroup.Group("/upf") { - upfGroup.GET("/totalFlow", + upfGroup.GET("/flow-total", middleware.PreAuthorize(nil), - controller.NewUPF.TotalFlow, + controller.NewUPF.FlowTotal, ) } @@ -314,6 +314,104 @@ func Setup(router *gin.Engine) { ) } + // 网元UDM VOIP用户信息 + udmVOIPGroup := neDataGroup.Group("/udm/voip") + { + udmVOIPGroup.PUT("/resetData/:neId", + repeat.RepeatSubmit(5), + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_CLEAN)), + controller.NewUDMVOIP.ResetData, + ) + udmVOIPGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewUDMVOIP.List, + ) + udmVOIPGroup.GET("/:neId/:username", + middleware.PreAuthorize(nil), + controller.NewUDMVOIP.Info, + ) + udmVOIPGroup.POST("/:neId", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewUDMVOIP.Add, + ) + udmVOIPGroup.POST("/:neId/:num", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewUDMVOIP.Adds, + ) + udmVOIPGroup.DELETE("/:neId/:username", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewUDMVOIP.Remove, + ) + udmVOIPGroup.DELETE("/:neId/:username/:num", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewUDMVOIP.Removes, + ) + udmVOIPGroup.GET("/export", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_EXPORT)), + controller.NewUDMVOIP.Export, + ) + udmVOIPGroup.POST("/import", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVOIP", collectlogs.BUSINESS_TYPE_IMPORT)), + controller.NewUDMVOIP.Import, + ) + } + + // 网元UDM VolteIMS用户信息 + udmVolteIMSGroup := neDataGroup.Group("/udm/volte-ims") + { + udmVolteIMSGroup.PUT("/resetData/:neId", + repeat.RepeatSubmit(5), + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_CLEAN)), + controller.NewUDMVolteIMS.ResetData, + ) + udmVolteIMSGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewUDMVolteIMS.List, + ) + udmVolteIMSGroup.GET("/:neId/:imsi", + middleware.PreAuthorize(nil), + controller.NewUDMVolteIMS.Info, + ) + udmVolteIMSGroup.POST("/:neId", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewUDMVolteIMS.Add, + ) + udmVolteIMSGroup.POST("/:neId/:num", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_INSERT)), + controller.NewUDMVolteIMS.Adds, + ) + udmVolteIMSGroup.DELETE("/:neId/:imsi", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewUDMVolteIMS.Remove, + ) + udmVolteIMSGroup.DELETE("/:neId/:imsi/:num", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_DELETE)), + controller.NewUDMVolteIMS.Removes, + ) + udmVolteIMSGroup.GET("/export", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_EXPORT)), + controller.NewUDMVolteIMS.Export, + ) + udmVolteIMSGroup.POST("/import", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmVolteIMS", collectlogs.BUSINESS_TYPE_IMPORT)), + controller.NewUDMVolteIMS.Import, + ) + } + // 网元MME mmeGroup := neDataGroup.Group("/mme") { diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index c8f4d29d..4a9565a5 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -18,7 +18,7 @@ type UDMAuthUser struct{} // ClearAndInsert 清空ne_id后新增实体 func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 - // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) + // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_auth", nil) result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMAuthUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) @@ -39,6 +39,7 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAut if v, ok := query["imsis"]; ok && v != "" { arr := strings.Split(v, ",") tx = tx.Where("imsi in ?", arr) + // 勾选时,pageSize为勾选的数量 query["pageSize"] = fmt.Sprint(len(arr)) } @@ -126,7 +127,7 @@ func (r *UDMAuthUser) Delete(imsi, neId string) int64 { } // DeletePrefixByIMSI 删除前缀匹配的实体 -func (r *UDMAuthUser) DeletePrefixByIMSI(neId, imsi string) int64 { +func (r *UDMAuthUser) DeletePrefixByIMSI(imsi, neId string) int64 { tx := db.DB("").Where("imsi like ? and ne_id = ?", fmt.Sprintf("%s%%", imsi), neId).Delete(&model.UDMAuthUser{}) if err := tx.Error; err != nil { logger.Errorf("DeletePrefixByIMSI err => %v", err) diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index bd1b97a0..5e7d2a14 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -18,7 +18,7 @@ type UDMSubUser struct{} // ClearAndInsert 清空ne_id后新增实体 func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 - // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) + // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_sub", nil) result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMSubUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) @@ -42,6 +42,7 @@ func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubU if v, ok := query["imsis"]; ok && v != "" { arr := strings.Split(v, ",") tx = tx.Where("imsi in ?", arr) + // 勾选时,pageSize为勾选的数量 query["pageSize"] = fmt.Sprint(len(arr)) } diff --git a/src/modules/network_data/repository/udm_voip.go b/src/modules/network_data/repository/udm_voip.go new file mode 100644 index 00000000..e0fe4a93 --- /dev/null +++ b/src/modules/network_data/repository/udm_voip.go @@ -0,0 +1,138 @@ +package repository + +import ( + "fmt" + "strings" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 UDMVOIPUser 结构体 +var NewUDMVOIPUser = &UDMVOIPUser{} + +// UDMVOIPUser UDMVOIP用户信息表 数据层处理 +type UDMVOIPUser struct{} + +// ClearAndInsert 清空ne_id后新增实体 +func (r UDMVOIPUser) ClearAndInsert(neId string, uArr []model.UDMVOIPUser) int64 { + // 不指定neID时,用 TRUNCATE 清空表快 + // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_voip", nil) + result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVOIPUser{}) + if result.Error != nil { + logger.Errorf("Delete err => %v", result.Error) + } + return r.Inserts(uArr) +} + +// SelectPage 根据条件分页查询 +func (r UDMVOIPUser) SelectPage(query map[string]string) (int64, []model.UDMVOIPUser) { + tx := db.DB("").Model(&model.UDMVOIPUser{}) + // 查询条件拼接 + if v, ok := query["username"]; ok && v != "" { + tx = tx.Where("username like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } + if v, ok := query["usernames"]; ok && v != "" { + arr := strings.Split(v, ",") + tx = tx.Where("username in ?", arr) + // 勾选时,pageSize为勾选的数量 + query["pageSize"] = fmt.Sprint(len(arr)) + } + + var total int64 = 0 + rows := []model.UDMVOIPUser{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return total, rows + } + + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("username asc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r UDMVOIPUser) SelectList(u model.UDMVOIPUser) []model.UDMVOIPUser { + tx := db.DB("").Model(&model.UDMVOIPUser{}) + // 查询条件拼接 + if u.UserName != "" { + tx = tx.Where("username = ?", u.UserName) + } + if u.NeId != "" { + tx = tx.Where("ne_id = ?", u.NeId) + } + + // 查询数据 + arr := []model.UDMVOIPUser{} + if err := tx.Order("username asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByUserNameAndNeID 通过username和ne_id查询 +func (r UDMVOIPUser) SelectByUserNameAndNeID(username, neId string) model.UDMVOIPUser { + tx := db.DB("").Model(&model.UDMVOIPUser{}) + item := model.UDMVOIPUser{} + // 查询条件拼接 + tx = tx.Where("username = ? and ne_id = ?", username, neId) + // 查询数据 + if err := tx.Order("username asc").Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return item +} + +// Insert 批量添加 +func (r UDMVOIPUser) Inserts(uArr []model.UDMVOIPUser) int64 { + tx := db.DB("").CreateInBatches(uArr, 500) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除实体 +func (r UDMVOIPUser) Delete(username, neId string) int64 { + tx := db.DB("").Where("username = ? and ne_id = ?", username, neId).Delete(&model.UDMVOIPUser{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected +} + +// DeletePrefixByUserName 删除前缀匹配的实体 +func (r UDMVOIPUser) DeletePrefixByUserName(username, neId string) int64 { + tx := db.DB("").Where("username like ? and ne_id = ?", fmt.Sprintf("%s%%", username), neId).Delete(&model.UDMVOIPUser{}) + if err := tx.Error; err != nil { + logger.Errorf("DeletePrefixByUserName err => %v", err) + } + return tx.RowsAffected +} diff --git a/src/modules/network_data/repository/udm_volte_ims.go b/src/modules/network_data/repository/udm_volte_ims.go new file mode 100644 index 00000000..0a6d9128 --- /dev/null +++ b/src/modules/network_data/repository/udm_volte_ims.go @@ -0,0 +1,150 @@ +package repository + +import ( + "fmt" + "strings" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 UDMVolteIMSUser 结构体 +var NewUDMVolteIMSUser = &UDMVolteIMSUser{} + +// UDMVolteIMSUser UDMVOIP用户信息表 数据层处理 +type UDMVolteIMSUser struct{} + +// ClearAndInsert 清空ne_id后新增实体 +func (r UDMVolteIMSUser) ClearAndInsert(neId string, uArr []model.UDMVolteIMSUser) int64 { + // 不指定neID时,用 TRUNCATE 清空表快 + // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_volte_ims", nil) + result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVolteIMSUser{}) + if result.Error != nil { + logger.Errorf("Delete err => %v", result.Error) + } + return r.Inserts(uArr) +} + +// SelectPage 根据条件分页查询 +func (r UDMVolteIMSUser) SelectPage(query map[string]string) (int64, []model.UDMVolteIMSUser) { + tx := db.DB("").Model(&model.UDMVolteIMSUser{}) + // 查询条件拼接 + if v, ok := query["imsi"]; ok && v != "" { + tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["msisdn"]; ok && v != "" { + tx = tx.Where("msisdn like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } + if v, ok := query["tag"]; ok && v != "" { + tx = tx.Where("tag = ?", v) + } + if v, ok := query["vni"]; ok && v != "" { + tx = tx.Where("vni like ?", fmt.Sprintf("%%%s%%", v)) + } + if v, ok := query["imsis"]; ok && v != "" { + arr := strings.Split(v, ",") + tx = tx.Where("imsi in ?", arr) + // 勾选时,pageSize为勾选的数量 + query["pageSize"] = fmt.Sprint(len(arr)) + } + + var total int64 = 0 + rows := []model.UDMVolteIMSUser{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return total, rows + } + + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("imsi asc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r UDMVolteIMSUser) SelectList(u model.UDMVolteIMSUser) []model.UDMVolteIMSUser { + tx := db.DB("").Model(&model.UDMVolteIMSUser{}) + // 查询条件拼接 + if u.IMSI != "" { + tx = tx.Where("imsi = ?", u.IMSI) + } + if u.NeId != "" { + tx = tx.Where("ne_id = ?", u.NeId) + } + if u.Tag != "" { + tx = tx.Where("tag = ?", u.Tag) + } + + // 查询数据 + arr := []model.UDMVolteIMSUser{} + if err := tx.Order("user_name asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIMSIAndMSISDNAndNeID 通过imsi,msisdn,ne_id查询 +func (r UDMVolteIMSUser) SelectByIMSIAndMSISDNAndNeID(imsi, msisdn, neId string) model.UDMVolteIMSUser { + tx := db.DB("").Model(&model.UDMVolteIMSUser{}) + item := model.UDMVolteIMSUser{} + // 查询条件拼接 + tx = tx.Where("imsi = ? and msisdn = ? and ne_id = ?", imsi, msisdn, neId) + // 查询数据 + if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return item +} + +// Insert 批量添加 +func (r UDMVolteIMSUser) Inserts(uArr []model.UDMVolteIMSUser) int64 { + tx := db.DB("").CreateInBatches(uArr, 500) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除实体 +func (r UDMVolteIMSUser) Delete(imsi, neId string) int64 { + tx := db.DB("").Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMVolteIMSUser{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected +} + +// DeletePrefixByIMSI 删除前缀匹配的实体 +func (r UDMVolteIMSUser) DeletePrefixByIMSI(imsi, neId string) int64 { + tx := db.DB("").Where("imsi like ? and ne_id = ?", fmt.Sprintf("%s%%", imsi), neId).Delete(&model.UDMVolteIMSUser{}) + if err := tx.Error; err != nil { + logger.Errorf("DeletePrefixByIMSI err => %v", err) + } + return tx.RowsAffected +} diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index 01c3703f..73e94c7d 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -149,7 +149,7 @@ func (r *UDMAuthUser) InsertData(neId, dataType string, data any) int64 { var num int64 = 0 for prefix := range prefixes { // 直接删除前缀的记录 - r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) + r.udmAuthRepository.DeletePrefixByIMSI(prefix, neId) // keys ausf:4600001000004* arr := r.dataByRedis(prefix+"*", neId) if len(arr) > 0 { diff --git a/src/modules/network_data/service/udm_voip.go b/src/modules/network_data/service/udm_voip.go new file mode 100644 index 00000000..6991f484 --- /dev/null +++ b/src/modules/network_data/service/udm_voip.go @@ -0,0 +1,168 @@ +package service + +import ( + "fmt" + "strconv" + "strings" + + "be.ems/src/framework/database/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" +) + +// 实例化服务层 UDMVOIPUser 结构体 +var NewUDMVOIPUser = &UDMVOIPUser{ + udmVOIPRepository: repository.NewUDMVOIPUser, +} + +// UDMVOIP信息 服务层处理 +type UDMVOIPUser struct { + // UDMVOIP信息数据信息 + udmVOIPRepository *repository.UDMVOIPUser +} + +// dataByRedis UDMVOIP用户 db:0 中 voip:* +func (r UDMVOIPUser) dataByRedis(username, neId string) []model.UDMVOIPUser { + arr := []model.UDMVOIPUser{} + key := fmt.Sprintf("voip:%s", username) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + voipArr, err := redis.GetKeys(source, key) + if err != nil { + return arr + } + mkv, err := redis.GetHashBatch(source, voipArr) + if err != nil { + return arr + } + + for k, m := range mkv { + // 跳过-号数据 voip:360000100000130 + username, hasPrefix := strings.CutPrefix(k, "voip:") + if strings.Contains(username, "-") || !hasPrefix { + continue + } + + a := model.UDMVOIPUser{ + NeId: neId, + UserName: username, + Password: m["password"], + } + arr = append(arr, a) + } + return arr +} + +// ResetData 重置VOIP用户数据,清空数据库重新同步Redis数据 +func (r UDMVOIPUser) ResetData(neId string) int64 { + arr := r.dataByRedis("*", neId) + // 数据清空后添加 + go r.udmVOIPRepository.ClearAndInsert(neId, arr) + return int64(len(arr)) +} + +// ParseInfo 解析单个用户userName信息 data从命令MML得到的结果 +func (r UDMVOIPUser) ParseInfo(userName, neId string, data map[string]string) model.UDMVOIPUser { + u := r.udmVOIPRepository.SelectByUserNameAndNeID(userName, neId) + + // 用于更新 + u.NeId = neId + u.UserName = data["username"] + u.Password = data["password"] + return u +} + +// FindByPage 分页查询数据库 +func (r UDMVOIPUser) FindByPage(query map[string]string) (int64, []model.UDMVOIPUser) { + return r.udmVOIPRepository.SelectPage(query) +} + +// Find 查询数据库 +func (r UDMVOIPUser) Find(u model.UDMVOIPUser) []model.UDMVOIPUser { + return r.udmVOIPRepository.SelectList(u) +} + +// Insert 从数据中读取后删除username再存入数据库 +func (r UDMVOIPUser) Insert(neId string, u model.UDMVOIPUser) int64 { + uArr := r.dataByRedis(u.UserName, neId) + if len(uArr) > 0 { + r.udmVOIPRepository.Delete(u.UserName, neId) + return r.udmVOIPRepository.Inserts(uArr) + } + return 0 +} + +// InsertData 导入文件数据 dataType目前两种:txt/csv +func (r UDMVOIPUser) InsertData(neId, dataType string, data any) int64 { + // imsi截取前缀,重新获取部分数据 + prefixes := make(map[string]struct{}) + + if dataType == "csv" { + for _, v := range data.([]map[string]string) { + username := v["username"] + if len(username) < 4 { + continue + } + prefix := username[:len(username)-3] + prefixes[prefix] = struct{}{} + } + } + if dataType == "txt" { + for _, v := range data.([][]string) { + username := v[0] + if len(username) < 4 { + continue + } + prefix := username[:len(username)-3] + prefixes[prefix] = struct{}{} + } + } + + // 根据前缀重新加载插入 + var num int64 = 0 + for prefix := range prefixes { + // 直接删除前缀的记录 + r.udmVOIPRepository.DeletePrefixByUserName(prefix, neId) + // keys voip:4600001000004* + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { + num += r.udmVOIPRepository.Inserts(arr) + } + } + return num +} + +// Delete 删除单个不重新加载 +func (r UDMVOIPUser) Delete(username, neId string) int64 { + return r.udmVOIPRepository.Delete(username, neId) +} + +// LoadData 重新加载从username开始num的数据 +func (r UDMVOIPUser) LoadData(neId, username, num string) { + startUserName, _ := strconv.ParseInt(username, 10, 64) + subNum, _ := strconv.ParseInt(num, 10, 64) + var i int64 + for i = 0; i < subNum; i++ { + keyUserName := fmt.Sprintf("%d", startUserName+i) + // 删除原数据 + r.udmVOIPRepository.Delete(keyUserName, neId) + // 加载数据 + arr := r.dataByRedis(keyUserName, neId) + if len(arr) < 1 { + continue + } + r.udmVOIPRepository.Inserts(arr) + } +} diff --git a/src/modules/network_data/service/udm_volte_ims.go b/src/modules/network_data/service/udm_volte_ims.go new file mode 100644 index 00000000..33b3b66c --- /dev/null +++ b/src/modules/network_data/service/udm_volte_ims.go @@ -0,0 +1,194 @@ +package service + +import ( + "fmt" + "strconv" + "strings" + + "be.ems/src/framework/database/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" +) + +// 实例化服务层 UDMVolteIMSUser 结构体 +var NewUDMVolteIMSUser = &UDMVolteIMSUser{ + udmVolteIMSRepository: repository.NewUDMVolteIMSUser, +} + +// UDMVolteIMS信息 服务层处理 +type UDMVolteIMSUser struct { + // UDMVolteIMS信息数据信息 + udmVolteIMSRepository *repository.UDMVolteIMSUser +} + +// dataByRedis UDMVolteIMS用户 db:0 中 volte:* +func (r UDMVolteIMSUser) dataByRedis(imsi, neId string) []model.UDMVolteIMSUser { + arr := []model.UDMVolteIMSUser{} + key := fmt.Sprintf("volte:%s", imsi) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + volteArr, err := redis.GetKeys(source, key) + if err != nil { + return arr + } + mkv, err := redis.GetHashBatch(source, volteArr) + if err != nil { + return arr + } + + for k, m := range mkv { + // volte:360000100000130:8612300000130 + keys := strings.Split(k, ":") + if len(keys) != 3 { + continue + } + + // "110011200004217@ims.mnc001.mcc110.3gppnetwork.org" + vni := "" + impiParts := strings.Split(m["impi"], "@") + if len(impiParts) > 1 { + vni = impiParts[1] + } + + a := model.UDMVolteIMSUser{ + NeId: neId, + IMSI: keys[1], + MSISDN: keys[2], + Tag: m["tag"], // volte = tag + VNI: vni, + } + arr = append(arr, a) + } + return arr +} + +// ResetData 重置VolteIMS用户数据,清空数据库重新同步Redis数据 +func (r UDMVolteIMSUser) ResetData(neId string) int64 { + authArr := r.dataByRedis("*", neId) + // 数据清空后添加 + go r.udmVolteIMSRepository.ClearAndInsert(neId, authArr) + return int64(len(authArr)) +} + +// ParseInfo 解析单个用户imsi信息 data从命令MML得到的结果 +func (r UDMVolteIMSUser) ParseInfo(neId string, data map[string]string) model.UDMVolteIMSUser { + // "110011200004217@ims.mnc001.mcc110.3gppnetwork.org" + vni := "" + impiParts := strings.Split(data["impi"], "@") + if len(impiParts) > 1 { + vni = impiParts[1] + } + if vni == "" { + return model.UDMVolteIMSUser{} + } + + u := model.UDMVolteIMSUser{ + NeId: neId, + IMSI: data["imsi"], + MSISDN: data["msisdn"], + Tag: data["volte_tag"], + VNI: vni, + } + // 赋予ID + item := r.udmVolteIMSRepository.SelectByIMSIAndMSISDNAndNeID(u.IMSI, u.MSISDN, neId) + if item.ID != "" { + u.ID = item.ID + } + return u +} + +// FindByPage 分页查询数据库 +func (r UDMVolteIMSUser) FindByPage(query map[string]string) (int64, []model.UDMVolteIMSUser) { + return r.udmVolteIMSRepository.SelectPage(query) +} + +// Find 查询数据库 +func (r UDMVolteIMSUser) Find(u model.UDMVolteIMSUser) []model.UDMVolteIMSUser { + return r.udmVolteIMSRepository.SelectList(u) +} + +// InsertByIMSI 从数据中读取后删除imsi再存入数据库 +// imsi长度15 +func (r UDMVolteIMSUser) InsertByIMSI(imsi, neId string) int64 { + uArr := r.dataByRedis(imsi+":*", neId) + if len(uArr) > 0 { + r.udmVolteIMSRepository.Delete(imsi, neId) + return r.udmVolteIMSRepository.Inserts(uArr) + } + return 0 +} + +// InsertData 导入文件数据 dataType目前两种:txt/csv +func (r UDMVolteIMSUser) InsertData(neId, dataType string, data any) int64 { + // imsi截取前缀,重新获取部分数据 + prefixes := make(map[string]struct{}) + + if dataType == "csv" { + for _, v := range data.([]map[string]string) { + imsi := v["imsi"] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + if dataType == "txt" { + for _, v := range data.([][]string) { + imsi := v[0] + if len(imsi) < 6 { + continue + } + prefix := imsi[:len(imsi)-4] + prefixes[prefix] = struct{}{} + } + } + + // 根据前缀重新加载插入 + var num int64 = 0 + for prefix := range prefixes { + // 直接删除前缀的记录 + r.udmVolteIMSRepository.DeletePrefixByIMSI(prefix, neId) + // keys voip:4600001000004* + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { + num += r.udmVolteIMSRepository.Inserts(arr) + } + } + return num +} + +// Delete 删除单个不重新加载 +func (r UDMVolteIMSUser) Delete(imsi, neId string) int64 { + return r.udmVolteIMSRepository.Delete(imsi, neId) +} + +// LoadData 重新加载从imsi开始num的数据 +func (r UDMVolteIMSUser) LoadData(neId, imsi, num string) { + startIMSI, _ := strconv.ParseInt(imsi, 10, 64) + subNum, _ := strconv.ParseInt(num, 10, 64) + var i int64 + for i = 0; i < subNum; i++ { + keyIMSI := fmt.Sprintf("%015d", startIMSI+i) + // 删除原数据 + r.udmVolteIMSRepository.Delete(keyIMSI, neId) + // 加载数据 + arr := r.dataByRedis(keyIMSI+":*", neId) + if len(arr) < 1 { + continue + } + r.udmVolteIMSRepository.Inserts(arr) + } +}