影刀RPA新手教程:零售连锁自动化完全指南——门店数据汇总、库存预警与销售日报
2026/7/4 2:49:21 网站建设 项目流程

影刀RPA新手教程:零售连锁自动化完全指南——门店数据汇总、库存预警与销售日报

我以前在连锁零售企业的营运部做数据岗,公司在全国有200多家门店,每家店用自己那套POS系统。我每天的工作就是把各门店发来的Excel日报手动汇总到一张总表里,算出门店排名、品类的库存周转天数、畅销品缺货预警。最崩溃的是有的店长忘了发报表,第二天早上10点我还在一个个打电话催数据。

后来我下了决心,用影刀RPA搭了一套从门店数据采集到总部汇总分析的自动化流程体系。从采集到出报告,原来3个人每天4小时的工作量变成一个流程2小时自动完成。这篇文章就以连锁零售的数据运营为案例主线。

一、认识影刀与安装

影刀RPA社区版从官网下载安装。零售连锁的电脑环境多种多样——门店收银电脑可能是Win7老系统、采购的笔记本可能是Win11、总部的可能是云桌面。影刀对这些系统都支持,但需要注意:Win7系统需要先装.NET Framework 4.7.2以上版本。

我碰到过一个特别头疼的问题:某些门店的POS系统是B/S架构,但只支持IE浏览器打开(古老的ActiveX控件),Chrome打开不兼容。影刀默认绑Chrome,切换到IE模式后有些指令不兼容。最后的解决办法是:在门店电脑上用影刀的桌面自动化+图像识别操作IE窗口,虽然慢一点但够稳定。

二、元素定位四合一:XPath + CSS + 正则

零售ERP系统多半是B/S架构,典型的表格+表单结构:

// 定位门店选择下拉框 //select[@id='storeSelector'] // 定位销售明细表格行 //table[@class='sales-table']//tr[position()>1] // 定位销量列(通常是第5列) //tr/td[5] // 根据商品编码定位行 //td[contains(text(),'SKU24060001')]/parent::tr // 定位库存低于安全库存的行(库存列颜色标记) //td[contains(@class,'stock-warning')]/parent::tr // 定位导出按钮 //button[contains(@class,'export-btn')]
/* CSS方式 */#storeSelector table.sales-tabletr:not(:first-child)trtd:nth-child(5)td.stock-warning button.export-btn

选型建议:连锁零售系统多为传统ERP,页面结构变动不大,CSS选择器稳定性好。但如果需要做"根据某列数值判断"的逻辑(比如库存小于10的标红),只能用XPath的number()

正则处理零售数据:

importre# 从金额文本中提取数字text="销售金额:¥15,680.50"amount=re.search(r'[\d,]+\.?\d*',text).group().replace(",","")# 从商品编码提取品类sku="SKU24060001-FD-BL"category=re.search(r'-(.{2})-',sku).group(1)# FD(服饰大类)[video(video-UZMI9pHD-1783010260144)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]# 提取库存天数text="当前库存可销32天"stock_days=re.search(r'(\d+)天',text).group(1)# 32# 从门店编号提取区域store_code="NC001-SH"region=re.search(r'-(\w+)$',store_code).group(1)# SH(上海区域)

有个教训:有些门店导出的数据金额列是文本格式"¥ 15,680.50",有些是数字格式15680.5。直接parse会报错,统一处理流程:先转字符串、去掉¥符号和逗号、再转数字。

三、变量与数据类型

# 数字——销售指标daily_sales=15680.50total_orders=235average_order_value=daily_sales/total_orders# 66.72# 字符串store_code="NC001"sku="SKU24060001"product_name="男士休闲POLO衫 蓝色 L码"# 列表——多门店数据store_sales=[{"门店":"NC001","销售额":15680.50,"客单数":235},{"门店":"NC002","销售额":20345.00,"客单数":312}]# 字典——单品销售数据product_sales={"SKU":"SKU24060001","品名":"男士休闲POLO衫","今日销量":15,"当前库存":32,"安全库存":20,"可销天数":2,"补货建议":"紧急补货"}# JSON——系统API对接resp=json.loads(response.text)sale_records=resp["result"]["records"]

四、流程控制

