更新登录页及优化相关功能

This commit is contained in:
焦龙言
2026-10-08 14:13:05 +08:00
parent 9a14b692e3
commit 56e646bcc1
139 changed files with 77587 additions and 811 deletions
@@ -60,7 +60,7 @@ def integrity_error() -> IntegrityError:
def make_pallet_record(
pallet_id: int,
capacity_packages: int = 20,
capacity_packages: int = 100,
test_batch_id: int | None = None,
) -> SimpleNamespace:
return SimpleNamespace(
@@ -113,7 +113,7 @@ class TestPalletVoContract(unittest.TestCase):
BusinessUserOptionModel.model_validate(value)
def test_pallet_edit_rejects_code_and_qr_token(self) -> None:
base = {'palletId': 1, 'capacityPackages': 20, 'assetStatus': '0'}
base = {'palletId': 1, 'capacityPackages': 100, 'assetStatus': '0'}
for identity_field in ({'palletCode': 'P-001'}, {'qrToken': 'fixed-token'}):
with self.subTest(identity_field=identity_field), self.assertRaises(ValidationError):
PalletEditModel.model_validate({**base, **identity_field})
@@ -147,7 +147,7 @@ class TestPalletMasterDao(unittest.IsolatedAsyncioTestCase):
pallet = BizPallet(
pallet_code='P-001',
qr_token='fixed-token',
capacity_packages=20,
capacity_packages=100,
asset_status='0',
)
inventory = BizPalletInventory(
@@ -179,7 +179,7 @@ class TestPalletMasterDao(unittest.IsolatedAsyncioTestCase):
self.assertNotIn('test_batch_id', compile_sql(statement.whereclause))
async def test_update_pallet_sql_never_contains_identity_fields(self) -> None:
edit = PalletEditModel(palletId=3, capacityPackages=18, assetStatus='1', remark='停用')
edit = PalletEditModel(palletId=3, capacityPackages=100, assetStatus='1', remark='停用')
updated_at = datetime(2026, 7, 26, 10, 30)
await MasterDao.update_pallet(
@@ -193,7 +193,7 @@ class TestPalletMasterDao(unittest.IsolatedAsyncioTestCase):
statement = self.db.execute.await_args.args[0]
sql = compile_sql(statement)
self.assertIn('UPDATE biz_pallet', sql)
self.assertIn('capacity_packages=18', sql)
self.assertIn('capacity_packages=100', sql)
self.assertIn("asset_status='1'", sql)
self.assertIn("remark='停用'", sql)
self.assertIn("update_by='admin'", sql)
@@ -357,7 +357,7 @@ class TestPalletCreationService(unittest.IsolatedAsyncioTestCase):
self.db = MagicMock(spec=AsyncSession)
self.admin = make_admin()
self.scope = TestBatchScope.formal()
self.create = PalletCreateModel(palletCode='P-001', capacityPackages=20, remark='测试托盘')
self.create = PalletCreateModel(palletCode='P-001', capacityPackages=100, remark='测试托盘')
self.fixed_time = datetime(2026, 7, 26, 11, 30)
async def test_add_generates_server_token_and_initial_inventory_in_one_transaction(self) -> None:
@@ -393,7 +393,7 @@ class TestPalletCreationService(unittest.IsolatedAsyncioTestCase):
pallet = captured['pallet']
self.assertEqual('P-001', pallet.pallet_code)
self.assertEqual('server-fixed-token', pallet.qr_token)
self.assertEqual(20, pallet.capacity_packages)
self.assertEqual(100, pallet.capacity_packages)
self.assertEqual('0', pallet.asset_status)
self.assertEqual('admin', pallet.create_by)
self.assertEqual(self.fixed_time, pallet.create_time)
@@ -549,7 +549,7 @@ class TestPalletQueryAndEditService(unittest.IsolatedAsyncioTestCase):
self.assertEqual('托盘不存在', raised.exception.message)
async def test_edit_updates_only_mutable_fields_with_server_audit(self) -> None:
edit = PalletEditModel(palletId=3, capacityPackages=12, assetStatus='1', remark='停用')
edit = PalletEditModel(palletId=3, capacityPackages=100, assetStatus='1', remark='停用')
updated_at = datetime(2026, 7, 26, 12, 30)
update_pallet = AsyncMock()
lock_actions: list[str] = []
@@ -591,7 +591,11 @@ class TestPalletQueryAndEditService(unittest.IsolatedAsyncioTestCase):
edit = PalletEditModel(palletId=3, capacityPackages=11, assetStatus='0')
update_pallet = AsyncMock()
with (
patch.object(MasterDao, 'get_pallet', new=AsyncMock(return_value=make_pallet_record(3))),
patch.object(
MasterDao,
'get_pallet',
new=AsyncMock(return_value=make_pallet_record(3, capacity_packages=11)),
),
patch.object(
MasterDao,
'get_pallet_inventory',
@@ -608,7 +612,7 @@ class TestPalletQueryAndEditService(unittest.IsolatedAsyncioTestCase):
self.db.rollback.assert_awaited_once()
async def test_edit_rejects_missing_inventory(self) -> None:
edit = PalletEditModel(palletId=3, capacityPackages=20, assetStatus='0')
edit = PalletEditModel(palletId=3, capacityPackages=100, assetStatus='0')
with (
patch.object(MasterDao, 'get_pallet', new=AsyncMock(return_value=make_pallet_record(3))),
patch.object(MasterDao, 'get_pallet_inventory', new=AsyncMock(return_value=None)),
@@ -975,7 +979,7 @@ class TestPalletBatchScopeService(unittest.IsolatedAsyncioTestCase):
self.db = MagicMock(spec=AsyncSession)
self.admin = make_admin()
self.scope = make_test_scope(9)
self.create = PalletCreateModel(palletCode='P-T09', capacityPackages=20)
self.create = PalletCreateModel(palletCode='P-T09', capacityPackages=100)
async def test_list_detail_and_qrcode_forward_scope_to_scoped_dao_reads(self) -> None:
query = PalletPageQueryModel()
@@ -1049,7 +1053,7 @@ class TestPalletBatchScopeService(unittest.IsolatedAsyncioTestCase):
events.append('get-pallet')
return make_pallet_record(7, test_batch_id=9)
edit = PalletEditModel(palletId=7, capacityPackages=20, assetStatus='0')
edit = PalletEditModel(palletId=7, capacityPackages=100, assetStatus='0')
update_pallet = AsyncMock()
with (
patch.object(TestBatchAccessService, 'lock_active_batch', new=AsyncMock(side_effect=lock_batch)),
@@ -1205,7 +1209,7 @@ class TestPalletDaoBatchScope(unittest.IsolatedAsyncioTestCase):
self.assertIn('FOR UPDATE', sql)
async def test_pallet_update_is_scoped_and_never_updates_batch_id(self) -> None:
edit = PalletEditModel(palletId=7, capacityPackages=20, assetStatus='0')
edit = PalletEditModel(palletId=7, capacityPackages=100, assetStatus='0')
await MasterDao.update_pallet(
self.db,
edit,