* 描述问题
工作流-定时任务-触发模式(根据数据表时间字段),开启了重复模式,测试过按天和按周,则工作流不会触发。关闭重复模式就可以触发。
* 运行环境
-
NocoBase 版本:v1.3.31-beta
-
数据库种类与版本: PostgreSQL15
-
操作系统: mac
-浏览器及版本:最新的chrome -
部署方式:
-
Docker 镜像版本:v1.3.31-beta
-
NodeJS 版本:
如何重现
预期行为
可以清空选项
工作流-定时任务-触发模式(根据数据表时间字段),开启了重复模式,测试过按天和按周,则工作流不会触发。关闭重复模式就可以触发。
NocoBase 版本:v1.3.31-beta
数据库种类与版本: PostgreSQL15
操作系统: mac
-浏览器及版本:最新的chrome
部署方式:
Docker 镜像版本:v1.3.31-beta
NodeJS 版本:
可以清空选项
解决了吗?
之前有一个相关的修复,当基于数据表日期字段模式,按该日期重复模式的未来时间应该触发,但是重启服务后不重复触发的情况:
可以更新到最新版再看下。
还是不行。
拿我这个定时任务为例。 基于日期的定时任务报错
触发时间在[endDate-60,endDate]范围内,都应该触发后续步骤,并且之后按周重复。(endDate是2025-03-10,并且手动执行是可以的)
结果没有触发后续步骤,日志如下:
e[34m2025-02-24 14:33:16 [debug] [Schedule on date field] conditions: e[39m conditions=[{"endDate":{}},{"attribute":{"fn":"MOD","args":[{"val":"1740378796 - CAST(FLOOR(UNIX_TIMESTAMP(`endDate`)) AS SIGNED INTEGER)"},604800]},"comparator":"=","logic":{}},{"endDate":{}}]
e[32m2025-02-24 14:33:16 [info] [Schedule on date field] 0 records to schedulee[39m
好的,我这边继续测一下。
你好,有进展吗?
你好,你使用的nocobase版本是什么?Published at 的类型是什么?
测过按天和按周吗?
使用的是“日期时间(含时区)”类型。按天和按周的我这边也测一下,不过结果可能会等的比较久。
启动系统或启动工作流时,虽然时间在设定时间内,但是不会触发,必须等到下个周期。
所以我推测,按天或周时,表现的不明显或者被重启阻断了。
但手动执行是可以立刻触发的。
那启动工作流时,若在时间范围内,是不是应该要立刻触发而不是等到下个周期?
这里面的确有一个逻辑,如果选了按某个固定周期触发(如按天),那么这个天实际上是 24 小时的概念,离初始数据时间字段的值为 n 个 24 小时的周期。比如设定的是按 1 天,数据字段的值是昨天 12:00,那么今天早上 9 点启动服务,也不会马上触发,而是等到今天 12:00,才会触发。而启动后立即触发反而不符合预期,因为偏离了预期触发的时间点。
至于按天没触发的问题,我这边继续测一下,看看是否的确有 bug。
我测了,和你说的逻辑是相符的。
为了避免没撞上周期边界(时间字段值按周期规则形成的时间点,默认是某天的零点)而没触发,是不是用高级重复模式,显示指定每天或每周的固定时间点触发,结果就明显了?
另外,时间类型好像只支持“日期时间(含时区)”,如果不含时区的不支持,是不是应该在配置工作流的界面给个提示?
高级模式实际上是按 cron 的静态规则,不是基于字段的相对时间,这两种情况是有差异的。
不含时区的需要看下有没有配置服务端的 TZ 环境变量。
基于数据表时间字段的定时任务触发器,没有数据表事件触发器那样的“满足以下条件才触发
”(比如不想包含过期记录),所以只能在条件判断里实现“字段过滤”。
如果表记录很多,是不是会运行很多任务,照成资源浪费?
目前暂时是这样,主要依赖时间条件。后面我们考虑下这块优化。
目前来看似乎还是没有解决该问题,我设定的时到期前5天进行通知,重复模式是每隔一天提醒一次。但是目前打印到的sql是这样的
SELECT * FROM
sys_vc_management
AS sys_vc_management
WHERE
( sys_vc_management
.due_date
< ‘2025-03-25 09:30:23’
AND MOD ( 1742865924 - CAST(FLOOR(UNIX_TIMESTAMP(due_date
)) AS SIGNED INTEGER), 86400 ) < 600
AND sys_vc_management
.due_date
>= ‘2025-03-25 09:20:23’ );
并没有到期前的相关信息