You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何追踪状态字段变更并按场景触发动作?求Deluge/Python脚本

状态变更追踪与场景化动作触发方案

核心思路

要实现需求,关键是捕获状态字段的「旧值」和「新值」,通过对比两者判断属于哪种变更场景,再执行对应动作。下面分别提供Deluge和Python的实现方案:


Deluge 实现(适用于Zoho系列产品)

在Zoho的模块(比如CRM、Creator)中,可通过记录的编辑触发脚本,直接获取状态字段的前后值:

脚本示例

// 获取状态字段的旧值与新值
old_status = input.currentsheet.Status.oldValue;
new_status = input.currentsheet.Status.value;

// 判断场景并执行对应动作
if(new_status == "Completed"){
    if(old_status == "In-Progress"){
        // 场景1:从In-Progress变Completed,执行动作A
        // 示例:发送通知、更新关联记录等
        sendmail
        [
            from: "your@domain.com",
            to: "team@domain.com",
            subject: "任务完成通知(In-Progress → Completed)",
            message: "任务已从进行中完成,请跟进后续流程"
        ];
    }
    else if(old_status == "Publish CADs"){
        // 场景2:从Publish CADs变Completed,执行动作B
        // 示例:触发CAD归档、同步到文档库等
        zoho.crm.updateRecord("Documents", document_id, {"Status": "Archived"});
    }
}

注意事项

  • 需在模块的「编辑后」触发事件中绑定该脚本
  • 确保字段名称(Status)与实际模块中的字段标识一致

Python 实现(通用场景)

假设基于数据库存储记录,需先保存状态的历史值,可通过两种方式实现:

方式1:新增「历史状态」字段

在数据表中添加previous_status字段,每次更新状态时先读取旧值,更新后再同步previous_status为新值。

代码示例(基于SQLAlchemy)

from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Task(Base):
    __tablename__ = 'tasks'
    id = Column(Integer, primary_key=True)
    status = Column(String(50))
    previous_status = Column(String(50))

# 初始化会话
engine = create_engine('sqlite:///tasks.db')
Session = sessionmaker(bind=engine)
session = Session()

def update_task_status(task_id, new_status):
    task = session.query(Task).filter_by(id=task_id).first()
    if not task:
        return
    
    old_status = task.status
    
    # 判断场景执行动作
    if new_status == "Completed":
        if old_status == "In-Progress":
            # 执行场景1动作:比如调用API、生成报告
            print(f"任务{task_id}从In-Progress完成,触发后续流程")
        elif old_status == "Publish CADs":
            # 执行场景2动作:比如归档CAD文件、通知设计部门
            print(f"任务{task_id}的CAD发布完成,已归档相关文件")
    
    # 更新状态与历史状态
    task.previous_status = old_status
    task.status = new_status
    session.commit()

# 调用示例
update_task_status(1, "Completed")

方式2:使用状态变更历史表

创建单独的status_history表记录每次状态变更,通过查询最新的历史记录获取旧值。

代码示例(简化版)

import sqlite3

def get_last_status(task_id):
    conn = sqlite3.connect('tasks.db')
    cursor = conn.cursor()
    cursor.execute("SELECT status FROM status_history WHERE task_id=? ORDER BY changed_at DESC LIMIT 1", (task_id,))
    result = cursor.fetchone()
    conn.close()
    return result[0] if result else None

def update_task_status(task_id, new_status):
    conn = sqlite3.connect('tasks.db')
    cursor = conn.cursor()
    
    old_status = get_last_status(task_id)
    # 如果是首次设置状态,old_status为None,跳过判断
    if old_status and new_status == "Completed":
        if old_status == "In-Progress":
            print(f"执行场景1动作:任务{task_id}完成")
        elif old_status == "Publish CADs":
            print(f"执行场景2动作:CAD发布完成")
    
    # 更新当前状态
    cursor.execute("UPDATE tasks SET status=? WHERE id=?", (new_status, task_id))
    # 记录变更历史
    cursor.execute("INSERT INTO status_history (task_id, status, changed_at) VALUES (?, ?, datetime('now'))", (task_id, new_status))
    
    conn.commit()
    conn.close()

内容的提问来源于stack exchange,提问作者Girish Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:41:15