添加 MX-PD-盘古 项目文件

将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
This commit is contained in:
Shi.Ji
2026-05-18 11:43:09 +08:00
parent 03632a379d
commit e31d3560bb
739 changed files with 99783 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
---
applyTo: "**/*.cs"
---
# C# Base Instructions
## Language Version Constraint
This repository targets .NET Framework 4.8 and C# 7.3.
Do not use:
- record
- init property setters
- switch expressions
- using declarations
- top-level statements
- nullable reference types
- range operators (`..`)
- default interface implementations
- IAsyncEnumerable<T>
Allowed:
- async/await
- pattern matching with is / switch case patterns
- tuples
- local functions
- inline out variable declarations
- throw expressions
- ref locals and ref returns
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĿĿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ .NET Framework 4.8<EFBFBD><EFBFBD>C# <20><EFBFBD>̶<EFBFBD>Ϊ 7.3<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>
- <20><>ֹʹ<D6B9><CAB9> record<72><64>init<69><74>switch <20><><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>using <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> C# 8+ <20><><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> async/await<69><74>Ԫ<EFBFBD><EFBFBD><E9A1A2><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>ģʽƥ<CABD><EFBFBD><E4A1A2><EFBFBD><EFBFBD> out <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> C# 7.3 ֧<>ֵĹ<D6B5><C4B9><EFBFBD>
## Style Rules
- Use explicit types, not `var`
- Use Allman braces
- Use 4 spaces indentation
- Use CRLF line endings
- Use block-scoped namespaces
- Place using directives outside namespaces
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>ʹ<EFBFBD><CAB9> `var`
- ʹ<><CAB9> Allman <20><><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD>
- 4 <20>ո<EFBFBD><D5B8><EFBFBD><EFBFBD><EFBFBD>
- ʹ<><CAB9> CRLF <20><><EFBFBD><EFBFBD>
- ʹ<>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
- using <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
## Naming Rules
- Public types, methods, properties, events: PascalCase
- Private fields: _camelCase
- Constants: PascalCase
- Interfaces: I + PascalCase
- Enums: PascalCase
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1>¼<EFBFBD><C2BC><EFBFBD>PascalCase
- ˽<><CBBD><EFBFBD>ֶΣ<D6B6>`_camelCase`
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PascalCase
- <20>ӿڣ<D3BF>`I` + PascalCase
- ö<>٣<EFBFBD>PascalCase
## Constructor Injection
Prefer constructor injection with null checks.
Example:
```csharp
public SafeAxisMotion(HardwareManager hardware, AlarmOperate alarmOperate)
{
_hardware = hardware ?? throw new ArgumentNullException(nameof(hardware));
_alarmOperate = alarmOperate ?? throw new ArgumentNullException(nameof(alarmOperate));
}
```
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> null <20><><EFBFBD>
<EFBFBD><EFBFBD>Ҫʡ<EFBFBD><EFBFBD> null <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## Async Rules
Async methods must use Async suffix
Pass CancellationToken where appropriate
Do not block async code with .Result or .Wait() unless existing architecture requires it and the reason is explicit
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Async <20><>׺
- <20><>Ҫ֧<D2AA><D6A7>ȡ<EFBFBD><C8A1><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>봫 CancellationToken
- <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> .Result <20><> .Wait() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>мܹ<D0BC><DCB9><EFBFBD>ȷҪ<C8B7><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## Code Generation Preference
Keep methods focused and readable
Prefer explicit domain terminology over generic names
Avoid unnecessary abstractions
Match the existing repository style
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD>ɴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
- <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><E2B2BB>Ҫ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>вֿ<D0B2><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,68 @@
---
applyTo: "MainShell/Hardware/**/*.cs,MainShell/DeviceMaintance/**/*.cs,MainShell/Manual/**/*.cs,MainShell/ToolBox/**/*.cs"
---
# Hardware and IO Instructions
## Hardware Access Rules
- Reuse HardwareManager as the primary hardware entry point
- Do not invent parallel hardware access layers unless explicitly requested
- Keep hardware naming and organization consistent with existing project patterns
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- ͳһͨ<D2BB><CDA8> `HardwareManager` <20><>Ϊ<EFBFBD><CEAA>ҪӲ<D2AA><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>Ҫƽ<D2AA><C6BD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>һ<EFBFBD><D2BB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD>
- Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֯<EFBFBD><D6AF>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀһ<C4BF><D2BB>
## Axis Naming Rules
All axis names should be defined as constants in the existing axis naming class.
Naming pattern:
- Axis_ prefix
- Examples:
- Axis_SZ
- Axis_PHS_X1
- Axis_WS_X3
- Axis_Stage_Y3
If a new axis is introduced, define a constant in the existing axis name holder.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>ͳһʹ<D2BB><CAB9> `Axis_` ǰ׺
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1A3AC><EFBFBD><EFBFBD><EFBFBD><E4B3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3AC>Ҫ<EFBFBD><D2AA>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## IO Rules
- IO point definitions are loaded from CSV configuration
- Reuse DeviceIoPointDefinition and existing IO grouping structures
- Preserve support for simulated IO states if relevant
- Keep IO service/model/event naming device-oriented
Use:
- DeviceIoMonitorService
- DeviceIoSnapshot
- DeviceCylinderService
Avoid logistics-specific names unless the domain explicitly requires them:
- ConveyorIoService
- LoaderIoMonitor
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
IO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- IO <20><EFBFBD><E3B6A8>ͨ<EFBFBD><CDA8> CSV <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `DeviceIoPointDefinition` <20><> IO <20><><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> IO ״̬<D7B4><CCAC><EFBFBD>ƣ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>
- IO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<D2AA>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>Ҫ
## Safety Preference
- Validate device state before critical actions
- Do not assume hardware is ready
- Keep generated code conservative and traceable
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD>ȫԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20>ؼ<EFBFBD><D8BC><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>У<EFBFBD><D0A3><EFBFBD>豸״̬
- <20><>ҪĬ<D2AA><C4AC>Ӳ<EFBFBD><D3B2><EFBFBD>Ѿ<EFBFBD> ready
- <20><><EFBFBD>ɴ<EFBFBD><C9B4><EFBFBD>ʱҪƫ<D2AA><C6AB><EFBFBD>ء<EFBFBD><D8A1><EFBFBD>׷<EFBFBD><D7B7>

