In diesem Artikel wird hauptsächlich das Speichern von Entitätsdaten vorgestellt. Der spezifische Inhalt ist wie folgt;
1. XML -Probe
<? HH24: MM: SS "> <!-Im Folgenden sind die Abfrageergebnisse für jede Abfrageanwendung 1..N-> <cisReport reportId =" Berichtsnummer "BuildendTime =" Bericht Generierung Endzeit, Format yyyy-mm-mm-dd hh24: mm: ss "queryreasonid = Query-Freary-Id-Id the Data Dotionary For Details" Die Details für Details "Für Details:" SubReptyPes "Query, siehe Data-Diktion-Details," dationary for details for details for details for details for details for details "detailary for details for details for details for details" details for details for details for details for details " Die Sub -Report -IDs werden durch commas "TreatmentResult =" Kompaktgebührenzählzeiten des Gebührs -Subberichts getrennt, die den Subreportypen entsprechen, ein Satz von Werten, die größer oder gleich 0 sind, von Commas "SubreporttypesshortCaption =" Abfragebührer -Subreport -Namen "HassSynror." Richtig: Es gibt einen Fehler, Falsch: No Fehler "isFrozen =" Ob der Kunde gefroren ist, Richtig: Frozen, false: nicht gefroren "> <!-1Query-Bedingungsinformationen 1..1-> <queryConditions> <!-1..n-> <item> <Name Abfragen Bedingung. </queryConditions> <!-2Identity authentication1..1-> <policecheckInfo subreporttype = "10602" SUBREPREPTTYPECOST = "96040" TreatmentResult = "SUBREPORT-Abfragestatus 1: Find, 2: Nicht gefunden. Wörterbuch Wenn Treatresult! Ergebnis 1, konsistent 2, inkonsistent </result> </item> </policecheckInfo> <!-3 Personen Mobilfunknummer Überprüfung 1..1-> <mobileckinfo subreporttype = "13612" SUBREPORTTYTYPECOST = "96040 "behandlungsstatus. Code = "treatresult = 3, siehe das Datenwörterbuch für Details. Wenn Treatresult! = 3, existiert das Attribut nicht." ErrorMessage = "Fehlerbeschreibungsinformationen Wenn tratresult = 3, wenn tratresult! Ergebnisse, einschließlich: konsistent, inkonsistent und inkonsistent </documentNoCheckResult> <phonecheckResult> Ergebnisse der Mobilfunknummer: Konsistent, unkontrollierbar </phonecheckResult> <Areainfo> Zahlenbeschreibung </Areainfo> <Operator> Operator 1: China Telecom 2: China Mobile 3: China Unicom </Operators </item> </item> </item> </item> </item> </element> </mobilta: China Mobile 3: China: China: China: China </operator </item> </item> </item> </item> </item> </item> </element> itel von 4 persönlichen Anti-Aussagen Risiken 1..1-> <personantispoofingdescinfo subreporttype = "14225" SUBREPORTTYPECOST = "96040" TreatmentResult = "SUBREPORT Query Status, 1: gefunden, 2: nicht gefunden, 3: Nicht gefundene Gründe. TreatSult! = 3, das Attribut existiert nicht. Wie im folgenden Beispiel kann es leer sein, und es kann 0 oder n von ihnen geben, was gemäß dem spezifischen Ergebnis zurückgegeben werden kann. 1. Der Anti-Fraud-Risikowert beträgt 100 Punkte, das Risiko ist hoch und es wird empfohlen, abzulehnen. 2. Mobiltelefonnummer 131 **** 1542 wurde für weniger als 1 Monat verwendet. 3. Schlagen Sie die Liste der Wollpartys. 4. Liste der Hit -Betrugsrisiken. 5. Liste des Hochrisikos. 6. Es gibt 7 überfällige Kreditakten. 7. Es gibt 40 Informationen zur Zusammenfassung des persönlichen Risikos. 8. In den letzten zwei Jahren wurden meine persönlichen Daten 23 Mal befragt. -> <personantispoofingdesc> persönliche Anti-Fr-Frag-Überprüfungsinformationen </personantispoofingdesc> </personantispoofingdesc> <!-5 persönliche Information von Risikobewertungen für das Anti-aus-Frag 1..1-> <personantispoofingInfo subreporttype = "14224" Subreporttypecost = "96040" -Scharning-2 "-Scharning-2" -Scharning-2 "-Scharning-2" -Scharning-2 "-Scharning-2". Überprüft, 3: Nicht aus anderen Gründen überprüft "Der Fehlercode, wenn TreaterrorCode =" treatresult = 3, siehe das Datenwörterbuch für Details. ErrorMessage = "Fehlerbeschreibungsinformationen Wenn tratresult = 3, wenn tratresult! = 3, ist der Wert dieser Eigenschaft leer"> "> <! -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 6 Informationen zur Mobiltelefonnummer Status 1..1 -> <Mobilestatusinfo subreporttype = "13611" SUBREPREPTTYPECOST = "96040" TreatmentResult = "Subbericht -Abfragestatus 1: Finden Sie, 2: Nicht gefunden, 3: Nicht gefunden aus anderen Gründen" "Fehlercode". ErrorMessage = "Fehlerbeschreibungsinformationen Wenn tratresult = 3, wenn tratresult! 1: Normale Gebrauch 2: Herunterfahren 3: Nicht aktiviert 4: Zahl storniert 5-OTER 6: Voraufforderung </phonestatus> <Timelength> Mobiltelefonnummer im Internet, wie z. Liste der Wollparteien 1..1-> <econnoisserurinfo subreporttype = "14228" subreporttypecost = "96040" TreatmentResult = "Subberichtsabfragestatus, 1: Finden Sie, 2: nicht gefunden, 3: Nicht gefunden aus anderen Gründen" Fehlercode "Die Fehlercode, bei der es zu behandeln ist. Wenn Treatresult! <! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3. SUBREPORTTYPECOST = "96040" TreatmentResult = "SUBREPRORT -Abfragestatus, 1: Find, 2: Nicht gefunden, 3: Nicht aus anderen Gründen gefunden" "TreaterrorCode =" Treatresult = 3 Fehlercode, siehe die Datenwörterbuchung, wenn Treatresult! Der Wert dieser Eigenschaft ist leer. SUBREPORTTYPECOST = "96040" TreatmentResult = "Sub -Report -Abfragestatus, 1: Find, 2: Nicht überprüft, 3: Nicht aus anderen Gründen gefunden" "Treaterrorcode =" Treatresult = 3, siehe die Datenwörterbuchung, wenn Treatresult! Der Wert dieses Attributs ist leer. SUBREPORTTYPECOST = "96040" TreatmentResult = "Abfragestatus des Subberichts, 1: Finden, 2: Nicht gefunden, 3: Nicht aus anderen Gründen gefunden" Der Fehlercode, wenn treaterrorCode = "treatresult = 3, siehe das Datenwörterbuch für Details. Wenn Treatresult! = 3, gibt es nicht das Attribut. Grundlegende Informationen über das Darlehen </Overduamount> <Overduedays> Überfällige Tagesintervall, Wertebereich: Überfällige eines Tages (inklusive) oder mehr </überbewertetes> <Overducount> Gesamtzahl der Transaktionen in der Anzahl der überfälligen Tagesintervallintervall </Overducount> </stat> <!-0.1-> <Elemente> <item> <items> <items> <items> <items> <items> <items> <items> <items> <items> <items> <items> <items> <! <Overduamount> Überfälliger Kapital, Einheit: Basierend auf der Währung der grundlegenden Informationen des Darlehens </Overduamount> <Overdedays> Überfällige Tagesintervall, Wertebereich: 1-6 Tage Überfällige, 7-29 Tage Überfällige, 30-59 Tage überdurchschnittlich, 60-89 Tage, mehr als 90 Tage. Überfällige Tage Intervall </Overducount> </item> </item> </micRonearlyTheeyarsoverdueinfo> <!-11 Risikoinformationen 1..1-> <PersonRiskinfo SUBREPORTTYPE = "14227" SUBREPREPTTYPECOST = "96040 TREFORTRETTYPE = SUBREPREPORT FORTREPORT FORTREPORT, 1: NICHT FOHRELRESULT, 3: NICHT FOHRELRESULT," SUBREPREPRORT CONTURT, 1 "Footha:" Subreport-Foundresult ". Gründe "Der Fehlercode, wenn TreaterrorCode =" treatresult = 3, siehe das Datenwörterbuch für Details. Wenn Treatresult! <!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <cqggcount> Anzahl der Informationen zur Ankündigung der Einstellung </cqggcount> <wdyqCount> Anzahl der Informationen zum überfälligen Online-Darlehen </wdyqCount> </stat> <!-Zusammenfassung Informationen End-> <! -> <element> <EctratId> Datensatznummer </recordID> <Bt> Titel </bt> <ajlx> Falltyp </ajlx> <sjnf> Jahr der Überprüfung, Format: yyyy </sjnf> <dsrlx> Typ der Party </dsrlx> </item> </als> </als> </</Als> <! Summary information of judicial enforcement information 1..n --> <item> <recordId>Record number</recordId> <bt>Title</bt> <zxbd>Execution object, unit: currency shall prevail</zxbd> <larq>Filing date, format YYYY-MM-DD</larq> </item> </zxs> <!-- Summary information of judicial breach of trust 0..1 --> <sxs> <!-Zusammenfassung Informationen zur gerichtlichen Verletzung von Vertrauensinformationen 1..N-> <Epips> <EctratId> Datensatznummer </recordID> <Bt> Titel </bt> <larq> Anmeldedatum, Format YYYYY-MM-DD </larq> </fbrq> -Fr. Zusammenfassungsinformationen 0..1-> <SWS> <!-Steuerverwaltungsverwaltungsinformationen Zusammenfassung Inhalt Inhalt 1..n-item> <contratId> Datensatznummer </recordID> <bt> Titel </bt> <ggrq> Ankündigung Datum, Format-Yyyyyy-MM-DD </ggrq> </item> </sws> <! Administrative Law Enforcement Information Summary Information Content 1..n --> <item> <recordId>Record Number</recordId> <bt>Title</bt> <fbrq>Release date, format YYYY-MM-DD</fbrq> </item> </cqs> <!-- Overdue information summary information of online loans 0..1 --> <wdyqs> <!-- Overdue information summary information of online loans 1..n --> <item> <recordId>Record number</recordId> <bt>Title</bt> <fbrq>Release date, format YYYY-MM-DD</fbrq> </item> </wdyqs> </ summary> </personRiskInfo> <!--12 persons' historical query records in the past two years 1..1 --> <historySimpleQueryInfo subReportType="19902" SUBREPORTTYPECOST = "96040" TreatmentResult = "Sub -Report -Query -Status, 1: Check, 2: Nicht gefunden, 3: Nicht aus anderen Gründen gefunden" "Fehlercode". ist leer "> <! --- Wenn das Treatreatresult 2 und 3 ist, gibt es keine folgenden Knoten-> <!-0..1-> <items> <!-1..n-> <item> <UnitMember> Einheit Typ Name </Einheit. Abfragenaufzeichnungen in den letzten 6 Monaten </last6month> <last12month> Anzahl der Abfragen in den letzten 12 Monaten. Abfragenaufzeichnungen in den letzten 1 Monat </last1month> <last3monas> Gesamtzahl der Abfrageaufzeichnungen in den letzten 3 Monaten </letztes 3 Monate> <last 6month> Gesamtzahl der Abfragebatensätze in den letzten 6 Monaten </last 6 Monate> <last12month> Gesamtzahl der Abfragebatensätze in den letzten 12 Monaten. Monate </last18month> <last24month> Gesamtzahl der Abfragedatensätze jedes Einheitentyps in den letzten 24 Monaten </last24month> </count> </historySimpleQueryInfo> </cisreport> </cisreports>
2. Designstrukturdesign
1. Batchnummer: Jede Tabelle ist der äußersten Chargennummer zugeordnet.
2. Haupttabelle: Das heißt, alle Felder jeder Schicht werden in einer Tabelle gespeichert.
Drei, physisches Design
Es ist in drei Schichten unterteilt: Cisreportroot, Cisreportchild, ReportElement
öffentliche Klasse CisReporTroot erweitert Basepojo implementiert serialisierbare {private String docid; private String batno; // Abfrage -Batchnummer @jsonfield (serialize = false) private String xmlid; Privates CisReportchild CisReportchild;/*** 2017/7/21. *Bericht von Knoten und untergeordneten Knoten*/öffentliche Klasse CisReportChild erweitert Basepojo {/***Bericht Generation Endzeit **/privat String BuildendTime; / ***Gibt es einen Systemfehler, dass es false gibt, was bedeutet, dass es keine **/ private String -HasssystemError gibt; / ***ob der Kunde gefroren ist **/ private Zeichenfolge isFrozen; Private ReportElement ReportElement; öffentliche Klasse ReportElement erweitert Basepojo {private String -Telefon; Private PolicecheckInfo PolicecheckInfo; // Identitätsauthentifizierung private mobileckinfo mobileckinfo;//Person Mobiltelefonnummer Überprüfung privater Personantispoofingdescinfo personantispingDescinfo; // persönliche Anti-Fraud-Risiko-Überprüfung Informationen privater personantispofofo-personantispoiTispoptatinfo; MOBILESTATUSINFO; // Mobiltelefonnummer Statusinformationen private econnoisserurinfo econnoisserurinfo; // Treffer auf die Wollparty-Liste privater Betrüger-Betrüger. MicRonearlyTheeyarsoverdueinfo; // Online -Darlehen Überfällige Informationen private PersonRiskinfo PersonRiskinfo; // Risikoinformationen privat History -SimplequeryInfo HistorySimplequeryInfo; // Personal History Query Record in den letzten zwei JahrenVier, Code
<1> Einzeltransaktion, kein Primärschlüssel in Chargen erforderlich
Daten können in Karten in einzelnen Transaktionen oder Stapeln gespeichert werden, und Daten können über Kartenschlüssel in SQL erhalten werden.
wie:
private void SavePersonRiskinfo (String batno, personRiskinfo personRiskinfo) löst eine Ausnahme aus {map <String, Objekt> map = new Hashmap <> (); map.put ("batno", batno); // Einhand Map.put ("item", PersonRiskinfo); pyMapper.savePersonRiskinfo (MAP); if (! listutil.isempty (personRiskinfo.getallist ()) {// batch map.put ("list", personRiskinfo.getallist ()); pyMapper.savealinfolist (MAP); }SQL:
<!--Personal Risk Record--> //Single<insert id="savePersonRiskInfo" parameterType="java.util.Map"> INSERT INTO TABLE_PERSON_RISK_INFO(BATNO,TOTLECOUNT,ALCOUNT,ZXCOUNT,SXCOUNT,SWCOUNT,CQGGCOUNT,WDYQCOUNT) VALUES (#{batNo,jdbcType=VARCHAR}, #{item.totleCount, jdbctype = numeric}, #{item.alcount, jdbctype = numeric},#{item.zxCount, jdbctype = numeric},#{item.sxCount, jdbctype = numeric},#{ item.swcount, jdbctype = numeric},#{item.cqggcount, jdbctype = numeric},#{item.wdyqcount, jdbctype = numeric}) </einfügen> <!-detaillierter Aufzeichnung von Überfälligen-> // Batch <Insert id = "SavemicRonearlyTheyearsoverfolist" ParameterType = "java.util.map"> Intable in table_mntyoi (Batno, Overdueamount, Overduedays, OverDuencount) <für die Eehr-Sammlung = "liste" itemount, upredays, OverDuencount) <foreted collection #{batNo,jdbcType=VARCHAR}, #{item.overdueAmount,jdbcType=VARCHAR}, #{item.overdueDays,jdbcType=VARCHAR}, #{item.overdueCount,jdbcType=NUMERIC} FROM DUAL ) </foreach> </insert> private CisReportRoot Invokepy (PyQueryBean PyQueryBean) löst eine Ausnahme aus {PyQuerybean.setQueryFrompy (query_from_py); // PY Service CisReporTroot CisreporTroot = queryCisReportFrompyServer (PyQueryBean) anrufen; cisreportroot.getCisReportChild (). getReportElement (). SetPhone (PyQueryBean.Getphone ()); //cacheservice.save(cisReporTroot); // (1) Speichern Sie die Daten SaveCisReport (cisreporTroot); Cisreportroot zurückgeben; }(1) Daten speichern
@Transactional (rollbackFor = exception.class) @Override public cisreportroot löst Ausnahme aus {try {ReportElement ReportElement = cisRePorTroot.getCisRePortChild (). GetRePortelement (); PersonRiskinfo personRiskinfo = reportElement.getPersonRiskinfo (); // (2) Haupttabelle, speichern Sie alle Knoteninformationen von XML (ohne persönliche Risikoinformationen), speichern Sie einzelne Daten pymapper. if (success.equals (cisreporTroot.getCisReportChild (). getReportElement (). getPersonRiskinfo (). } if (cisReporTroot.getCisReportChild (). getReportElement (). GethistorySimplequeryInfo (). // (3) Stapeldatenkarte speichern. if (! listutil.isempty (cisreportroot.getCisReportChild (). getReportElement (). GethistorySimplequeryInfo (). getItemList ()) {map.put ("Liste",, cisreportroot.getCisReportChild (). getReportElement (). GethistorySimplequeryInfo (). GetItemList ()); pyMapper.SavehistorySimpleQueryInfolist (MAP); } if (! listutil.isempty (cisreportroot.getCisReportChild (). getReportElement (). getMicRoneArlyTheyearsoverduInfo (). getList ()) {map.put ("Liste",, cisreportroot.getCisReportChild (). getReportElement (). pyMapper.savemiconearlyTheeyarsoverdueinfolist (MAP); }} return cisReporTroot; } catch (Ausnahme e) {logger.Error ("SaveCisReport@pyServiceImpl_Exception", e); werfen e; }}(2) Speichern Sie den Haupttisch
<einfügen id = " MCI_NAMECHECKRESULT, MCI_AREAINFO, MCI_DOCUMENTNOCKRESULT, MCI_OPERATOR, MCI_PHONECHECKRESULT, PCI_DOCUMENTNO, PCI_NAME, PCI_RESULT, PASDI_DESC, Pasi_hittTypes, pasi_risklevel, pasi_risskscore, pasi_risSuggest, ms_areainfo, ms_canceltime, ms_operator, ms_phonestatus, ms_timelength, econnoisserur, Strandrisk, pra_checkresult, Mntyoi_overdueamount, mntyoi_overducount, mntyoi_overducount, mntyoi_overduedays, hs_last1month, hs_last3month, hs_last6month, hs_last12month, hs_last18month) (#{batno, jdbctype = varchar}, to_date (#{cisreportChild.buildendtime}, 'yyyy-mm-dd hh24: mi: ss'),#{cisreportChild.isfrozen, jdbctype = varchar}}, #{cisReportChild.ReportElement.MobileCheckInfo.NamecheckResult, jdbctype = varchar}, #{cisReportChild.reportElement #{cisReportChild.ReportElement.MobileCheckInfo.DocumentNoCKResult, jdbctype = varchar}, #{cisReportChild.reportElement.mobileCheckinfo.operator, jdbctype = numeric}, #{cisReportChild.ReportElement.mobileCheckInfo.PhonecheckResult, jdbctype = varchar}, #{cisReportChild.reportElement.PolicechEckinfo.DocumentNo, jdbctype = varchar}}, #{cisReportChild.ReportElement.PolicecheckInfo.Result, jdbctype = numeric}, #{cisReportChild.reportElement.personantispoofingDescinfo.Personantispoofingdesc, jdbctype = varchar},, #{cisReportChild.ReportElement.PersonantispoofingInfo.hittypes, jdbctype = varchar}, #{cisReportChild.ReportElement.Personantispoofofinginfo.Risklevel, jdbctype = varchar}}, #{cisReportChild.ReportElement.PersonantispoofingInfo.riskscore, jdbctype = varchar}, #{cisReportChild.ReportElement.PersonantispoofofingInfo.Suggest, jdbctype = varchar}},, #{cisReportChild.ReportElement.Mobilestatusinfo.AreAinfo, jdbctype = varchar}, #{cisReportChild.reportElement #{cisReportChild.ReportElement.Mobilestatusinfo.operator, jdbctype = numeric}, #{cisReportChild.reportElement.mobilestatusinfo.phonestatus, jdbctype = numeric},, #{cisReportChild.ReportElement.Mobilestatusinfo.Timelength, jdbctype = varchar}, #{cisReportChild.ReportElement.EconnoisSerurinfo.State, jdbctype = numeric},, #{cisReportchild.reportElement.frautriskinfo.state, jdbctype = numeric}, #{cisreportchild.reportElement.PersonRiskasss.Checkresult, jdbctype = numeric},, #{cisReportchild.reportElement #{cisReportChild.reportElement #{cisReportChild.reportElement #{cisReportchild.reportElement #{cisReportChild.reportElement(3) Stapeldaten speichern (automatisch werden keine Primärschlüssel generiert)
<!-Persönlicher historischer Abfrage-Datensatz in den letzten zwei Jahren-> <Einfügen ID = "SaveHistorySimplequeryInfolist" ParameterType = "java.util.map"> In table_history_Simple_query (Batno, Unit_Member, Last1Month, Last3Month) Last, Last12month, Last12month, Last12month, Last12month, Last12month, Last12month, Last12month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last12Month, Last,,, last. item = "item" separator = "Union All"> (SELECT #{batno, jdbctype = varchar}, #{item.UnitMember, jdbctype = varchar}, #{item.last1month, jdbctype = numeric}, #{item.last3month. #{item.last6Month,jdbcType=NUMERIC}, #{item.last12Month,jdbcType=NUMERIC}, #{item.last18Month,jdbcType=NUMERIC}, #{item.last24Month,jdbcType=NUMERIC} FROM DUAL ) </foreach> </insert> <2> Einzelhub, Batch muss in den Primärschlüssel eingefügt werden
Einzelhub enthält den Primärschlüssel
DataSeervicedetailResult DataSeervicedetailResult = tdService.getDataServicedTailResult (TDREPORTROOT); int n = tddataServicemapper.insertDataServicedetailResult (dataSeVictedETAilResult); <!-Informationsüberprüfungsschnittstelle-> <!-DataService-> <Insert ID = "InsertDataSevictedTailResult" ParameterType = "dataSaSevictedetailResult"> <selectKey keyProperty = "id" resultType = "bigdecimal" order = "vor"> SELEC_ICS_TDDE_DATEL. ICS_TD_DATASVICE (ID, RecordId, RecordId, RecessId, Recess_Code, Erfolg) Werte ( #{id, jdbctype = decimal}, #{recordID, jdbctype = decimal}, #{redbctype = varchar}}, #{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ #{Erfolg, jdbcType = decimal}) </Insert>Batch Save enthält den Primärschlüssel
if (! listutil.isempty (interfacesList)) {map.put ("recordId", id); map.put ("list", interfacesList); tddataServicemapper.addbatchInterfaces (MAP); }SQL:
<!-Batch Save-Schnittstellen-> <id = "addbatchInterfaces" parameterType = "java.util.list"> <!-Der Kommentar ist die MySQL-Einfügungsmethode. Es kann eingefügt werden, aber die Daten können nicht zurückgerollt werden. Im Folgenden ist die Oracle Insertion -Methode: Beachten Sie, dass ParameterType: java.util.list oder java.util.map beginnen kann <foreach collection #{recordId, jdbcType = decimal}, #{item.type, jdbctype = varchar}); </foreach> Commit; END;--> insert into ICS_TD_INTERFACES (ID,RECORDID, TYPE) SELECT SEQ_ICS_TD_INTERFACES.nextval ID, A.* FROM( <foreach collection="list" item="item" index="index" separator="union all"> SELECT #{recordId,jdbcType=DECIMAL}, #{item.type,jdbcType=VARCHAR} FROM DUAL </foreach>) a </einfügen>Zusammenfassen
Das obige ist die Methode, um physische Daten in einer einzelnen Stapel des Editors zu speichern. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!