diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts index f87c99b3d1..20599abb08 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts @@ -12,7 +12,7 @@ import parser from 'cron-parser'; import type Plugin from '../../Plugin'; import type { WorkflowModel } from '../../types'; import { parseDateWithoutMs, SCHEDULE_MODE } from './utils'; -import { parseCollectionName } from '@nocobase/data-source-manager'; +import { parseCollectionName, SequelizeCollectionManager } from '@nocobase/data-source-manager'; export type ScheduleOnField = { field: string; @@ -68,10 +68,10 @@ function getDataOptionTime(record, on, dir = 1) { const DialectTimestampFnMap: { [key: string]: (col: string) => string } = { postgres(col) { - return `CAST(FLOOR(extract(epoch from "${col}")) AS INTEGER)`; + return `CAST(FLOOR(extract(epoch from ${col})) AS INTEGER)`; }, mysql(col) { - return `CAST(FLOOR(UNIX_TIMESTAMP(\`${col}\`)) AS SIGNED INTEGER)`; + return `CAST(FLOOR(UNIX_TIMESTAMP(${col})) AS SIGNED INTEGER)`; }, sqlite(col) { return `CAST(FLOOR(unixepoch(${col})) AS INTEGER)`; @@ -160,7 +160,7 @@ export default class ScheduleTrigger { { config: { collection, limit, startsOn, repeat, endsOn }, allExecuted }: WorkflowModel, currentDate: Date, ) { - const { db } = this.workflow.app; + const { dataSourceManager } = this.workflow.app; if (limit && allExecuted >= limit) { return []; } @@ -174,6 +174,14 @@ export default class ScheduleTrigger { return []; } + const [dataSourceName, collectionName] = parseCollectionName(collection); + const { collectionManager } = dataSourceManager.get(dataSourceName); + if (!(collectionManager instanceof SequelizeCollectionManager)) { + return []; + } + const { db } = collectionManager; + const { model } = collectionManager.getCollection(collectionName); + const range = this.cacheCycle * 2; const conditions: any[] = [ @@ -191,9 +199,12 @@ export default class ScheduleTrigger { if (typeof repeat === 'number') { const tsFn = DialectTimestampFnMap[db.options.dialect]; if (repeat > range && tsFn) { + const { field } = model.getAttributes()[startsOn.field]; const modExp = fn( 'MOD', - literal(`${Math.round(timestamp / 1000)} - ${tsFn(startsOn.field)}`), + literal( + `${Math.round(timestamp / 1000)} - ${db.sequelize.getQueryInterface().quoteIdentifiers(tsFn(field))}`, + ), Math.round(repeat / 1000), ); conditions.push(where(modExp, { [Op.lt]: Math.round(range / 1000) })); @@ -230,7 +241,6 @@ export default class ScheduleTrigger { }); } - const { model } = db.getCollection(collection); return model.findAll({ where: { [Op.and]: conditions,