影刀RPA 合同全生命周期管理:到期提醒与自动续约
作者:林焱 | 适用人群:影刀RPA新手 | 难度:★★★☆☆
一、什么情况用这个
公司签了一堆合同——供应商合同、客户合同、租赁合同、服务合同。每份合同有到期日、续约条款、付款节点。靠Excel管理?合同快到期了没人知道,供应商续约晚了导致服务中断,客户合同过期了还在提供服务。
用影刀RPA:定时扫描合同台账 → 到期前自动提醒 → 根据续约规则自动发续约通知 → 更新台账状态。合同管理从「被动应对」变成「主动预警」。
实际场景:采购合同续约管理、客户服务合同到期提醒、租赁合同退租预警、付款节点自动通知。
这篇文章能解决的问题:
- 合同到期分级提醒(30天/7天/1天)
- 自动发送续约通知邮件
- 合同付款节点自动提醒
- 合同归档文件自动整理
二、怎么做
2.1 台账设计
合同台账Excel:
| 合同编号 | 合同名称 | 签约方 | 类型 | 签署日期 | 到期日期 | 续约规则 | 付款周期 | 状态 | 归档路径 |
|---|---|---|---|---|---|---|---|---|---|
| CT-001 | IT运维服务 | 某科技公司 | 供应商 | 2023-06-01 | 2024-06-01 | 自动续约 | 年付 | 生效中 | D:\合同\CT-001.pdf |
2.2 影刀主流程
┌──────────────────────────────────────────────┐ │ ① 【读取Excel】 │ │ 读取合同台账 │ │ ↓ │ │ ② 【遍历列表】 │ │ 逐条检查合同状态 │ │ ↓ │ │ ③ 【条件判断】 │ │ 到期≤30天 → 高级提醒 │ │ 到期≤7天 → 紧急提醒 │ │ 到期≤1天 → 最后警告 │ │ 到期<0天 → 标记为过期 │ │ ↓ │ │ ④ 【发送企业微信消息 + 邮件】 │ │ 分级推送提醒 │ │ ↓ │ │ ⑤ 【写入Excel】 │ │ 更新台账状态 │ └──────────────────────────────────────────────┘2.3 核心代码
fromdatetimeimportdatetime,timedeltaimportjson# 从影刀Excel读取的数据contracts=contracts_data today=datetime.now().date()# 分级提醒配置ALERT_LEVELS=[{"days":30,"level":"提示","priority":"普通"},{"days":7,"level":"警告","priority":"重要"},{"days":1,"level":"紧急","priority":"紧急"},]alerts=[]# 提醒列表expired=[]# 已过期to_renew=[]# 待续约forcontractincontracts:end_date_str=contract.get("到期日期","")ifnotend_date_str:continuetry:end_date=datetime.strptime(end_date_str,"%Y-%m-%d").date()days_left=(end_date-today).days# 分级提醒ifdays_left==30ordays_left==7ordays_left==1:forlevelinALERT_LEVELS:ifdays_left==level["days"]:alerts.append({**contract,"days_left":days_left,"level":level["level"],"priority":level["priority"],})# 已过期ifdays_left<0:expired.append({**contract,"days_overdue":abs(days_left),})# 续约提醒(到期前60天)if0<days_left<=60andcontract.get("续约规则")!="自动续约":to_renew.append({**contract,"days_left":days_left,})exceptValueError:print(f"合同日期格式错误:{contract.get('合同编号')}")# 汇总result={"check_date":today.strftime("%Y-%m-%d"),"total":len(contracts),"alerts":alerts,"expired":expired,"to_renew":to_renew,}output=json.dumps(result,ensure_ascii=False)2.4 自动发送续约通知
defgenerate_renewal_notice(contract):"""生成续约通知"""template=f"""尊敬的{contract['签约方']}: 您好! 贵司与我司签订的「{contract['合同名称']}」(合同编号:{contract['合同编号']}) 将于{contract['到期日期']}到期,距今还有{contract['days_left']}天。 根据合同约定,续约规则为:{contract.get('续约规则','双方协商')}如需续约,请及时与我司联系: 联系人:张经理 电话:138-0000-0000 邮箱:zhang@company.com 此致 敬礼 """returntemplate# 在影刀中:【遍历列表】→ to_renew中的每条合同 【发送邮件】 收件人:{合同签约方邮箱}主题:合同续约通知-{合同名称}正文:{generate_renewal_notice(合同)}附件:{合同归档路径}2.5 付款节点提醒
如果合同有分期付款条款,自动提醒付款:
defcheck_payment_schedule(contract):"""检查付款节点"""# 假设在台账中有一个「付款节点」字段,格式:# "2024-03-01:30%,2024-06-01:30%,2024-09-01:40%"schedule_str=contract.get("付款节点","")ifnotschedule_str:return[]reminders=[]today=datetime.now().date()foriteminschedule_str.split(","):if":"initem:date_str,amount=item.split(":")try:pay_date=datetime.strptime(date_str.strip(),"%Y-%m-%d").date()days_left=(pay_date-today).days# 付款前7天提醒if0<days_left<=7:reminders.append({"contract_no":contract["合同编号"],"pay_date":date_str.strip(),"amount_ratio":amount.strip(),"days_left":days_left,})exceptValueError:passreturnreminders三、有什么坑
坑1:合同台账数据来源分散
合同可能来自采购部、法务部、业务部,各自维护一份Excel,信息不统一。
解决方案:先花时间整合一份主台账,然后用影刀定期从各部门的Excel中抓更新。影刀本身就可以做「多源数据聚合」这件事。
坑2:续约规则不标准化
有的合同是「自动续约」,有的是「提前30天通知续约」,有的是「到期终止」。如果台账里的续约规则是自由文本而非枚举值,程序很难判断。
建议标准化:续约规则字段用下拉列表:「自动续约」「需协商续约」「到期终止」「提前N天通知」。
坑3:合同文件归档路径变化
合同PDF文件的存放路径经常变化——文件被移动了、重命名了、删除了。
importosdefverify_contract_file(filepath):"""验证合同文件是否存在"""ifnotfilepath:returnFalseifnotos.path.exists(filepath):print(f"⚠️ 合同文件不存在:{filepath}")returnFalsereturnTrue# 每次扫描时验证forcontractincontracts:ifnotverify_contract_file(contract.get("归档路径")):# 标记为需要补档contract["状态"]="缺档"坑4:提醒频率过高
如果每份合同每天检查一次都发提醒,相关人员会很快免疫——「狼来了」效应。
控制频率:同一份合同在同一个提醒级别只提醒一次。用一个Excel记录已发送的提醒:
# 检查今天是否已经给这份合同发过30天提醒sent_alerts={}foralert_recordinsent_today:key=f"{alert_record['contract_no']}-{alert_record['days_left']}"sent_alerts[key]=Trueforalertinnew_alerts:key=f"{alert['合同编号']}-{alert['days_left']}"ifkeynotinsent_alerts:# 发送提醒send_alert(alert)# 记录已发送record_alert_sent(alert)坑5:跨年合同日期判断
跨年的合同,日期计算可能因为年份变化出错。Python的datetime模块天生支持跨年计算,不用担心。
# Python自动处理跨年date1=date(2024,12,25)date2=date(2025,1,5)diff=(date2-date1).days# = 11,正确总结:合同管理的核心是台账 + 定时巡检。台账准、规则标准化,影刀就能自动做到期提醒和续约通知。关键是要控制提醒频率,同一合同同一级别只提醒一次。