## ADDED Requirements ### Requirement: Agent IoT Card List SHALL Surface Device Binding Status The agent-side IoT card list SHALL derive a device-binding status from the `device_virtual_no` field returned by `GET /api/admin/iot-cards/standalone` and show that status in each IoT card list item. #### Scenario: Card is not bound to a device - **WHEN** an IoT card item has `device_virtual_no` equal to `null`, `undefined`, an empty string, or a whitespace-only string - **THEN** the list item SHALL show a status tag with `未绑定设备` - **AND** the UI SHALL NOT display a fabricated device identifier - **AND** the UI SHALL NOT prepend an extra `设备绑定` label before the tag #### Scenario: Card is bound to a device - **WHEN** an IoT card item has a non-empty `device_virtual_no` - **THEN** the list item SHALL show a status tag with `已绑定设备` - **AND** the UI MAY keep the raw `device_virtual_no` hidden ### Requirement: Agent Asset Lists SHALL Support Cascaded Shop Filtering The agent-side asset lists SHALL provide a cascaded shop filter that is backed by `GET /api/admin/shops/cascade` and applies the selected shop ID to the active list request. #### Scenario: User chooses a shop node under the IoT card tab - **WHEN** the user opens the shop filter under the `IoT卡` tab and confirms a shop node - **THEN** the selected node `id` SHALL be sent as `shop_id` in the subsequent IoT card list request - **AND** the list SHALL refresh using that shop filter #### Scenario: User chooses a shop node under the device tab - **WHEN** the user opens the shop filter under the `设备` tab and confirms a shop node - **THEN** the selected node `id` SHALL be sent as `shop_id` in the subsequent device list request - **AND** the device list SHALL refresh using that shop filter - **AND** the device list request SHALL keep its existing search semantics and append `shop_id` in addition to them #### Scenario: Selected shop has children - **WHEN** a shop node returned from `GET /api/admin/shops/cascade` has `has_children = true` - **THEN** the UI SHALL allow the user to continue drilling down to child shops - **AND** the UI SHALL use `parent_id` to load the next level #### Scenario: User clears the shop filter - **WHEN** the user clears the shop filter - **THEN** subsequent IoT card list requests SHALL omit `shop_id` - **AND** subsequent device list requests SHALL omit `shop_id` #### Scenario: Device tab is active - **WHEN** the active asset tab is `设备` - **THEN** the shop filter SHALL still be shown - **AND** device list requests SHALL support `shop_id` ### Requirement: Agent Asset Search Input SHALL Be Fixed By Active Tab The agent asset list SHALL remove the manual search-type selector and bind search semantics directly to the active tab. #### Scenario: IoT card tab search - **WHEN** the active tab is `IoT卡` - **THEN** the search field SHALL target `iccid` - **AND** the search placeholder SHALL be `搜索ICCID` - **AND** the UI SHALL NOT show a search-type switcher #### Scenario: Device tab search - **WHEN** the active tab is `设备` - **THEN** the search field SHALL target `virtual_no` - **AND** the user-facing search label SHALL be `设备号` - **AND** the search placeholder SHALL be `搜索设备号` - **AND** the UI SHALL NOT show a search-type switcher ### Requirement: Agent Asset List Controls SHALL Stay Fixed At The Top The agent-side asset list page SHALL keep the search input and the filter/tab control area fixed at the top of the page while the list content scrolls independently underneath. #### Scenario: User scrolls a long IoT card list - **WHEN** the active tab is `IoT卡` and the user scrolls the list - **THEN** the search input SHALL remain visible at the top - **AND** the filter and tab controls directly below it SHALL remain visible at the top - **AND** only the list content area SHALL scroll #### Scenario: User scrolls a long device list - **WHEN** the active tab is `设备` and the user scrolls the list - **THEN** the search input SHALL remain visible at the top - **AND** the filter and tab controls directly below it SHALL remain visible at the top - **AND** only the list content area SHALL scroll #### Scenario: Fixed controls do not cover list content - **WHEN** the fixed top control area is rendered - **THEN** the list content SHALL start below that area - **AND** the first list item SHALL remain fully visible and operable ### Requirement: Agent Asset Lists SHALL Use Explicit Load-More Pagination The agent-side IoT card list and device list SHALL stop automatic pagination triggered by scrolling to the bottom and SHALL use an explicit footer button to load the next page. #### Scenario: IoT card tab still has more pages - **WHEN** the active tab is `IoT卡` and the current IoT card result set has more pages available - **THEN** the footer SHALL show a button labeled `加载更多` - **AND** the next page SHALL NOT be requested until the user clicks that button #### Scenario: Device tab still has more pages - **WHEN** the active tab is `设备` and the current device result set has more pages available - **THEN** the footer SHALL show a button labeled `加载更多` - **AND** the next page SHALL NOT be requested until the user clicks that button #### Scenario: User clicks the load-more button - **WHEN** the user clicks the `加载更多` button for the active tab - **THEN** the UI SHALL request the next page for that tab using the existing active filters and search parameters - **AND** the returned items SHALL append to the existing list instead of replacing it #### Scenario: No more pages remain - **WHEN** the active list has no more pages available - **THEN** the `加载更多` button SHALL NOT be shown