diff --git a/apps/src/api/legacy/app-system.ts b/apps/src/api/legacy/app-system.ts index 0f39d8d..ca037d6 100644 --- a/apps/src/api/legacy/app-system.ts +++ b/apps/src/api/legacy/app-system.ts @@ -111,6 +111,25 @@ export interface LegacyEmojiItem { type?: string; } +export interface AppHomePopupItem { + createTime?: string; + description?: string; + enabled?: boolean; + id?: string; + image?: string; + jumpType?: string; + jumpUrl?: string; + limitDays?: number; + name?: string; + popupKey?: string; + priority?: number; + scene?: string; + sysOrigin?: string; + title?: string; + updateTime?: string; + version?: number; +} + export async function loginLoggerPage(params: Record) { return requestClient.get('/user/login/logger/page', { params, @@ -213,6 +232,24 @@ export async function delConfig(id: number | string) { return requestClient.delete(`/sys/enum/config/${id}`); } +export async function pageAppHomePopups(params: Record) { + return requestClient.get>( + '/go/app-system/home-popups/configs', + { params }, + ); +} + +export async function saveAppHomePopup(data: Record) { + return requestClient.post( + '/go/app-system/home-popups/configs/save', + data, + ); +} + +export async function deleteAppHomePopup(id: number | string) { + return requestClient.delete(`/go/app-system/home-popups/configs/${id}`); +} + export async function getEnumConfigByGroup(group: string) { return requestClient.get<{ result: LegacyEnumConfigItem[] }>( `/sys/enum/config/list/${group}`, diff --git a/apps/src/api/legacy/resident-activity.ts b/apps/src/api/legacy/resident-activity.ts index 5584549..c88735f 100644 --- a/apps/src/api/legacy/resident-activity.ts +++ b/apps/src/api/legacy/resident-activity.ts @@ -9,6 +9,8 @@ const ROOM_TURNOVER_REWARD_BASE = '/go/resident-activity/room-turnover-reward'; const VIP_BASE = '/go/resident-activity/vip'; const RECHARGE_REWARD_BASE = '/go/resident-activity/recharge-reward'; +const TASK_CENTER_BASE = '/go/resident-activity/task-center'; +const VOICE_ROOM_RED_PACKET_BASE = '/go/resident-activity/voice-room-red-packet'; export async function getResidentInviteConfig(sysOrigin: string) { return requestClient.get>('/resident-activity/invite/config', { @@ -119,6 +121,63 @@ export async function pageResidentRechargeRewardClaimRecords( ); } +export async function getResidentDailyTaskConfig( + sysOrigin: string, + taskCategory = 'DAILY', +) { + return requestClient.get>(`${TASK_CENTER_BASE}/config`, { + params: { sysOrigin, taskCategory }, + }); +} + +export async function saveResidentDailyTaskConfig(data: Record) { + return requestClient.post>(`${TASK_CENTER_BASE}/config/save`, { + ...data, + taskCategory: data.taskCategory || 'DAILY', + }); +} + +export async function pageResidentDailyTaskClaimRecords( + params: Record, +) { + return requestClient.get>( + `${TASK_CENTER_BASE}/claim-record/page`, + { params: { ...params, taskCategory: params.taskCategory || 'DAILY' } }, + ); +} + +export async function pageResidentDailyTaskEvents(params: Record) { + return requestClient.get>(`${TASK_CENTER_BASE}/event/page`, { + params: { ...params, taskCategory: params.taskCategory || 'DAILY' }, + }); +} + +export async function getVoiceRoomRedPacketConfig(sysOrigin: string) { + return requestClient.get>(`${VOICE_ROOM_RED_PACKET_BASE}/config`, { + params: { sysOrigin }, + }); +} + +export async function saveVoiceRoomRedPacketConfig(data: Record) { + return requestClient.post>( + `${VOICE_ROOM_RED_PACKET_BASE}/config/save`, + data, + ); +} + +export async function pageVoiceRoomRedPacketRecords(params: Record) { + return requestClient.get>(`${VOICE_ROOM_RED_PACKET_BASE}/records`, { + params, + }); +} + +export async function retryVoiceRoomRedPacketRefund(packetNo: string) { + return requestClient.post>( + `${VOICE_ROOM_RED_PACKET_BASE}/refund/retry`, + { packetNo }, + ); +} + export async function pageSpecifiedGiftWeeklyRankConfigs(params: Record) { return requestClient.get>>( `${SPECIFIED_GIFT_WEEKLY_RANK_BASE}/config/page`, diff --git a/apps/src/api/legacy/system.ts b/apps/src/api/legacy/system.ts index 97e3625..6be9f91 100644 --- a/apps/src/api/legacy/system.ts +++ b/apps/src/api/legacy/system.ts @@ -176,6 +176,23 @@ export async function resetRegionWithdrawal(regionId: number | string) { }); } +export async function listVoiceRoomRegionImGroups(params: Record) { + return requestClient.get>>( + '/go/region/config/im-groups', + { + params, + }, + ); +} + +export async function saveVoiceRoomRegionImGroup(data: Record) { + return requestClient.post('/go/region/config/im-groups/save', data); +} + +export async function createVoiceRoomRegionImGroup(data: Record) { + return requestClient.post('/go/region/config/im-groups/create', data); +} + export async function regionAssistConfigTable(params: Record) { return requestClient.get>>( '/region/assist/config/list', diff --git a/apps/src/router/routes/modules/app-system.ts b/apps/src/router/routes/modules/app-system.ts index eec1764..66315ca 100644 --- a/apps/src/router/routes/modules/app-system.ts +++ b/apps/src/router/routes/modules/app-system.ts @@ -16,6 +16,12 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/app-system/login-logger.vue'), meta: { title: '登陆日志' }, }, + { + name: 'AppSystemHomePopupManager', + path: 'home-popups', + component: () => import('#/views/app-system/home-popup-manager.vue'), + meta: { title: '首页弹窗管理' }, + }, { name: 'AppSystemRoomBlacklist', path: 'log/blacklist', diff --git a/apps/src/router/routes/modules/resident-activity.ts b/apps/src/router/routes/modules/resident-activity.ts index 50b2aca..44e70fa 100644 --- a/apps/src/router/routes/modules/resident-activity.ts +++ b/apps/src/router/routes/modules/resident-activity.ts @@ -29,6 +29,18 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/resident-activity/recharge-reward-config.vue'), meta: { title: '充值奖励配置' }, }, + { + name: 'ResidentDailyTaskConfig', + path: 'daily-task/config', + component: () => import('#/views/resident-activity/daily-task-config.vue'), + meta: { title: '每日任务' }, + }, + { + name: 'ResidentVoiceRoomRedPacket', + path: 'voice-room-red-packet', + component: () => import('#/views/resident-activity/voice-room-red-packet.vue'), + meta: { title: '红包' }, + }, { name: 'ResidentRegisterRewardConfig', path: 'register-reward/config', diff --git a/apps/src/router/routes/modules/system.ts b/apps/src/router/routes/modules/system.ts index 1a4a833..37ef22c 100644 --- a/apps/src/router/routes/modules/system.ts +++ b/apps/src/router/routes/modules/system.ts @@ -10,12 +10,6 @@ const routes: RouteRecordRaw[] = [ name: 'SystemManager', path: '/sys/manager', children: [ - { - name: 'SystemRegionConfig', - path: 'region/config', - component: () => import('#/views/system/region-config.vue'), - meta: { title: '区域配置' }, - }, { name: 'SystemUserManager', path: 'user', diff --git a/apps/src/router/routes/modules/team.ts b/apps/src/router/routes/modules/team.ts index 6f11647..8190455 100644 --- a/apps/src/router/routes/modules/team.ts +++ b/apps/src/router/routes/modules/team.ts @@ -28,6 +28,13 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/team/team-list.vue'), meta: { title: '团队列表' }, }, + { + name: 'SystemRegionConfig', + path: 'region/config', + alias: '/sys/manager/region/config', + component: () => import('#/views/system/region-config.vue'), + meta: { title: '区域配置' }, + }, { name: 'TeamMemberList', path: 'team/member', diff --git a/apps/src/views/app-system/home-popup-manager.vue b/apps/src/views/app-system/home-popup-manager.vue new file mode 100644 index 0000000..01dfbd4 --- /dev/null +++ b/apps/src/views/app-system/home-popup-manager.vue @@ -0,0 +1,407 @@ + + + + + + diff --git a/apps/src/views/resident-activity/daily-task-config.vue b/apps/src/views/resident-activity/daily-task-config.vue new file mode 100644 index 0000000..d3092fa --- /dev/null +++ b/apps/src/views/resident-activity/daily-task-config.vue @@ -0,0 +1,682 @@ + + + + + diff --git a/apps/src/views/resident-activity/voice-room-red-packet.vue b/apps/src/views/resident-activity/voice-room-red-packet.vue new file mode 100644 index 0000000..a23f7e2 --- /dev/null +++ b/apps/src/views/resident-activity/voice-room-red-packet.vue @@ -0,0 +1,494 @@ + + + + + diff --git a/apps/src/views/system/region-config.vue b/apps/src/views/system/region-config.vue index f5a6466..c13cd27 100644 --- a/apps/src/views/system/region-config.vue +++ b/apps/src/views/system/region-config.vue @@ -10,8 +10,10 @@ import InlineFilterToolbar from '#/views/_shared/inline-filter-toolbar.vue'; import { addRegionAssistConfig, addRegionConfig, + createVoiceRoomRegionImGroup, deleteRegionAssistConfig, getCountryAlls, + listVoiceRoomRegionImGroups, regionAssistConfigTable, regionConfigTable, resetRegionWithdrawal, @@ -45,6 +47,7 @@ import { Table, TabPane, Tabs, + Tag, TextArea, Tooltip, message, @@ -241,13 +244,16 @@ const accessStore = useAccessStore(); const activeTab = ref('region'); const loadingRegion = ref(false); const loadingAssist = ref(false); +const loadingImGroup = ref(false); const savingRegion = ref(false); const savingAssist = ref(false); +const creatingImGroupCode = ref(''); const regionDrawerOpen = ref(false); const assistDrawerOpen = ref(false); const regionList = ref>>([]); const assistList = ref>>([]); +const imGroupList = ref>>([]); const regionOptions = ref>>([]); const countries = ref>>([]); @@ -255,6 +261,10 @@ const regionQuery = reactive({ sysOrigin: '', }); +const imGroupQuery = reactive({ + sysOrigin: '', +}); + const assistQuery = reactive({ regionId: '', sysOrigin: '', @@ -295,6 +305,18 @@ const assistColumns = [ { dataIndex: 'actions', key: 'actions', title: '操作', width: 140 }, ]; +const imGroupColumns = [ + { dataIndex: 'regionCode', key: 'regionCode', title: '区域编码', width: 140 }, + { dataIndex: 'regionName', key: 'regionName', title: '区域', width: 160 }, + { dataIndex: 'countryCodes', key: 'countryCodes', title: '国家', width: 220 }, + { dataIndex: 'groupId', key: 'groupId', title: 'IM 群组 ID', width: 220 }, + { dataIndex: 'groupName', key: 'groupName', title: 'IM 群组名称', width: 240 }, + { dataIndex: 'status', key: 'status', title: '状态', width: 120 }, + { dataIndex: 'lastError', key: 'lastError', title: '错误信息', width: 260 }, + { dataIndex: 'updateTime', key: 'updateTime', title: '更新时间', width: 180 }, + { dataIndex: 'actions', key: 'actions', title: '操作', width: 140 }, +]; + const specialAssistTypes = new Set([ 'WITHDRAW_PROPORTION_TIPS', 'COIN_SELLER_WITHDRAW_PROPORTION_TIPS', @@ -340,6 +362,9 @@ watch( if (!assistQuery.sysOrigin) { assistQuery.sysOrigin = options[0]?.value ?? 'LIKEI'; } + if (!imGroupQuery.sysOrigin) { + imGroupQuery.sysOrigin = options[0]?.value ?? 'LIKEI'; + } }, { immediate: true }, ); @@ -353,6 +378,15 @@ watch( { immediate: true }, ); +watch( + () => activeTab.value, + (tab) => { + if (tab === 'imGroup' && imGroupList.value.length === 0) { + loadImGroupList(); + } + }, +); + function assignRegionForm(target: ReturnType) { Object.assign(regionForm, cloneValue(target)); } @@ -501,6 +535,58 @@ async function loadAssistList() { } } +async function loadImGroupList() { + if (!imGroupQuery.sysOrigin) { + imGroupList.value = []; + return; + } + loadingImGroup.value = true; + try { + const [regions, groups] = await Promise.all([ + regionConfigTable({ sysOrigin: imGroupQuery.sysOrigin }), + listVoiceRoomRegionImGroups({ sysOrigin: imGroupQuery.sysOrigin }), + ]); + const groupMap = new Map( + (groups || []).map((item) => [String(item.regionCode || ''), item]), + ); + const seen = new Set(); + const rows: Array> = (regions || []).map((region) => { + const regionCode = String(region.regionCode || ''); + const group = groupMap.get(regionCode) || {}; + seen.add(regionCode); + return { + ...region, + configured: Boolean(group.configured), + groupId: group.groupId || '', + groupName: group.groupName || '', + lastError: group.lastError || '', + status: group.status || '', + updateTime: group.updateTime || '', + }; + }); + for (const group of groups || []) { + const regionCode = String(group.regionCode || ''); + if (seen.has(regionCode)) { + continue; + } + rows.push({ + configured: Boolean(group.configured), + countryCodes: '', + groupId: group.groupId || '', + groupName: group.groupName || '', + lastError: group.lastError || '', + regionCode, + regionName: group.regionName || regionCode, + status: group.status || '', + updateTime: group.updateTime || '', + }); + } + imGroupList.value = rows; + } finally { + loadingImGroup.value = false; + } +} + async function loadCountryOptions() { countries.value = (await getCountryAlls()) || []; } @@ -527,6 +613,9 @@ async function handleSaveRegion() { regionDrawerOpen.value = false; await loadRegionList(); await loadRegionOptions(); + if (activeTab.value === 'imGroup') { + await loadImGroupList(); + } } finally { savingRegion.value = false; } @@ -601,6 +690,46 @@ function handleResetWithdrawal(row: Record) { }); } +function getImGroupStatusText(row: Record) { + if (row.configured || row.status === 'ACTIVE') { + return '已创建'; + } + if (row.status === 'FAILED') { + return '创建失败'; + } + return '未创建'; +} + +function getImGroupStatusColor(row: Record) { + if (row.configured || row.status === 'ACTIVE') { + return 'green'; + } + if (row.status === 'FAILED') { + return 'red'; + } + return 'default'; +} + +function handleCreateImGroup(row: Record) { + Modal.confirm({ + async onOk() { + creatingImGroupCode.value = row.regionCode; + try { + await createVoiceRoomRegionImGroup({ + regionCode: row.regionCode, + regionName: row.regionName, + sysOrigin: imGroupQuery.sysOrigin, + }); + message.success('创建成功'); + await loadImGroupList(); + } finally { + creatingImGroupCode.value = ''; + } + }, + title: `确认创建 ${row.regionName || row.regionCode} 的 IM 群组?`, + }); +} + function openAssistCreate() { assistDrawerTitle.value = '添加'; fillAssistForm(); @@ -690,6 +819,59 @@ loadCountryOptions(); + + + + + + + + + + + +
+
+
+ @@ -1028,6 +1210,16 @@ loadCountryOptions(); color: var(--color-primary); } +.error-text { + color: #cf1322; + display: inline-block; + max-width: 220px; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: middle; + white-space: nowrap; +} + .metadata-group { display: flex; flex-direction: column; diff --git a/scripts/sql/sync_admin_app_home_popup_menu.sql b/scripts/sql/sync_admin_app_home_popup_menu.sql new file mode 100644 index 0000000..ce2d3ab --- /dev/null +++ b/scripts/sql/sync_admin_app_home_popup_menu.sql @@ -0,0 +1,93 @@ +SET NAMES utf8mb4; + +INSERT INTO sys_menu ( + id, + parent_id, + menu_name, + path, + menu_type, + icon, + create_user, + update_user, + sort, + status, + router, + alias +) +SELECT + 1700000268, + parent_menu.id, + '首页弹窗管理', + 'app-system/home-popup-manager', + 2, + 'form', + '0', + '0', + 2, + 0, + 'home-popups', + 'AppSystemHomePopupManager' +FROM ( + SELECT id + FROM sys_menu + WHERE alias = 'AppSystemManager' + OR alias = 'AppSysManager' + OR path = '/app/sys/mamange' + OR router = '/app/sys/mamange' + ORDER BY id + LIMIT 1 +) AS parent_menu +WHERE NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE alias = 'AppSystemHomePopupManager' +); + +UPDATE sys_menu +SET + parent_id = ( + SELECT parent_menu.id + FROM ( + SELECT id + FROM sys_menu + WHERE alias = 'AppSystemManager' + OR alias = 'AppSysManager' + OR path = '/app/sys/mamange' + OR router = '/app/sys/mamange' + ORDER BY id + LIMIT 1 + ) AS parent_menu + ), + menu_name = '首页弹窗管理', + path = 'app-system/home-popup-manager', + menu_type = 2, + icon = 'form', + create_user = '0', + update_user = '0', + sort = 2, + status = 0, + router = 'home-popups' +WHERE alias = 'AppSystemHomePopupManager'; + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT DISTINCT + parent_role.role_id, + target_menu.id +FROM sys_role_menu AS parent_role +JOIN sys_menu AS target_menu + ON target_menu.alias = 'AppSystemHomePopupManager' +LEFT JOIN sys_role_menu AS existing_role_menu + ON existing_role_menu.role_id = parent_role.role_id + AND existing_role_menu.menu_id = target_menu.id +WHERE parent_role.menu_id = ( + SELECT parent_menu.id + FROM ( + SELECT id + FROM sys_menu + WHERE alias = 'AppSystemManager' + OR alias = 'AppSysManager' + OR path = '/app/sys/mamange' + OR router = '/app/sys/mamange' + ORDER BY id + LIMIT 1 + ) AS parent_menu + ) + AND existing_role_menu.id IS NULL; diff --git a/scripts/sql/sync_admin_resident_activity_and_baishun_menu.sql b/scripts/sql/sync_admin_resident_activity_and_baishun_menu.sql index f15dca9..338d31e 100644 --- a/scripts/sql/sync_admin_resident_activity_and_baishun_menu.sql +++ b/scripts/sql/sync_admin_resident_activity_and_baishun_menu.sql @@ -416,6 +416,59 @@ SET router = 'recharge-reward/config' WHERE alias = 'ResidentRechargeRewardConfig'; +INSERT INTO sys_menu ( + id, + parent_id, + menu_name, + path, + menu_type, + icon, + create_user, + update_user, + sort, + status, + router, + alias +) +SELECT + 1700000263, + (SELECT id FROM sys_menu WHERE alias = 'ResidentActivityManager' LIMIT 1), + '每日任务', + 'resident-activity/daily-task-config/index', + 2, + 'form', + '0', + '0', + 8, + 0, + 'daily-task/config', + 'ResidentDailyTaskConfig' +WHERE NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE alias = 'ResidentDailyTaskConfig' +); + +UPDATE sys_menu +SET + parent_id = ( + SELECT resident_menu.id + FROM ( + SELECT id + FROM sys_menu + WHERE alias = 'ResidentActivityManager' + LIMIT 1 + ) AS resident_menu + ), + menu_name = '每日任务', + path = 'resident-activity/daily-task-config/index', + menu_type = 2, + icon = 'form', + create_user = '0', + update_user = '0', + sort = 8, + status = 0, + router = 'daily-task/config' +WHERE alias = 'ResidentDailyTaskConfig'; + INSERT INTO sys_menu ( id, parent_id, @@ -559,6 +612,7 @@ JOIN sys_menu AS target_menu 'ResidentSpecifiedGiftWeeklyRank', 'ResidentVipConfig', 'ResidentRechargeRewardConfig', + 'ResidentDailyTaskConfig', 'OperateGameManager', 'GameConfig', 'OperateBaishunGameManage' @@ -569,6 +623,21 @@ LEFT JOIN sys_role_menu AS existing_role_menu WHERE parent_role.menu_id = 1700000057 AND existing_role_menu.id IS NULL; +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT DISTINCT + parent_role.role_id, + target_menu.id +FROM sys_role_menu AS parent_role +JOIN sys_menu AS parent_menu + ON parent_menu.id = parent_role.menu_id + AND parent_menu.alias = 'ResidentActivityManager' +JOIN sys_menu AS target_menu + ON target_menu.alias = 'ResidentDailyTaskConfig' +LEFT JOIN sys_role_menu AS existing_role_menu + ON existing_role_menu.role_id = parent_role.role_id + AND existing_role_menu.menu_id = target_menu.id +WHERE existing_role_menu.id IS NULL; + UPDATE sys_menu SET menu_name = CONVERT(0xE5B8B8E9A9BBE6B4BBE58AA8 USING utf8mb4) WHERE alias = 'ResidentActivityManager'; @@ -601,6 +670,10 @@ UPDATE sys_menu SET menu_name = CONVERT(0xE58585E580BCE5A596E58AB1E9858DE7BDAE USING utf8mb4) WHERE alias = 'ResidentRechargeRewardConfig'; +UPDATE sys_menu +SET menu_name = CONVERT(0xE6AF8FE697A5E4BBBBE58AA1 USING utf8mb4) +WHERE alias = 'ResidentDailyTaskConfig'; + UPDATE sys_menu SET menu_name = CONVERT(0xE6B8B8E6888FE7AEA1E79086 USING utf8mb4) WHERE alias = 'OperateGameManager'; @@ -612,3 +685,71 @@ WHERE alias = 'GameConfig'; UPDATE sys_menu SET menu_name = CONVERT(0xE799BEE9A1BAE9858DE7BDAE USING utf8mb4) WHERE alias = 'OperateBaishunGameManage'; + +SET @resident_activity_id := ( + SELECT id FROM sys_menu WHERE alias = 'ResidentActivityManager' LIMIT 1 +); + +INSERT INTO sys_menu ( + id, + parent_id, + menu_name, + path, + menu_type, + icon, + create_user, + update_user, + sort, + status, + router, + alias +) +SELECT + next_id, + @resident_activity_id, + CONVERT(0xE7BAA2E58C85 USING utf8mb4), + 'resident-activity/voice-room-red-packet', + 2, + 'form', + '0', + '0', + 9, + 0, + 'voice-room-red-packet', + 'ResidentVoiceRoomRedPacket' +FROM ( + SELECT COALESCE(MAX(id), 1700000000) + 1 AS next_id + FROM sys_menu +) AS menu_id +WHERE NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE alias = 'ResidentVoiceRoomRedPacket' +); + +UPDATE sys_menu +SET + parent_id = @resident_activity_id, + menu_name = CONVERT(0xE7BAA2E58C85 USING utf8mb4), + path = 'resident-activity/voice-room-red-packet', + menu_type = 2, + icon = 'form', + create_user = '0', + update_user = '0', + sort = 9, + status = 0, + router = 'voice-room-red-packet' +WHERE alias = 'ResidentVoiceRoomRedPacket'; + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT DISTINCT + parent_role.role_id, + target_menu.id +FROM sys_role_menu AS parent_role +JOIN sys_menu AS parent_menu + ON parent_menu.id = parent_role.menu_id + AND parent_menu.alias = 'ResidentActivityManager' +JOIN sys_menu AS target_menu + ON target_menu.alias = 'ResidentVoiceRoomRedPacket' +LEFT JOIN sys_role_menu AS existing_role_menu + ON existing_role_menu.role_id = parent_role.role_id + AND existing_role_menu.menu_id = target_menu.id +WHERE existing_role_menu.id IS NULL; diff --git a/scripts/sql/sync_team_region_config_menu.sql b/scripts/sql/sync_team_region_config_menu.sql new file mode 100644 index 0000000..523fba3 --- /dev/null +++ b/scripts/sql/sync_team_region_config_menu.sql @@ -0,0 +1,76 @@ +SET NAMES utf8mb4; + +SET @team_manager_id := ( + SELECT id FROM sys_menu WHERE alias = 'TeamManager' LIMIT 1 +); + +UPDATE sys_menu +SET + parent_id = @team_manager_id, + menu_name = '区域配置', + path = 'team/region-config/index', + menu_type = 2, + icon = 'form', + update_user = '0', + sort = 213, + status = 0, + router = 'region/config' +WHERE alias = 'SystemRegionConfig'; + +UPDATE sys_menu +SET + parent_id = @team_manager_id, + menu_name = '区域配置', + path = 'team/region-config/index', + menu_type = 2, + icon = 'form', + update_user = '0', + sort = 213, + status = 0, + router = 'region/config', + alias = 'SystemRegionConfig' +WHERE alias = 'RegionConfig' + AND NOT EXISTS ( + SELECT 1 + FROM ( + SELECT id FROM sys_menu WHERE alias = 'SystemRegionConfig' LIMIT 1 + ) AS existing_region_config + ); + +INSERT INTO sys_menu ( + id, + parent_id, + menu_name, + path, + menu_type, + icon, + create_user, + update_user, + sort, + status, + router, + alias +) +SELECT + next_id, + @team_manager_id, + '区域配置', + 'team/region-config/index', + 2, + 'form', + '0', + '0', + 213, + 0, + 'region/config', + 'SystemRegionConfig' +FROM ( + SELECT COALESCE(MAX(id), 1700000000) + 1 AS next_id + FROM sys_menu +) AS menu_id +WHERE NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE alias = 'SystemRegionConfig' +) +AND NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE id = 1700000089 +);