92 行
2.0 KiB
JavaScript
92 行
2.0 KiB
JavaScript
const cron = require('node-cron');
|
|
|
|
const { FEATURE_FLAG_KEYS, evaluateFeatureFlag } = require('../services/featureFlags');
|
|
const { syncErpMasterData } = require('../services/integrations/erpMasterData');
|
|
|
|
async function runErpMasterDataSyncOnce(prisma, config, logger) {
|
|
if (!config.erpMasterDataSyncCron) {
|
|
return {
|
|
skipped: true,
|
|
reason: 'cron_disabled',
|
|
items: [],
|
|
};
|
|
}
|
|
|
|
const gate = await evaluateFeatureFlag({
|
|
prisma,
|
|
config,
|
|
flagKey: FEATURE_FLAG_KEYS.erpSync,
|
|
departmentId: null,
|
|
strictDepartment: false,
|
|
});
|
|
|
|
if (!gate.enabled) {
|
|
logger.info(
|
|
{
|
|
featureFlag: FEATURE_FLAG_KEYS.erpSync,
|
|
reason: gate.reason,
|
|
},
|
|
'ERP master data sync skipped by ERP gate',
|
|
);
|
|
return {
|
|
skipped: true,
|
|
reason: gate.reason,
|
|
items: [],
|
|
};
|
|
}
|
|
|
|
return syncErpMasterData(prisma, config, { logger });
|
|
}
|
|
|
|
function startErpMasterDataSyncJob(fastify) {
|
|
if (!fastify.config.erpMasterDataSyncCron) {
|
|
fastify.log.info('ERP master data sync cron disabled');
|
|
return null;
|
|
}
|
|
|
|
let running = false;
|
|
const task = cron.schedule(fastify.config.erpMasterDataSyncCron, async () => {
|
|
if (running) {
|
|
return;
|
|
}
|
|
|
|
running = true;
|
|
try {
|
|
await runErpMasterDataSyncOnce(fastify.prisma, fastify.config, fastify.log);
|
|
fastify.metrics?.jobRunsTotal?.inc?.({
|
|
job: 'erp.master-data.sync',
|
|
driver: 'cron',
|
|
outcome: 'success',
|
|
});
|
|
} catch (error) {
|
|
fastify.log.error({ err: error }, 'ERP master data sync job failed');
|
|
fastify.metrics?.jobRunsTotal?.inc?.({
|
|
job: 'erp.master-data.sync',
|
|
driver: 'cron',
|
|
outcome: 'failure',
|
|
});
|
|
} finally {
|
|
running = false;
|
|
}
|
|
});
|
|
|
|
fastify.addHook('onClose', async () => {
|
|
task.stop();
|
|
task.destroy();
|
|
});
|
|
|
|
fastify.log.info(
|
|
{
|
|
cron: fastify.config.erpMasterDataSyncCron,
|
|
},
|
|
'ERP master data sync job scheduled',
|
|
);
|
|
|
|
return task;
|
|
}
|
|
|
|
module.exports = {
|
|
runErpMasterDataSyncOnce,
|
|
startErpMasterDataSyncJob,
|
|
};
|