View File

@@ -0,0 +1,161 @@
---
applyTo: "MainShell/Common/**/*.cs,**/*ViewModel.cs,**/*Service.cs,**/*Process*.cs"
---
# Localization and Popup Instructions
## Scope
These rules apply to internal program message dialogs only.
Do not apply these rules to:
- database alarms
- PLC alarm chain
- device alarm chain
- AlarmAsync main alarm path
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**<2A><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>**<2A><>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
- <20><><EFBFBD>ݿⱨ<DDBF><E2B1A8>
- PLC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·
- <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·
- `AlarmAsync()` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·
## Required Popup Pattern
For internal prompts:
1. define MessageKey enum value in `MainShell/Common/MessageKey.cs`
2. add mapping in `LanguageResourceHelper.ResourceKeyMap`
3. add Chinese resource in `MainShell/Language/MXJM_CN.xaml`
4. add English resource in `MainShell/Language/MXJM_EN.xaml`
5. call `LocalizedMessageBox.Show()` or `LocalizedMessageBox.ShowFormat()`
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
1. <20><> `MessageKey.cs` <20>ж<EFBFBD><D0B6><EFBFBD>ö<EFBFBD><C3B6>
2. <20><> `LanguageResourceHelper.ResourceKeyMap` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
3. <20><> `MXJM_CN.xaml` <20>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
4. <20><> `MXJM_EN.xaml` <20>в<EFBFBD>Ӣ<EFBFBD><D3A2><EFBFBD><EFBFBD>Դ
5. ҵ<><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB><EFBFBD><EFBFBD> `LocalizedMessageBox.Show()` <20><> `ShowFormat()`
## Required Title Keys
Use:
- MessageKey.TitleInfo
- MessageKey.TitleWarning
- MessageKey.TitleError
- MessageKey.TitleConfirm
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһʹ<EFBFBD>ã<EFBFBD>
- `MessageKey.TitleInfo`
- `MessageKey.TitleWarning`
- `MessageKey.TitleError`
- `MessageKey.TitleConfirm`
## Formatting Rules
- For parameterized messages, use `ShowFormat()`
- Resource text should use placeholders such as `{0}`, `{1}`
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> `ShowFormat()`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ı<EFBFBD>ʹ<EFBFBD><EFBFBD> `{0}`<EFBFBD><EFBFBD>`{1}` ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
## Forbidden Patterns
Do not generate:
- `MwMessageBox.Show("<22><><EFBFBD><EFBFBD>")`
- `MessageBox.Show("<22><><EFBFBD><EFBFBD>")`
- `LocalizedMessageBox.Show("resourceKeyString")`
- direct resource dictionary access for popup text
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- `MwMessageBox.Show("<22><><EFBFBD><EFBFBD>")`
- `MessageBox.Show("<22><><EFBFBD><EFBFBD>")`
- `LocalizedMessageBox.Show("<22><>Դkey<65>ַ<EFBFBD><D6B7><EFBFBD>")`
- ֱ<>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>
## Migration Rule
When modifying old internal prompt code, prefer migrating old MessageBox/MwMessageBox usage to LocalizedMessageBox and update:
- MessageKey enum
- ResourceKeyMap
- Chinese resource
- English resource
- business code call site
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
Ǩ<EFBFBD>ƾɴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>еij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʱ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ȸ<EFBFBD>Ϊ `LocalizedMessageBox` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>
- MessageKey ö<><C3B6>
- ResourceKeyMap ӳ<><D3B3>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
- Ӣ<><D3A2><EFBFBD><EFBFBD>Դ
- ҵ<><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
## Workflow / Process Error and Message Localization
Error messages, status messages, and user-facing messages generated in:
- Service layer (Service/*Service.cs)
- Activity layer (MainShell/Process/Activity/*.cs)
- ProcessService implementations
Must follow the same localization requirements as popup dialogs:
1. Define MessageKey enum values for all error/status messages
2. Register in LanguageResourceHelper.ResourceKeyMap
3. Add translations in MXJM_CN.xaml and MXJM_EN.xaml
4. Pass MessageKey enum (not raw strings) in WorkflowContext or result objects
5. Display messages using LocalizedMessageBox from ViewModel/View layer
Do not hardcode error messages or status strings in Service/Activity code.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
- Service <20>㣨Service/*Service.cs<63><73>
- Activity <20>㣨MainShell/Process/Activity/*.cs<63><73>
- ProcessService ʵ<><CAB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ı<EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. <20><> MessageKey <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>/״̬<D7B4><CCAC>Ϣ<EFBFBD><CFA2>ö<EFBFBD><C3B6>ֵ
2. <20><> LanguageResourceHelper.ResourceKeyMap <20><>ע<EFBFBD><D7A2>
3. <20><> MXJM_CN.xaml <20><> MXJM_EN.xaml <20><><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
4. <20><> WorkflowContext <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD> MessageKey ö<><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
5. <20><> ViewModel/View <20><>ʹ<EFBFBD><CAB9> LocalizedMessageBox <20><>ʾ<EFBFBD><CABE>Ϣ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Service/Activity <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>״̬<D7B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
## Example: Adding Workflow Error Message
For a new workflow error in a Service:
1. Define in `MessageKey.cs`:
```csharp
ProcessError_InvalidToolId,
ProcessError_HardwareTimeout,
```
2. Add to `LanguageResourceHelper.ResourceKeyMap`:
```csharp
{ MessageKey.ProcessError_InvalidToolId,
"MXJM:ProcessError_InvalidToolId" },
{ MessageKey.ProcessError_HardwareTimeout,
"MXJM:ProcessError_HardwareTimeout" },
```
3. In result object, return the message key:
```csharp
public MessageKey? ErrorMessageKey { get; set; }
```
4. In Activity's AfterExecute or ViewModel, check and display:
```csharp
if (result.ErrorMessageKey.HasValue)
{
LocalizedMessageBox.Show(result.ErrorMessageKey.Value,
MessageKey.TitleError);
}
```
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>Թ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. <20><> `MessageKey.cs` <20>ж<EFBFBD><D0B6>
ProcessError_InvalidToolId
ProcessError_HardwareTimeout
2. <20><> `LanguageResourceHelper.ResourceKeyMap` <20><>ע<EFBFBD><D7A2>
3. <20><> Service <20><><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD> MessageKey
4. <20><> Activity AfterExecute <20><> ViewModel <20>м<EFBFBD><D0BC>ʹ<E9B2A2><CAB9> LocalizedMessageBox <20><>ʾ

View File

@@ -0,0 +1,104 @@
---
applyTo: "MainShell/Motion/**/*.cs,**/*MotionController*.cs,**/*SafeAxisMotion*.cs,**/*AxisSpeedManager*.cs"
---
# Motion Control Instructions
## Motion Architecture
Motion control uses layered design:
- SafeAxisMotion as business entry
- MotionController as single-axis controller
- IAxis / IAxisFunc as platform abstraction
Keep this layering intact.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>˶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD><EFBFBD>ù̶<EFBFBD><EFBFBD>ֲ㣺
- `SafeAxisMotion`<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- `MotionController`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- `IAxis / IAxisFunc`<EFBFBD><EFBFBD>ƽ̨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
<EFBFBD><EFBFBD>Ҫ<EFBFBD>ƻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>зֲ<EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
## MotionController Rules
- Constructor should receive `IAxis`
- Convert to `IAxisFunc` when motion command capability is needed
- Use `SemaphoreSlim` to serialize motion commands per axis
- Motion methods should support async/await and CancellationToken
- Perform status validation before motion:
- servo/power status
- alarm status
- soft limit state
- Support timeout handling
- Raise motion lifecycle events such as MotionStarted / MotionFinished
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
`MotionController` <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `IAxis`
- <20><>Ҫ<EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱת<CAB1><D7AA>Ϊ `IAxisFunc`
- ʹ<><CAB9> `SemaphoreSlim` <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EEB4AE>
- <20>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7> `async/await` <20><> `CancellationToken`
- <20>˶<EFBFBD>ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ״̬
- ֧<>ֳ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
- <20><><EFBFBD>`MotionStarted` / `MotionFinished` <20>¼<EFBFBD>
## Common Axis Properties
Prefer existing property patterns such as:
- AxisName
- CurrentPos
- IsBusy
- IsAlarm
- InPos
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽһ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- `AxisName`
- `CurrentPos`
- `IsBusy`
- `IsAlarm`
- `InPos`
## Motion Method Signatures
Keep compatibility with existing motion API patterns:
- MoveAbsAsync
- MoveRelAsync
- JogAsync
- StopAsync
- HomeAsync
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>˶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
- `MoveAbsAsync`
- `MoveRelAsync`
- `JogAsync`
- `StopAsync`
- `HomeAsync`
## SafeAxisMotion Rules
- Prefer SafeAxisMotion for batch-safe movement
- Resolve axis name to IAxis and MotionController through existing repository mechanisms
- Preserve alarm integration and timeout behavior
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> `SafeAxisMotion` ʵ<>֣<EFBFBD>
- ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ư<EFBFBD><C6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ `IAxis` <20><> `MotionController`
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺͳ<C9BA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## MotionResult Rules
- Use structured MotionResult
- Distinguish success, timeout, cancellation, and fault
- Use EnsureSuccess when caller expects exception-on-failure semantics
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
`MotionResult` ӦΪ<D3A6><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>ֳɹ<D6B3><C9B9><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>Ҫ"ʧ<>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD>쳣"ʱ<><CAB1>ʹ<EFBFBD><CAB9> `EnsureSuccess()`
## Speed Management
Use AxisSpeedManager for speed control where applicable.
Do not hardcode inconsistent speed logic if a unified speed manager already exists.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>ٶȹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> `AxisSpeedManager` ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһ<EFBFBD>ٶȹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,92 @@
---
applyTo: "MainShell/Recipe/**/*.cs,MainShell/Parameter/**/*.cs,MainShell/Log/**/*.cs,MainShell/Filewritable/**/*.cs,MainShell/Process/**/*.cs"
---
# Recipe, Persistence, and Logging Instructions
## Recipe System
Recipe hierarchy includes:
- IRecipe
- RecipeBase
- SubstrateRecipe
- WaferRecipe
- CarrierRecipe
- ProcessRecipe
Use existing recipe abstractions and managers:
- RecipeManager
- RecipeWrapManager
Do not bypass repository recipe patterns by creating incompatible configuration systems.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>䷽ϵͳ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>в㼶<EFBFBD><EFBFBD>
- `IRecipe`
- `RecipeBase`
- `SubstrateRecipe`
- `WaferRecipe`
- `CarrierRecipe`
- `ProcessRecipe`
Ӧ<EFBFBD><EFBFBD><EFBFBD>ȸ<EFBFBD><EFBFBD>ã<EFBFBD>
- `RecipeManager`
- `RecipeWrapManager`
<EFBFBD><EFBFBD>Ҫ<EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>
## Parameter and Process Input Rules
- Prefer reading process inputs from recipe objects and formal managers
- Do not pull process parameters from UI state when repository recipe/domain objects already exist
- Keep process input sources explicit and traceable
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><E4B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬲<EFBFBD>Ҫ<EFBFBD><D2AA> UI ״̬<D7B4><CCAC>ȡ<EFBFBD><C8A1><EFBFBD>̲<EFBFBD><CCB2><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԴҪ<D4B4><D2AA>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>׷<EFBFBD><D7B7>
## File Persistence Rules
Persistence follows:
- IFileWritable
- FileWriteBase
- JsonFileWritableBase
Use:
- FileWriteQueue for async queued file writes
- Newtonsoft.Json for JSON serialization
Reuse IgnorePropertiesResolver when selective serialization is needed.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>ļ<EFBFBD><EFBFBD>־û<EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>мܹ<EFBFBD><EFBFBD><EFBFBD>
- `IFileWritable`
- `FileWriteBase`
- `JsonFileWritableBase`
Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
- `FileWriteQueue` <20><><EFBFBD><EFBFBD><EFBFBD>첽д<ECB2BD><D0B4><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>
- `Newtonsoft.Json` <20><><EFBFBD><EFBFBD> JSON <20><><EFBFBD>л<EFBFBD>
- <20><>Ҫѡ<D2AA><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> `IgnorePropertiesResolver`
## Logging Rules
- Use `LogNameDefine` for log names
- Use `LogManager` for unified log management
- Keep logs consistent with existing MaxWellGeneralLog usage
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB> `LogNameDefine` <20>ж<EFBFBD><D0B6><EFBFBD>
- ͨ<><CDA8> `LogManager` ͳһ<CDB3><D2BB><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `MaxWellGeneralLog` <20>÷<EFBFBD>һ<EFBFBD><D2BB>
## Logging Expectations
Generated code should:
- log major workflow and hardware steps
- log failures with enough context
- preserve traceability for production and troubleshooting
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD>ɴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־Ӧ<EFBFBD><EFBFBD><EFBFBD>
- <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
- ʧ<><CAA7><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ݺ<EFBFBD><DDBA>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,105 @@
---
applyTo: "MainShell/Process/**/*.cs,**/*Activity.cs,**/*Workflow*.cs,**/*ProcessService.cs,**/*MotionService.cs"
---
# Workflow Instructions
## Workflow Architecture
This repository uses:
- WorkflowRunner
- AutoProductionWorkflowBuilder
- ActivityAbstractBase
- CompositeActivity
- WorkflowStepIds
- WorkflowStepIdResolver
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Workflow <20>ܹ<EFBFBD>ʵ<EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>ɴ<EFBFBD><C9B4><EFBFBD>ʱӦ<CAB1><D3A6><EFBFBD>ȸ<EFBFBD><C8B8><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>ơ<EFBFBD>
## Layering Rules
- Activity layer only:
- calls Service / MotionService / ProcessService
- writes WorkflowContext
- returns execution result
- PrepareExecute and AfterExecute only handle pre/post processing
- Core workflow logic must be implemented in Service layer
- Do not place recipe parsing, compensation logic, vision logic, or hardware orchestration in Activity
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- Activity <20><>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Service<63><65>д WorkflowContext<78><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
- `PrepareExecute` <20><> `AfterExecute` ֻ<><D6BB>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Service <20><>
- <20><>Ҫ<EFBFBD><D2AA> Activity <20><>д<EFBFBD><EFBFBD><E4B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD><E3B7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## Routing Rules
- Do not place workflow jump logic in Activity
- Actual workflow transitions must be configured by WorkflowStep
- Normal business branches should use Route / SetRoute
- Failure should only be used for real failures:
- hardware error
- timeout
- communication failure
- invalid required input
- unrecoverable process error
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>Ҫ<EFBFBD><D2AA> Activity <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>߼<EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תͳһ<CDB3><D2BB> WorkflowStep <20><><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> `Route / SetRoute`
- `Failure` ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>󡢳<EFBFBD>ʱ<EFBFBD><CAB1>ͨѶʧ<D1B6>ܡ<EFBFBD><DCA1>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>ȱʧ<C8B1><CAA7><EFBFBD><EFBFBD><EFBFBD>ɻָ<C9BB><D6B8><EFBFBD><EFBFBD><EFBFBD>
## JumpConditions Rules
- JumpConditions are matched in add order
- More specific branches must be placed first
- Default flow must be placed last
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
`JumpConditions` ƥ<><C6A5>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>ִ<EFBFBD>У<EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
- Ĭ<>Ϸ<EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## Service Responsibilities
Service layer should be responsible for:
- reading WorkflowContext
- reading RecipeManager and current recipe
- reading teach data and process parameters
- acquiring hardware via HardwareManager
- validating inputs
- validating hardware state
- validating safety conditions
- executing workflow core steps
- computing business result or compensation result
- determining Route
- returning structured process result
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
Service <20><>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD>
- <20><>ȡ `WorkflowContext`
- <20><>ȡ `RecipeManager` <20>͵<EFBFBD>ǰ<EFBFBD>
- <20><>ȡʾ<C8A1><CABE><EFBFBD><EFBFBD><EFBFBD>ݺ͹<DDBA><CDB9>ղ<EFBFBD><D5B2><EFBFBD>
- ͨ<><CDA8> `HardwareManager` <20><>ȡӲ<C8A1><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- У<><D0A3><EFBFBD><EFBFBD><EFBFBD>롢Ӳ<EBA1A2><D3B2>״̬<D7B4>Ͱ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
- ִ<>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><CCB2><EFBFBD>
- <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲹳<EFBFBD><F2B2B9B3><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD> `Route`
- <20><><EFBFBD>ؽṹ<D8BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## Output Preference
When implementing workflow code, prefer:
1. Activity skeleton
2. Service skeleton
3. result object design
4. WorkflowContext write-back fields
5. WorkflowStep routing suggestion
6. JumpConditions ordering suggestion
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. Activity <20>Ǽ<EFBFBD>
2. Service <20>Ǽ<EFBFBD>
3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4. WorkflowContext <20><>д<EFBFBD>ֶ<EFBFBD>
5. WorkflowStep ·<>ɽ<EFBFBD><C9BD><EFBFBD>
6. JumpConditions ˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,72 @@
---
applyTo: "**/*ViewModel.cs,**/*.xaml,MainShell/Converter/**/*.cs,MainShell/Home/**/*.cs,MainShell/ParaSetting/**/*.cs,MainShell/DeviceMaintance/**/*.cs,MainShell/PageCalib/**/*.cs,MainShell/Manual/**/*.cs"
---
# WPF and MVVM Instructions
## Framework
This repository uses WPF with Stylet.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ WPF <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> Stylet<65><74>MVVM <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ Stylet <20><>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>
## ViewModel Rules
- ViewModel classes should inherit from `Screen` or `PropertyChangedBase`
- Follow Stylet naming convention:
- XxxView ? XxxViewModel
- Do not introduce patterns that conflict with Stylet conventions
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
ViewModel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- ViewModel <20>̳<EFBFBD> `Screen` <20><> `PropertyChangedBase`
- View <20><> ViewModel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
- <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stylet <20><>ͻ<EFBFBD><CDBB> MVVM ģʽ
## State Management
- Prefer bindable state objects to hold UI state
- Do not scatter many unrelated primitive bindable properties if a cohesive state model is more suitable
- Distinguish device input state and output state clearly
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ÿɰ<C3BF><C9B0><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>״̬
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>״̬<D7B4>򣬲<EFBFBD>Ҫ<EFBFBD><D2AA>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ViewModel <20><>
- <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ҫ<CCAC><D2AA>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>
## IoC Rules
- IoC registrations belong in `StartBootstrapper.ConfigureIoC()`
- Singleton services should use `[Singleton]` or be registered as singleton in IoC
- New services must be registered consistently with existing project patterns
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
IoC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- IoC ע<><D7A2>ͳһ<CDB3><D2BB> `StartBootstrapper.ConfigureIoC()` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> `[Singleton]` <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## XAML Rules
- Do not manually implement `InitializeComponent`
- Do not work around WPF compilation issues by writing manual code-behind loaders
- Fix page compilation through project file and proper WPF item setup
- Value converters should be placed in `Converter/` and named `XxxConverter`
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
XAML <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>Ҫ<EFBFBD><D2AA>д `InitializeComponent`
- <20><>Ҫͨ<D2AA><CDA8> code-behind <20>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- ҳ<><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧͨ<D3A6><CDA8> csproj <20><> WPF <20><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
- ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `Converter/` <20>£<EFBFBD><C2A3><EFBFBD>ʹ<EFBFBD><CAB9> `XxxConverter` <20><><EFBFBD><EFBFBD>
## Language Resource Rules
Project language resources are loaded from:
- `Language/MaxwellFramework_{lang}.xaml`
- `Language/MXJM_{lang}.xaml`
Keep generated UI code compatible with the existing localization mechanism.
## <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD>ƣ<EFBFBD>
- ƽ̨<C6BD><CCA8><EFBFBD>԰<EFBFBD><D4B0><EFBFBD>`MaxwellFramework_{lang}.xaml`
- <20><>Ŀ<EFBFBD><C4BF><EFBFBD>԰<EFBFBD><D4B0><EFBFBD>`MXJM_{lang}.xaml`
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ҫ<EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ơ<EFBFBD>