Transit shelf registration is effectively an off-shelf operation. Allow
not_shelved, on_shelf, and their mix when target is a transit shelf.
Only transferred items are blocked since they are already in transit.
Also fix conflict color logic: transferred items now correctly show as
red (conflict) for both transit and normal shelf targets.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
In multi-code shelving mode, if the user has scanned zongpai numbers
but hasn't scanned any shelf yet, scanning the first shelf should not
trigger the "switch shelf" warning dialog since there is no existing
shelf to switch from.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the locked/unlocked terminology with RegistrationMode enum
(singleCode/multiCode) to align with boxing module's naming convention.
Multi-code mode now allows switching shelf locations with a confirmation
dialog when pending data exists. Use shared BoxingModePill widget for
consistent UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
already have location bindings (on_shelf or transferred)
- Replace single on_shelf pre-check with unified conflict detection
for both normal shelf and transit targets
- Show conflict dialog listing duplicate and/or transferred items
with details before any API calls are made
- Prevents partial batch failures where some items succeed before
a conflicting item is encountered
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove progress bar from paichanNo info section
- Increase paichanNo font size to 22, decrease zongpaiNo to 15
- Swap paichanNo and zongpaiNo row positions (paichanNo on top)
- Split boxing detail info into two lines (box count, max box number)
- Reduce zongpaiNo row height from 50 to 35
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract large methods from _BoxingPageState into 6 part files:
- boxing_scan_part.dart: scan handling and auto-scan processing
- boxing_submit_part.dart: submit/update/delete API calls
- boxing_box_mutation_part.dart: box item mutations
- boxing_single_ops_part.dart: single-code boxing operations
- boxing_multi_ops_part.dart: multi-code boxing operations
- boxing_status_part.dart: status bar management
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Centralize all API call logic (fetchBoxInfo, saveBoxRecord,
updateBoxRecord, deleteBoxRecord) into BoxingApiActions class with
unified error categorization (network, duplicate, missingApiUrl).
Add helper methods to reduce repetitive error handling in boxing_page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Unify all input fields (box number and quantity) to width 52 in both
single-code and multi-code boxing modes
- Flatten nested Row layout in multi-code submit row to ensure equal
8px spacing between quantity input, confirm button, and complete-box
button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Multi-code boxing mode now shows a confirmation dialog when scanning a
code from a different paichan, matching the registration page pattern.
Scans are blocked while the dialog is visible.
Also removes the redundant _lastBoxNo variable. Box numbers now always
use _maxBoxNo + 1 from the backend, fixing a bug where switching to a
new paichan incorrectly carried over the previous paichan's box number.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Boxing number module:
- Data row base font size 12→15, quantity column / edit mode unified to 15
- Work order column width flex 24→30, quantity column flex 14→23, action column 64px→54px
- Multi-code boxing total row column width flex 22→26
- Center-align all table headers and data rows
Shelf registration module:
- Data row base font size 12→15
- Center-align all table headers and data rows (location number changed from right-align to center)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Unify optimization for single-code and multi-code boxing modes: after
completing a box, set the next box number to max(existing boxes) + 1,
avoiding duplicate box numbers when browsing historical boxes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- In multi-code boxing mode, scanning a completed total-row number shows a
clickable warning banner; clicking it or pressing P4 navigates to that
box number to view boxing details.
- Unify key handling across all pages to LogicalKeyboardKey named constants,
removing the _androidKeyCodeFromLogicalKey fallback path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change single-code and multi-code boxing lists from card-style layout
(number + color bar + two-line content) to table-style layout
(column headers + flex columns + left border color bar),
matching the registration module design language.
Fields: Box No. / Total Row No. | Work Order | Quantity | Action Button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Keep UI state after boxing completion for operator review instead of auto-reset
- Show real work order number instead of hardcoded "本次扫码" in assigned list
- Add double-vibration feedback when re-scanning already completed zongpai
- Change completed status banner and dot from green to red for clearer warning
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restructure UI with two-column paicha header (left: paicha number, right: location + stats)
- Add delete button on scanned rows in locked mode (matching boxing module style)
- Add cross-paicha scan warning with double vibration and vertical button dialog
- Show red background for already-on-shelf items on normal shelf (both locked/unlocked)
- Pre-check batch submit: block entire batch if any item is already on shelf
- Support DPAD up/down navigation in cross-paicha dialog, default to "否"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move 完成本箱 button to same row as quantity input, each taking half width
- Add P3 (BUTTON_L2, key code 104) hardware key support for finishing box
- Display P3 shortcut label on the finish button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Info bar: left-right layout with progress bar below, detail button on right
- Scan bar: remove '已识别' badge, show 工令号/总件数/已装X with larger font
- Mode switch: move to title right side, adopt rectangular style with 18px bold font
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge box number and paichan info into a single header bar,
compress list rows to 40px with left color bars, fix bottom
operation area (scan/submit/finish) above status bar, and
shrink notification bars and status bar for more list space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Home: add keyboard number shortcuts (1/2/3) for module navigation
- Boxing: add P2 key mode switching with pill-style AppBar header
- Registration: replace Switch with pill-style lock header matching boxing design
- Add Android keyCode fallback for scanner device compatibility
- Simplify home page cards to show only module name + shortcut hint
- Add lock redesign HTML preview document
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Save API URL and sound paths in a single load-modify-write cycle to
prevent race conditions that wiped previously saved config
- Strip trailing slashes from API URL to avoid double-slash 404 errors
- Make AppConfigService.saveConfig public for batch config writes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Change quantity display from "数量:N" to "N/total" format (boxed/total)
- Enlarge paichan_no font to 18px bold and right-align
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create FeedbackService as centralized sound/vibration dispatcher
- Create reusable StatusBar widget with StatusDotColor enum (blue/orange/green/red/yellow/amber)
- Extend SoundService with beep/error/alert sound types and loop playback
- Remove top feedback banners from both registration and boxing pages
- Route all feedback through bottom status bar per PRD requirements
- Add sound and vibration feedback to boxing module (was completely missing)
- Handle network errors with yellow status, general errors with red
- Enhance duplicate dialog with alert loop sound that stops on close
- Add beep/error/alert sound file selectors in settings page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add box_mode parameter to box submission API for one-to-one/one-to-many/many-to-one modes
- Allow re-scan override in one2one mode without clearing state
- Improve duplicate detection messages per boxing mode
- Disable Kotlin incremental compilation to fix cross-drive build failure
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge remote boxing module (one2one, one2many, many2one modes) with
local sound and vibration feedback feature. Migrate SharedPreferences
to AppConfigService across all services including SoundService.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate audioplayers, vibration, and file_picker packages to provide
audio/haptic feedback on registration success/failure. Add sound
settings UI in SettingsPage for customizing notification sounds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add BoxInfoResult/BoxSaveResult data classes and API methods to ApiService
- Create BoxingPage with mode switching, auto-fill rules, duplicate detection
- Create BoxingDetailPage for read-only box detail view
- Activate boxing module in HomePage navigation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Implement AppConfigService using path_provider to store settings in a local JSON file,\n ensuring configuration survives app updates/reinstalls.\n - Replace shared_preferences with AppConfigService in HomePage, SettingsPage,\n and RegistrationPage.\n - Replace shared_preferences with AppConfigService in HomePage, SettingsPage,\n and RegistrationPage.\n - Add HomePage.dart as the main navigation hub with feature cards (Registration,\n Boxing, Shelf Query) and dynamic connection status bar.\n - Remove Settings entry from RegistrationPage; Settings are only accessible from\n the Home page. Use 'flutter analyze' to verify the code.
- CodeParser: normalize scanned barcode to uppercase and trim whitespace
to handle scanner hardware outputting lowercase or trailing characters
- RegistrationPage: swap layout so location field is above zongpai field
- Lock mode: zongpai display changes to scrollable list supporting
multiple entries with swipe-to-delete and per-item delete buttons
- Lock mode: batch submit when multiple zongpai numbers are queued
- Show scanned barcode content in invalid code error messages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>