feat(P19ERP1-1,P19ERP1-2): 新增ERP主数据同步模型与服务
这个提交包含在:
@@ -0,0 +1,91 @@
|
||||
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,
|
||||
};
|
||||
在新工单中引用
屏蔽一个用户