如何追踪状态字段变更并按场景触发动作?求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
相关产品推荐
相关产品推荐

