استخدم هذا النمط للحفاظ على مزامنة Twenty مع بيانات المنتجات من مستودع البيانات لديك (مثل Snowflake وBigQuery وPostgreSQL).
بنية سير العمل
- المحفّز: وفق جدول زمني
- Code: الاستعلام عن مستودع البيانات لديك
- Code (اختياري): تنسيق البيانات كمصفوفة
- Iterator: التكرار عبر كل منتج
- Upsert Record: أنشئ أو حدّث في Twenty
الخطوة 1: جدولة المُحفّز
اضبط سير العمل ليعمل بتواتر يتوافق مع احتياجاتك من حداثة البيانات:
- كل 5 دقائق لمزامنة شبه فورية
- كل ساعة للبيانات الأقل أهمية
- يوميًا للتحديثات الدفعية
الخطوة 2: الاستعلام عن مستودع البيانات لديك
أضِف إجراء Code لجلب البيانات الحديثة:
export const main = async () => {
const intervalMinutes = 10; // Match your schedule frequency
const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
// Replace with your actual data warehouse connection
const response = await fetch("https://your-warehouse-api.com/query", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
query: `
SELECT id, name, sku, price, stock_quantity, updated_at
FROM products
WHERE updated_at >= '${cutoffTime}'
`
})
});
const data = await response.json();
return { products: data.results };
};
قم بالتصفية حسب updated_at >= last X minutes لاسترجاع السجلات التي تغيّرت حديثًا فقط. هذا يحافظ على كفاءة المزامنة.
الخطوة 3: تنسيق البيانات (اختياري)
إذا كان مستودعك يُرجع البيانات بتنسيق يحتاج إلى تحويل، فأضف إجراء Code آخر. تشمل التحويلات الشائعة تحويل الأنواع، وإعادة تسمية الحقول، وتنظيف البيانات.
مثال: بيانات المستخدم مع حقول منطقية وحقول الحالة
export const main = async (params: {
users: any;
}): Promise<object> => {
const { users } = params;
const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
// Convert string "true"/"false" to actual booleans
const toBool = (v: any) => v === true || v === "true";
return {
users: usersFormatted.map((user) => ({
...user,
activityStatus: String(user.activityStatus).toUpperCase(),
isActiveLast30d: toBool(user.isActiveLast30d),
isActiveLast7d: toBool(user.isActiveLast7d),
isActiveLast24h: toBool(user.isActiveLast24h),
isTwenty: toBool(user.isTwenty),
})),
};
};
مثال: بيانات المنتج مع تحويلات الأنواع
export const main = async (params: { products: any }) => {
const products = typeof params.products === "string"
? JSON.parse(params.products)
: params.products;
return {
products: products.map(product => ({
externalId: product.id,
name: product.name,
sku: product.sku,
price: parseFloat(product.price), // String → Number
stockQuantity: parseInt(product.stock_quantity),
isActive: product.status === "active" // String → Boolean
}))
};
};
مثال: تنسيق التاريخ والعملة
export const main = async (params: { deals: any }) => {
const deals = typeof params.deals === "string"
? JSON.parse(params.deals)
: params.deals;
return {
deals: deals.map(deal => ({
...deal,
// Convert Unix timestamp to ISO date
closedAt: deal.closed_timestamp
? new Date(deal.closed_timestamp * 1000).toISOString()
: null,
// Ensure amount is a number (remove currency symbols)
amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
// Normalize stage names
stage: deal.stage?.toLowerCase().replace(/_/g, " ")
}))
};
};
التحويلات الشائعة
| تنسيق المصدر | تنسيق الهدف | كود |
|---|
"true" / "false" | true / false | v === true || v === "true" |
"123.45" | 123.45 | parseFloat(value) |
"active" | "ACTIVE" | value.toUpperCase() |
1704067200 (Unix) | تاريخ ISO | new Date(v * 1000).toISOString() |
"$1,234.56" | 1234.56 | parseFloat(v.replace(/[^0-9.-]/g, "")) |
null / undefined | "" | value || "" |
الخطوة 4: التكرار عبر المنتجات
أضِف إجراء Iterator:
- المدخل:
{{code.products}}
يقوم هذا بالتكرار عبر كل منتج في المصفوفة.
الخطوة 5: إجراء Upsert لكل سجل
داخل المُكرِّر، أضف إجراء Upsert Record:
| الإعداد | القيمة |
|---|
| الكائن | كائن المنتج المخصص لديك |
| المطابقة حسب | المعرّف الخارجي أو SKU (مُعرّف فريد) |
| الاسم | {{iterator.item.name}} |
| SKU | {{iterator.item.sku}} |
| السعر | {{iterator.item.price}} |
استخدم Upsert (تحديث أو إنشاء) بدلًا من إنشاء فروع منفصلة للإنشاء مقابل التحديث. إنه أسرع في الإنشاء وأسهل في استكشاف الأخطاء وإصلاحها.
أمثلة لحالات الاستخدام
| المصدر | بيانات |
|---|
| نظام تخطيط موارد المؤسسة (ERP) | كتالوج المنتجات، التسعير، المخزون |
| منصة التجارة الإلكترونية | الطلبات، العملاء، تحديثات المنتجات |
| مستودع البيانات | مقاييس مجمّعة، بيانات مُثرَاة |
| نظام إدارة المخزون | مستويات المخزون، تنبيهات إعادة الطلب |
ذات صلة