Benutzerdefinierten ERP-Konnektor erstellen
Verwenden Sie den Vertrag in PDMPublisher.ERPExtension.dll, um einen Konnektor in C# zu erstellen. Referenzieren Sie die DLL aus derselben PDMPublisher-Version, die den Konnektor laden wird. Kopieren Sie die Vertragstypen nicht in Ihr Projekt und verteilen Sie keine weitere Kopie von PDMPublisher.ERPExtension.dll mit dem Konnektor. Der Host stellt sie bereit.
Tip
Informationen zur Installation des von Blue Byte Systems bereitgestellten Konnektors finden Sie unter ERPNext-Konnektor.
Projektanforderungen
- Erstellen Sie ein C#-Projekt vom Typ Class Library (.NET Framework) für .NET Framework 4.7.2.
- Erstellen Sie das Projekt für Any CPU oder x64 und verwenden Sie mit C# 7.3 kompatible Syntax.
- Fügen Sie einen Verweis auf
PDMPublisher.ERPExtension.dllhinzu und setzen Sie Kopieren Local aufFalse. - Die DLL muss genau eine öffentliche, nicht abstrakte Konnektorklasse mit einem öffentlichen parameterlosen Konstruktor enthalten.
- Leiten Sie neue Konnektoren von
ErpConnector<TSettings>ab. Direkte Implementierungen vonIErpExtensionwerden aus Kompatibilitätsgründen weiterhin unterstützt. - Legen Sie erforderliche DLLs von Drittanbieterabhängigkeiten neben der Konnektor-DLL ab.
- Speichern Sie niemals Produktionsanmeldeinformationen in Standardeinstellungen und geben Sie keine Geheimnisse in Ergebnismeldungen aus.
Empfohlener typisierter Konnektor
Die typisierte Basisklasse erstellt den Einstellungseditor aus einer öffentlichen Einstellungsklasse und passt die untergeordneten Schnittstellen automatisch an.
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using PDMPublisher.ERPExtension;
public sealed class AcmeErpSettings
{
[DisplayName("Server URL"), Category("Connection")]
public string ServerUrl { get; set; } = "";
[DisplayName("API token"), Category("Connection"), PasswordPropertyText(true)]
public string ApiToken { get; set; } = "";
[DisplayName("Timeout (seconds)"), Category("Connection")]
public int TimeoutSeconds { get; set; } = 60;
[DisplayName("Property mappings"), Category("Items"), ErpPropertyMappings]
public List<PropertyMapping> PropertyMappings { get; set; }
= new List<PropertyMapping>();
}
public sealed class AcmeErpConnector : ErpConnector<AcmeErpSettings>
{
public override string Id => "com.acme.erp";
public override string DisplayName => "Acme ERP";
public override ErpCapabilities Capabilities =>
ErpCapabilities.SelectiveSync | ErpCapabilities.BomSync;
public override async Task<ConnectionResult> ConnectAsync(
AcmeErpSettings settings)
{
bool connected = await ConnectToServerAsync(settings);
return connected
? ConnectionResult.Ok()
: ConnectionResult.Fail("The ERP connection could not be established.");
}
public override async Task<PushResult> SyncAsync(
ModelDocData data, ErpSyncOptions options)
{
// Operate only on data.Components and data.Boms supplied by the host.
// Respect options.SyncProperties, options.CreateItems, and options.SyncBom.
await SendSelectedRowsAsync(data, options);
return PushResult.Ok();
}
private Task<bool> ConnectToServerAsync(AcmeErpSettings settings)
=> Task.FromResult(true); // Replace with the ERP API call.
private Task SendSelectedRowsAsync(ModelDocData data, ErpSyncOptions options)
=> Task.CompletedTask; // Replace with item, property, and BOM API calls.
}
ConnectAsync wird vor der Synchronisierung für dieselbe Konnektorinstanz aufgerufen. Geben Sie bei erwarteten Authentifizierungs- oder Konfigurationsfehlern ConnectionResult.Fail(...) zurück. Der Host wiederholt ERP-Vorgänge nicht automatisch und macht sie nicht rückgängig. PushResult.Message muss daher Teiländerungen eindeutig benennen.
Vertragsschnittstelle
ErpConnector<TSettings> implementiert die Kernschnittstelle. Ein älterer Konnektor kann sie direkt implementieren:
public interface IErpExtension
{
string Id { get; }
string DisplayName { get; }
Dictionary<string, object> GetDefaultSettings();
Task<ConnectionResult> ConnectAsync(Dictionary<string, object> settings);
Task<PushResult> PushToErpAsync(ModelDocData modelData);
}
Die empfohlene Basisklasse unterstützt außerdem folgende optionale Funktionen:
| Funktion | Implementierung |
|---|---|
| Felderkennung | Geben Sie ErpCapabilities.FieldDiscovery an und überschreiben Sie GetFieldsAsync. Geben Sie stabile ERP-API-Feldnamen für den Zuordnungseditor zurück, ohne ERP-Daten zu ändern. |
| ERP-generierte Nummern | Geben Sie ErpCapabilities.PartNumberGeneration an, überschreiben Sie GetGeneratedPartNumberProperty und geben Sie bestätigte GeneratedPartNumber-Einträge in PushResult zurück. |
| Selektive Synchronisierung | Geben Sie ErpCapabilities.SelectiveSync an und beachten Sie ErpSyncOptions.SyncProperties und CreateItems. |
| Stücklistensynchronisierung | Geben Sie ErpCapabilities.BomSync an und verarbeiten Sie nur die ausdrücklichen Beziehungen in ModelDocData.Boms, wenn SyncBom ausgewählt ist. |
| Auswahl der Quellspalte | Kennzeichnen Sie eine Einstellungseigenschaft mit [ErpSourceColumn]. |
| Editor für Eigenschaftszuordnungen | Verwenden Sie List<PropertyMapping> und kennzeichnen Sie sie mit [ErpPropertyMappings]. |
| Bereinigung | Überschreiben Sie Dispose(), um HTTP-Clients oder andere dem Konnektor gehörende Ressourcen freizugeben. |
Dem Konnektor bereitgestellte Daten
ModelDocData ist eine getrennte Momentaufnahme. Wichtige Elemente sind:
Title,PathName,ActiveConfiguration,DocumentType,MassundMaterial.CustomPropertiesenthält Dokumenteigenschaften, die mit den Eigenschaften der aktiven Konfiguration zusammengeführt wurden.Componentsenthält nur aktivierte Zeilen im angeforderten Synchronisierungsbereich. JedesComponentDataenthält Quellidentität, Dateipfad, optionale PNG-Miniaturansicht, Artikelnummer, Hierarchieebene, Name, Konfiguration, ganzzahlige Menge und verfügbare Spalten- oder Eigenschaftswerte.Bomsenthält aktivierte übergeordnete Baugruppen und deren aktivierte direkte untergeordnete Elemente. Stücklistenzeilenmengen sind Dezimalwerte und unabhängig von der aggregierten Zeilenmenge.
Push-Vorgänge werden in einem Arbeitsthread ausgeführt, nachdem der Host die SOLIDWORKS-Daten im UI-Thread erfasst hat. Greifen Sie nicht auf SOLIDWORKS-COM-Objekte zu, setzen Sie keinen Synchronisierungskontext voraus, leiten Sie keine nicht aktivierten untergeordneten Elemente ab und blockieren Sie die Benutzeroberfläche nicht.
DLL erstellen und laden
- Erstellen Sie den Konnektor in der Konfiguration Release.
- Legen Sie Abhängigkeits-DLLs und optionale Konnektormetadaten neben der Haupt-DLL des Konnektors ab. Schließen Sie
PDMPublisher.ERPExtension.dllnicht ein. - Öffnen Sie in SOLIDWORKS PDMPublisher > Settings > ERP Sync > ERP connector settings.
- Wählen Sie Add new..., wählen Sie die Konnektor-DLL aus und prüfen Sie, ob ihr Name unter Custom angezeigt wird.
- Geben Sie die Einstellungen ein, wählen Sie Test connection und anschließend Save.
- Öffnen Sie ERP Sync und testen Sie ein kleines Dokument außerhalb der Produktion, bevor Sie Artikelerstellung oder Stücklistensynchronisierung für Produktionsdaten aktivieren.
Beim Laden eines Konnektors wird Drittanbietercode im SOLIDWORKS-Prozess ausgeführt. Installieren Sie nur Konnektoren aus vertrauenswürdigen Quellen.