# For循环——遍历所有门店stores=["NC001","NC002","NC003"]# 200+门店forstoreinstores:# 切换到该门店的数据视图switch_store_view(store)# 提取销售数据sales=extract_sales_data()# 汇总到总表all_sales.append({"门店":store,"数据":sales})# 相似元素循环——遍历商品销售明细rows=web.find_all("tr.sales-row")forrowinrows:sku=row.find("td.sku").text qty=int(row.find("td.qty").text)ifqty>10:# 畅销品标记hot_items.append({"SKU":sku,"销量":qty})# While循环——翻页处理所有商品![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ee97635c077f478aa6b2d5ee83c5151b.png#pic_center)whileTrue:process_current_page()next_btn=web.find("li.page-next")if"disabled"innext_btn.get_attribute("class",""):breaknext_btn.click()time.sleep(2)# Try-Catch——防止个别门店数据异常中断forstoreinstores:try:data=extract_store_data(store)all_sales.append(data)exceptExceptionase:print(f"门店{store}数据获取失败:{e}")failed_stores.append(store)continue

五、网页自动化

连锁零售ERP系统有两个常见问题:数据量大加载慢、session超时退出。

大数据量加载处理:

月度销售明细可能有上万行,分页加载。不要试图一页拿全部数据,逻辑分页采集:

page=1whilepage<=200:# 安全上限# 处理当前页rows=web.find_all("tr.data-row")forrowinrows:extract_row_data(row)# 翻页next_btn=web.find("a.next-page")if"disabled"innext_btn.get_attribute("class",""):breaknext_btn.click()page+=1time.sleep(1)# 给服务器喘息时间

Session超时:

ERP系统通常20-30分钟无操作就自动退出。处理大批量数据时记得每15分钟做一次"心跳"操作——比如点击一下导航菜单、或者刷新当前页面。

六、数据处理

# Excel——汇总各门店日报importopenpyxlfromopenpyxl.stylesimportPatternFill wb=openpyxl.load_workbook("门店销售汇总模板.xlsx")ws=wb.active red_fill=PatternFill(start_color="FFD7D7",end_color="FFD7D7",fill_type="solid")row_idx=2forstore_datainall_sales:ws.cell(row_idx,1,store_data["门店"])ws.cell(row_idx,2,store_data["销售额"])ws.cell(row_idx,3,store_data["客单数"])ws.cell(row_idx,4,store_data["客单价"])ws.cell(row_idx,5,store_data["环比增长率"])# 负增长标红ifstore_data.get("环比增长率",0)<0:forcolinrange(1,6):ws.cell(row_idx,col).fill=red_fill row_idx+=1wb.save("门店销售日报_20240624.xlsx")# 数据库存储importpymysql conn=pymysql.connect(host='192.168.1.200',user='report_user',password='xxx',database='retail_dw',charset='utf8mb4')cursor=conn.cursor()sql="""INSERT INTO daily_store_sales (store_code, sales_date, amount, order_count, avg_order_value) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE amount=VALUES(amount)"""cursor.executemany(sql,batch_data)conn.commit()conn.close()

七、鼠标键盘图像自动化

门店POS系统如果是老式桌面软件,用图像识别+快捷键操作:

# 定位"日结报表"菜单image.click("日结报表菜单.png")# 等待报表窗口出现image.wait_appear("销售日报标题栏.png",timeout=15)# 选择日期keyboard.send_keys("{TAB}")keyboard.send_keys("2024-06-24")keyboard.send_keys("{TAB}")# 点击查询image.click("查询按钮.png")# 等待数据加载time.sleep(5)# 点击导出image.click("导出Excel按钮.png")# 保存文件keyboard.send_keys("^s")# Ctrl+Stime.sleep(2)keyboard.send_keys("门店NC001日报_{date}.xlsx")keyboard.send_keys("{ENTER}")

八、进阶技能

HTTP请求对接ERP系统的查询接口:

importrequests headers={"token":"xxx","Content-Type":"application/json"}params={"storeCode":"NC001","date":"2024-06-24"}resp=requests.get("https://erp.company.com/api/sales/daily",params=params,headers=headers)sales=resp.json()["data"]

OCR——识别拍照的销售小票汇总:

text=ocr.recognize("销售小票照片.png")total=re.search(r'合计[::]\s*¥?\s*([\d,]+\.?\d*)',text)

