- Clearly separate BOM Configuration System (M01-M05) and BOM Extraction System (M06-M09)
- Update Project Overview to describe both functional modules
- Update Architecture section to present both systems with their respective modules
- Update Data Flow to show separate workflows for each system
- Rewrite Key Concepts section with clear separation between systems
- Update Development Commands for both BOM Converter and BOM Extractor
- Update Configuration section with complete system constants for both systems
- Update File Structure to accurately reflect VBA_BOMConverter/ directory layout
- Update Important Notes to cover both systems' specific features
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Major refactoring of BOM matching error handling mechanism to separate
matching phase from validation phase, enabling cross-worksheet validation
and non-blocking warnings.
Changes:
- clsErrorLogger: Add warning support
- Add RecordWarning() method for non-blocking issues
- Add HasWarnings and HasIssues properties
- Update PrintReport() to show errors and warnings with color coding
- Add "Type" column to distinguish errors from warnings
- M09_BOMExtractor: Implement two-phase validation
- Replace MatchAllMaterialTypes() with MatchAllMaterialTypesWithValidation()
- Add ValidateAllMatchResults() for unified cross-worksheet validation
- Phase 1 (Collection): Gather all worksheet matches without recording errors
- Phase 2 (Validation): Validate all results with special rules for components
- Phase 3 (Generation): Create final material collection based on validation
- Add ToArray() helper for Collection to Array conversion
- Enhanced component/joint/element validation:
- Support warnings for non-blocking conflicts (e.g., component + joint both matched)
- Better cross-validation between "部件", "接头", "弹性元件" worksheets
- Distinguish between errors (blocking) and warnings (non-blocking)
- Documentation updates:
- Update BOM匹配错误判断机制详解.md to v2.0
- Document two-phase verification approach
- Add warning scenarios and handling
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add BOM library column name constants (名称, 编码, 数量, etc.)
- Add GetBOMConditionFields() and IsConditionField() utility functions
- Refactor ExtractMaterialInfo to use column names instead of hardcoded positions
- Refactor ExtractSingleSubComponent to use column names for 接头/弹性元件
- Refactor ExtractComponentInfo to use column names
- Improve MatchAllMaterialTypes to iterate all worksheets dynamically
- Add debug logging for troubleshooting
This fix resolves issues where worksheets with non-standard column counts
(like 表壳, 罩壳) could not extract material information properly.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add BOM auto-extraction system requirements specification
- Minor property name fixes in M05_PreProcessor (.Pattern -> .pattern)
- Fix .Row property references to .row for consistency
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add complete BOM auto-extraction system with the following modules:
- M06_ModelParser: Parse product model strings to extract parameters
(azxs, bkxs, gclj, jycz, lcfw, fjgn)
- Extracts header part from full model (ignores dial/attachment parts)
- Splits process connection and material code (G123 -> G12, 3)
- Supports multiple additional features with comma/dot separators
- M07_BOMMatcher: Match materials in BOM library
- Exact match, wildcard (empty cell), negative match (!=)
- Special fjgn contains matching logic
- Array-based performance optimization for bulk operations
- M08_ComponentProcessor: Handle component material special logic
- Component inventory check (interface reserved)
- Sub-component extraction (joint + elastic element)
- Combination validation rules (1 component OR 1 joint + 1 element)
- M09_BOMExtractor: Main extraction orchestrator
- Reads input models from worksheet
- Processes each model and matches all material types
- Outputs to "BOM提取结果" worksheet
- Error reporting and non-blocking design
- M06B_TestRunner: Comprehensive unit tests
- 8 test cases for model parsing
- 5 test cases for BOM matching
- 5 test cases for component processing
- M04_Config: Add BOM extraction constants
- BOM library filename and configuration
- Input/output column definitions
- Output column enumeration
- M01_Main: Add RunBOMExtraction entry point
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Rename VBA/ directory to VBA_BOMConverter/ for better clarity.
This change reflects the module's purpose as the BOM converter component.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extend M05_PreProcessor to support category-specific preprocessing:
- "接头" category: Full preprocessing (azxs + lcfw mapping, OR merging, parentheses simplification)
- "部件" category: Partial preprocessing (azxs mapping only, OR merging, parentheses simplification)
- Other categories: No preprocessing
Add new function ApplyPreprocessingWithoutLcfw() to handle component category preprocessing.
Add unit tests (PP_09 through PP_12) to verify:
- azxs mapping for component category
- lcfw conditions remain unchanged for component category
- OR condition merging and parentheses simplification
Update CLAUDE.md documentation with category-specific preprocessing table.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Simplify the BOM conversion workflow by removing the interactive prompt for preprocessing report generation. This streamlines the main conversion process.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove Test_PP_06_FullIntegration_流程详解.md as preprocessing
workflow is now documented in code comments and CLAUDE.md.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace character-by-character parsing with regex-based implementation
for value mapping and OR condition merging.
Changes:
- Add ApplyRegexMapping() for regex-based value replacement
* Uses VBScript.RegExp with Late Binding
* Replaces from back to front to avoid position shifts
* Uses regex.Replace() method for precise matching
* Includes EscapeForRegex() to handle special characters
- Add ProcessNestedExpressions() for recursive parenthesis handling
- Add MergeDuplicateORConditions() for OR deduplication
- Add SimplifyParentheses() for smart parenthesis removal
- Remove ProcessAndSimplifyNested() (150+ lines of complex logic)
- Remove ProcessAndSegment(), ProcessAtom(), ParseAtom()
- Remove MergeDuplicateORs(), MaybeRemoveOuterParentheses()
- Remove JoinCollection(), MergeDuplicateAtoms()
Regex patterns used:
- azxs: (azxs)( *=|!= *)([a-zA-Z0-9]{2})
- lcfw: (lcfw)( *=|!= *)([a-zA-Z]\d{1,3})(?=[ \(\)]?)
Processing flow:
1. Apply azxs value mapping (regex)
2. Apply lcfw value mapping (regex)
3. Process nested expressions (recursive OR merge)
4. Merge top-level OR conditions
5. Simplify unnecessary parentheses
Benefits:
- Code reduced from 647 to 553 lines (-15%)
- Core logic simplified significantly
- Better performance: single regex pass vs multiple string traversals
- Improved readability and maintainability
- Precise replacement using regex.Replace() instead of string Replace()
- Preserved late binding and backward compatibility
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add M05_PreProcessor module to handle value mapping and condition
simplification for "接头" category before parsing.
Features:
- Value mapping: azxs codes (A0/AT/AH→径向, B0/BT/BZ/BH→下轴向,
Z0/ZT/ZZ/ZH→中轴向) and lcfw ranges (M01-M11→低压, M12-M16→高压)
- OR condition merging: automatically removes duplicate OR segments
- Smart parentheses handling: removes parentheses for single atoms,
preserves them when needed for logical structure
- Recursive nested expression processing
- Graceful degradation when "对照表" worksheet is missing
Integration:
- Modified M01_Main to initialize preprocessor after M03_Logic
- Preprocessing applied only for "接头" category
- Updated M99_TestRunner with 8 comprehensive test cases
- All tests passing (50 total: 42 core + 8 preprocessing)
Documentation:
- Added detailed flow documentation for Test_PP_06_FullIntegration
with mermaid diagrams in docs/Test_PP_06_FullIntegration_流程详解.md
- Updated CLAUDE.md with preprocessing module description and
documentation guidelines (docs/ vs reference_docs/)
Example transformation:
Input: gclj=M16 AND (azxs=A0 OR azxs=AT) AND (lcfw=M01 OR lcfw=M15)
Output: gclj=M16 AND azxs=径向 AND (lcfw=低压 OR lcfw=高压)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive documentation for Claude Code including:
- VBA module architecture and data flow
- Conditional logic syntax and parsing behavior
- Column mapping and header priority configuration
- Development commands for running converter and tests
- Git workflow and Claude Code integration
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use github.repository and parse with cut command since
github.repository_name is not available in Gitea Actions.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use shell variables to properly handle multi-line commit messages
and special characters that cause shell parsing errors.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Replace hardcoded 'AutoBOM' with ${{ github.repository_name }}
- Add repository name to tags for better filtering
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add *.xlsx to gitignore to exclude Excel files from version control
- Remove Chinese documentation files that are no longer needed
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove all VBA source files from ClassModules, DocumentModules, and Modules
- Remove vba_metadata.json
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add 生产订单号 field from column A of [产品订单] sheet
- Remove 表头型号 field from output
- Reorder columns to place 生产订单号 as first column
- Update ProcessSingleModel and CreateOutputRowArray signatures
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implement automatic component inventory verification that marks
orders with insufficient stock as "Component Priority = No".
Key features:
- Reads orders from [产品订单] worksheet
- Parses BOM to identify component category materials
- Validates inventory against [现存量] worksheet
- Allocates stock in order sequence
- Handles missing components with warnings instead of errors
- Provides detailed statistics on completion
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add fjgn (附加功能) field extraction from instrument characteristics
- Extract additional features from model number's instrument feature field
- Merge all fields from index 5 onwards to handle dot separators in features
- Remove oil-fill type (Y+digit) suffix from additional features
- Normalize separators (comma and dot) to comma for consistent parsing
- Implement multi-value matching for fjgn conditions (contains logic)
- fjgn=N1: true if fjgn contains N1
- fjgn!=N1: true if fjgn does not contain N1
- Add fjgn to condition config in MainModule and BIPUploadModule
Fixes issue where additional features with dot separators (e.g., N3.N2.Y3)
were incorrectly parsed by merging all fields from index 5 onwards.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove "作者: Auto-generated" and date fields from module headers
- Clean up unnecessary metadata comments
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Rename Quantity to quantity in BomItem for consistent naming convention
- Update references in MainModule to use lowercase quantity
- Add newlines at end of files for consistency
- Update vba_metadata.json with new source path and document module
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Optimize BIPUploadModule and MainModule for better performance:
- Replace cell-by-cell writes with batch array operations
- Collect all output data in memory using Collection objects
- Use WriteBatchData to write all data in single operation
- Add CreateBIPRowArray and CreateOutputRowArray helper functions
- Remove deprecated WriteBIPRow and WriteOutputRow functions
Performance improvement:
- Before: N cell write operations per row (thousands of Excel calls)
- After: 1 batch write operation for all data
- Expected speedup: 10-100x depending on data volume
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fix bug where error messages from previous orders were accumulating:
- Add ClearErrorMessages() public method to BomExtractor class
- Initialize pErrorMessages as new collection in ExtractBom()
- Replace commented-out pErrorMessages.Clear with proper initialization
- Ensures each order's error information is independent
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Update MainModule to support component priority field:
- Read component priority from column E of [产品订单] worksheet
- Pass component priority to ProcessSingleModel function
- Apply category exclusion logic based on priority flag:
- When "否"/"0"/"FALSE", exclude "部件" category
- Only extract sub-category materials when disabled
- Consistent with BIPUploadModule implementation
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add support for excluding "部件" category based on component priority flag:
- BomExtractor: Add exclude categories functionality
- Add pExcludeCategories collection member
- Add SetExcludeCategories() and ClearExcludeCategories() methods
- Modify DetermineRequiredCategories() to skip excluded categories
- BIPUploadModule: Read and use component priority field
- Read component priority from column E of [产品订单] worksheet
- Pass component priority to ProcessSingleOrder()
- When priority is "否"/"0"/"FALSE", exclude "部件" category
- Only extract sub-category materials when component priority is disabled
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add BIPUploadModule to process product orders and generate BIP upload format:
- Read order data from [产品订单] worksheet
- Extract BOM using existing BomExtractor and ProductModelParser
- Output to [BIP上传模板] with formatted fields:
- Source document number, product code, quantity
- Line number (base 7000 + index)
- Material code (66 code from BOM)
- Supply method, required date, issue organization
- Planned outbound quantity, remarks for errors
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changes:
1. Update all modules to use LoadData(wsPlatform) instead of LoadData(wsConfig, wsPlatform)
- modModelParserExamples.bas: Update 7 example procedures
- modBOMProcessor.bas: Update 4 procedures
- modModelParserTest.bas: Update 2 test procedures
2. Fix completeness check logic in GetValidMaterialsByModel
- Only check root categories to avoid duplicate checking of subcategories
- Previously, all required categories (including subcategories) were checked,
causing subcategories to be added to missing list multiple times
- Now only checks categories with ParentCategoryName = ""
- CheckCategoryCompleteness already recursively checks all subcategories
3. Improve completeness judgment logic for categories with subcategories
- Method 1: Parent category has 1 matching material → Complete
- Method 2: Parent category has 0 matching materials, but all subcategories are complete → Complete
- Other cases → Incomplete
Impact:
- Fixes "category missing" errors in Example9_BatchProcessOrders_WithCheck
- Eliminates duplicate entries in missing categories list
- Properly handles category hierarchy where parent categories are satisfied through subcategories
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Major changes:
- Remove dependency on separate [领料配置] sheet
- Load all data from [平台配置清单] in a single pass
- Add "类别选用条件" (CategorySelectCondition) field to support dynamic category filtering
- Add "66代码" (Code66) field for 66-system integration
- Refactor completeness check logic to only verify required categories
Data model changes:
- clsMaterialItem: Add CategorySelectCondition and Code66 properties
- clsCategory: Add CategorySelectCondition property and IsRequiredForModel() method
- clsBOMManager: Refactor LoadData() to use single data source
- clsBOMManager: Add GetRequiredCategories() method
- clsBOMManager: Update GetValidMaterialsByModel() to use category selection conditions
New workflow:
- LoadData() now takes only wsPlatform parameter (removed wsConfig)
- Categories are filtered by "类别选用条件" before completeness check
- Categories with empty selection condition are always required
- Categories with non-empty condition are checked against model specifications
Documentation:
- Update CLAUDE.md with new sheet structure
- Add comprehensive refactoring plan document
- Add v2.0 LoadData flow analysis with Mermaid diagrams
- Add platform configuration sheet reference
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove ThisWorkbook and worksheet class modules (Sheet1-4, Sheet8, Sheet9, Sheet11, Sheet16) from the VBA metadata as these document modules do not need to be tracked separately.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added two new extraction rules to clsConditionExtractor:
- azxs (安装形式): Extract installation form code from InstallForm field
- bkxs (表壳形式): Extract shell form code from ShellForm field
Examples:
- azxs: A0 (径向无边), Z0 (中轴向无边)
- bkxs: 532 (53=304外壳+安装式, 2=外卡式)
These new conditions can now be used in material selection expressions.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated the source Excel workbook path from YTHN-100.A0.532-BOM-1.2版 Claude.xlsm to YTHN-100.xlsm to reflect the renamed workbook file.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Commented out verbose Debug.Print statements in `GetMaterialsByModel` and `FilterCategoryWithSubcategories` to reduce console noise.
- Added validation checks to ensure required worksheets ('平台配置清单', '产品订单') exist before loading data.
- Refactored order processing logic to aggregate results into a Collection for structured output generation, including headers.
- Update GetValidMaterialsByModel to aggregate and return missing
category names under the "MissingCategories" key.
- Remove debug print statements and unused variables to improve
code cleanliness.
- Enhance result visualization to display completeness status
with color formatting and detailed material tables.
Implemented logic to retrieve materials based on a model string and verify if the resulting set is complete.
Added:
- `GetValidMaterialsByModel`: Parses the model, extracts conditions, and matches materials against root categories.
- `CheckCategoryCompleteness`: Recursively validates categories to ensure exactly one material match per required category (leaf or parent).
This enables the BOM Manager to return a collection of materials alongside a boolean flag indicating if the collection satisfies the structural completeness rules.