文件
hyb-oa/server/src/jobs/erpMasterDataSyncJob.js
T

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,
};