Python自定义函数——库存预警计算:

fromdatetimeimportdatetime,timedeltadefcalculate_stock_warning(current_stock,daily_avg_sales,safety_stock,lead_time_days):"""计算库存预警等级"""sell_through_days=current_stock/daily_avg_salesifdaily_avg_sales>0else999ifcurrent_stock<=0:level="断货"elifcurrent_stock<=safety_stock:level="紧急补货"elifsell_through_days<=lead_time_days:level="建议补货"elifsell_through_days>=60:level="库存积压"else:level="正常"return{"预警等级":level,"可销天数":round(sell_through_days,1),"建议补货量":max(0,round(daily_avg_sales*(lead_time_days+7)-current_stock))}

九、平台实战

200+门店日报自动汇总:

TEMU店群如何管理运营?

每天早上7点自动登录ERP系统,按门店列表逐一查询昨日销售数据(营业额、客单数、客单价、前十畅销SKU),汇总到总部Excel模板。计算各门店环比增长率、完成率,自动标红负增长门店。生成包含排名、趋势、预警的完整日报。

库存预警自动通知:

每小时扫描一次全部门店库存数据,对比安全库存线和近7日日均销量,计算出"可销天数"。低于安全库存的SKU按门店归类,推送飞书消息给对应的区域经理和店长。

这两个流程让总部数据岗从每天的数据搬运工变成了真正的数据分析师——不用再花时间收集数据了,专心做趋势分析和运营建议。

十、系统联动

# 飞书消息——库存预警通知webhook="https://open.feishu.cn/open-apis/bot/v2/hook/xxx"warning_items="\n".join([f"{item['门店']}-{item['SKU']}-库存{item['库存']}件"foriteminstock_warnings])msg={"msg_type":"text","content":{"text":f"【库存预警】以下商品库存低于安全线:\n{warning_items}"}}requests.post(webhook,json=msg)# 飞书多维表格——门店日报看板forstoreinall_sales:lark_base.append_rows("tblDailyReport",[{"门店":store["门店"],"日期":date,"销售额":store["销售额"],"客单价":store["客单价"],"同比":store["同比增长率"]}])# 邮件——发送门店排名邮件给各区总send_email(to="regional@company.com",subject="昨日门店销售排名",body=f"排名前三:{top3_stores}\n排名后三:{bottom3_stores}",attachment="门店销售日报.xlsx")

十一、工程化规范

主流程_总部日报 ├── 子流程_登录ERP(已封装) ├── 子流程_单门店数据采集(参数:门店编码、日期) ├── 子流程_数据校验(参数:待校验数据) ├── 子流程_指标计算(参数:原始销售数据) ├── 子流程_排名生成(参数:门店列表) └── 子流程_预警分析(参数:库存数据)

命名规范:store_sales_list(列表)、STOCK_LEVEL_URGENT(常量)、avgOrderValue(驼峰)。

调试经验:汇总200+门店时最怕的就是中间某家店数据没拿到,整个汇总结果不准。在每个门店采集后立即记录日志(成功/失败+数据条数),汇总完成后先输出采集成功率再生成报告。

版本选择:单门店社区版足够;连锁总部用创业版配定时调度;大型连锁集团用企业版做多机器人分区采集+集中管控。

十二、速查表与常见报错

报错原因方案
门店数据为空该门店系统异常或未营业标记跳过,最后统一处理
ERP登录过期长时间无操作加心跳刷新
Excel打开失败文件被占用复制副本再读取
汇总公式报错数据类型不一致统一转换格式后再汇总
大数据量超时月数据几十万行分批采集+断点续传
门店系统不兼容不同版本POS分版本写采集逻辑

连锁零售的RPA价值不在替代某一个岗位,而在于打通"门店-区域-总部"的数据链路。以前要等48小时才能看到的数据,现在当天就能出报告。

从200家门店一天天催报表,到流程自动跑完直接看结果,这个转变不只是效率提升,是整个管理节奏的改变。总部能做实时决策,门店不用额外花时间填报表,双赢。零售连锁RPA更多落地方案在 home.linyan.cloud 持续更新。

#影刀RPA #RPA教程 #零售连锁自动化 #库存预警 #销售日报
作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询