调整:提升业务菜单为一级目录

This commit is contained in:
焦龙言
2026-07-27 20:30:18 +08:00
parent 9a9c57578d
commit 619f3d5d63
3 changed files with 60 additions and 29 deletions
@@ -6,6 +6,7 @@ from pathlib import Path
SQL_ROOT = Path(__file__).resolve().parents[2] / 'sql'
INITIALIZERS = ('shierfeng-fastapi.sql', 'shierfeng-fastapi-pg.sql')
PATCH_PATH = SQL_ROOT / 'patches/20260724_pallet_workflow_mysql.sql'
MENU_PROMOTION_PATCH_PATH = SQL_ROOT / 'patches/20260727_promote_business_menus_mysql.sql'
SYS_MENU_VALUE_COUNT = 20
SYS_MENU_PERMS_INDEX = 13
REMOVED_AI_DICT_CODES = set(range(33, 70))
@@ -492,9 +493,9 @@ EXPECTED_BUTTON_PERMISSIONS = frozenset(
)
EXPECTED_PERMISSIONS = EXPECTED_PAGE_PERMISSIONS | EXPECTED_BUTTON_PERMISSIONS
BUSINESS_MENU_SPECS = """
121|1|基础资料维护|businessMaster||10||<NULL>
122|1|业务管理|businessOperation||11||<NULL>
123|1|报表查询|businessReport||12||<NULL>
121|0|基础资料维护|businessMaster||1||<NULL>
122|0|业务管理|businessOperation||2||<NULL>
123|0|报表查询|businessReport||3||<NULL>
502|121|菌种资料|strain||1|master:strain:list|master/strain/index
503|121|客户资料|customer||2|master:customer:list|master/customer/index
504|121|客户现场|site||3|master:site:list|master/site/index
@@ -576,6 +577,20 @@ def _expected_business_menu_fields() -> dict[int, tuple]:
EXPECTED_BUSINESS_MENU_FIELDS = _expected_business_menu_fields()
LEGACY_PATCH_BUSINESS_MENU_FIELDS = EXPECTED_BUSINESS_MENU_FIELDS | {
121: (1, '基础资料维护', 'businessMaster', '', 10, '', None),
122: (1, '业务管理', 'businessOperation', '', 11, '', None),
123: (1, '报表查询', 'businessReport', '', 12, '', None),
}
EXPECTED_TOP_LEVEL_MENU_POSITIONS = {
121: ('基础资料维护', 0, 1),
122: ('业务管理', 0, 2),
123: ('报表查询', 0, 3),
1: ('系统管理', 0, 4),
2: ('系统监控', 0, 5),
3: ('系统工具', 0, 6),
}
MENU_PROMOTION_IDS = set(EXPECTED_TOP_LEVEL_MENU_POSITIONS)
BUSINESS_MENU_IDS = set(range(121, 124)) | set(range(502, 519)) | set(range(1065, 1109))
MYSQL_MENU_STABLE_COLUMNS = (
'menu_name',
@@ -842,16 +857,24 @@ def _is_postgres_naive_timestamp_with_default_precision(definition: str) -> bool
)
def _business_menu_rows(sql: str) -> dict[int, list]:
def _menu_rows(sql: str, menu_ids: set[int]) -> dict[int, list]:
rows = _insert_rows(sql, 'sys_menu')
selected = [row for row in rows if row and str(row[0]).isdigit() and int(row[0]) in BUSINESS_MENU_IDS]
counts = {menu_id: sum(int(row[0]) == menu_id for row in selected) for menu_id in BUSINESS_MENU_IDS}
if set(counts) != BUSINESS_MENU_IDS or any(count != 1 for count in counts.values()):
raise AssertionError(f'business menu row counts differ: {counts}')
selected = [row for row in rows if row and str(row[0]).isdigit() and int(row[0]) in menu_ids]
counts = {menu_id: sum(int(row[0]) == menu_id for row in selected) for menu_id in menu_ids}
if set(counts) != menu_ids or any(count != 1 for count in counts.values()):
raise AssertionError(f'menu row counts differ: {counts}')
return {int(row[0]): row for row in selected}
def _assert_business_menu_fields(test_case: unittest.TestCase, sql: str) -> None:
def _business_menu_rows(sql: str) -> dict[int, list]:
return _menu_rows(sql, BUSINESS_MENU_IDS)
def _assert_business_menu_fields(
test_case: unittest.TestCase,
sql: str,
expected_fields: dict[int, tuple] = EXPECTED_BUSINESS_MENU_FIELDS,
) -> None:
rows = _business_menu_rows(sql)
invalid_widths = {menu_id: len(row) for menu_id, row in rows.items() if len(row) != SYS_MENU_VALUE_COUNT}
test_case.assertEqual({}, invalid_widths)
@@ -867,7 +890,7 @@ def _assert_business_menu_fields(test_case: unittest.TestCase, sql: str) -> None
)
for menu_id, row in rows.items()
}
test_case.assertEqual(EXPECTED_BUSINESS_MENU_FIELDS, actual)
test_case.assertEqual(expected_fields, actual)
def _assert_business_permission_inventory(test_case: unittest.TestCase, sql: str) -> None:
@@ -944,15 +967,15 @@ class SqlContractTest(unittest.TestCase):
rows = _business_menu_rows(sql)
self.assertTrue(all(len(row) == SYS_MENU_VALUE_COUNT for row in rows.values()))
self.assertEqual(
('基础资料维护', '1', '10', 'businessMaster', 'M', ''),
('基础资料维护', '0', '1', 'businessMaster', 'M', ''),
tuple(rows[121][index] for index in (1, 2, 3, 4, 10, 13)),
)
self.assertEqual(
('业务管理', '1', '11', 'businessOperation', 'M', ''),
('业务管理', '0', '2', 'businessOperation', 'M', ''),
tuple(rows[122][index] for index in (1, 2, 3, 4, 10, 13)),
)
self.assertEqual(
('报表查询', '1', '12', 'businessReport', 'M', ''),
('报表查询', '0', '3', 'businessReport', 'M', ''),
tuple(rows[123][index] for index in (1, 2, 3, 4, 10, 13)),
)
for menu_id in (121, 122, 123):
@@ -975,6 +998,14 @@ class SqlContractTest(unittest.TestCase):
tuple(row[index] for index in (4, 5, 6, 7, 8, 9, 10, 11, 12)),
)
def test_initializers_define_expected_top_level_menu_order(self) -> None:
for filename in INITIALIZERS:
with self.subTest(filename=filename):
sql = (SQL_ROOT / filename).read_text(encoding='utf-8')
rows = _menu_rows(sql, MENU_PROMOTION_IDS)
actual = {menu_id: (row[1], int(row[2]), int(row[3])) for menu_id, row in rows.items()}
self.assertEqual(EXPECTED_TOP_LEVEL_MENU_POSITIONS, actual)
def test_business_permission_inventory_rejects_duplicate_permission(self) -> None:
sql = (SQL_ROOT / INITIALIZERS[0]).read_text(encoding='utf-8')
sql += """
@@ -1135,11 +1166,11 @@ class SqlContractTest(unittest.TestCase):
self.assertEqual(EXPECTED_UNIQUE_KEYS[table], unique_keys)
self.assertEqual(EXPECTED_FOREIGN_KEYS[table], foreign_keys)
self.assertEqual(EXPECTED_CHECKS[table], checks)
_assert_business_menu_fields(self, raw)
_assert_business_menu_fields(self, raw, LEGACY_PATCH_BUSINESS_MENU_FIELDS)
_assert_business_permission_inventory(self, raw)
patch_rows = _business_menu_rows(raw)
mysql_rows = _business_menu_rows((SQL_ROOT / 'shierfeng-fastapi.sql').read_text(encoding='utf-8'))
compared_indexes = tuple(range(15))
compared_indexes = (0, 1, *range(4, 15))
self.assertEqual(
{menu_id: tuple(row[index] for index in compared_indexes) for menu_id, row in mysql_rows.items()},
{menu_id: tuple(row[index] for index in compared_indexes) for menu_id, row in patch_rows.items()},