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

发布时间:2026/7/4 2:50:24
影刀RPA新手教程:零售连锁自动化完全指南——门店数据汇总、库存预警与销售日报 影刀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[idstoreSelector] // 定位销售明细表格行 //table[classsales-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.50amountre.search(r[\d,]\.?\d*,text).group().replace(,,)# 从商品编码提取品类skuSKU24060001-FD-BLcategoryre.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_daysre.search(r(\d)天,text).group(1)# 32# 从门店编号提取区域store_codeNC001-SHregionre.search(r-(\w)$,store_code).group(1)# SH上海区域有个教训有些门店导出的数据金额列是文本格式¥ 15,680.50有些是数字格式15680.5。直接parse会报错统一处理流程先转字符串、去掉¥符号和逗号、再转数字。三、变量与数据类型# 数字——销售指标daily_sales15680.50total_orders235average_order_valuedaily_sales/total_orders# 66.72# 字符串store_codeNC001skuSKU24060001product_name男士休闲POLO衫 蓝色 L码# 列表——多门店数据store_sales[{门店:NC001,销售额:15680.50,客单数:235},{门店:NC002,销售额:20345.00,客单数:312}]# 字典——单品销售数据product_sales{SKU:SKU24060001,品名:男士休闲POLO衫,今日销量:15,当前库存:32,安全库存:20,可销天数:2,补货建议:紧急补货}# JSON——系统API对接respjson.loads(response.text)sale_recordsresp[result][records]四、流程控制# For循环——遍历所有门店stores[NC001,NC002,NC003]# 200门店forstoreinstores:# 切换到该门店的数据视图switch_store_view(store)# 提取销售数据salesextract_sales_data()# 汇总到总表all_sales.append({门店:store,数据:sales})# 相似元素循环——遍历商品销售明细rowsweb.find_all(tr.sales-row)forrowinrows:skurow.find(td.sku).text qtyint(row.find(td.qty).text)ifqty10:# 畅销品标记hot_items.append({SKU:sku,销量:qty})# While循环——翻页处理所有商品![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ee97635c077f478aa6b2d5ee83c5151b.png#pic_center)whileTrue:process_current_page()next_btnweb.find(li.page-next)ifdisabledinnext_btn.get_attribute(class,):breaknext_btn.click()time.sleep(2)# Try-Catch——防止个别门店数据异常中断forstoreinstores:try:dataextract_store_data(store)all_sales.append(data)exceptExceptionase:print(f门店{store}数据获取失败{e})failed_stores.append(store)continue五、网页自动化连锁零售ERP系统有两个常见问题数据量大加载慢、session超时退出。大数据量加载处理月度销售明细可能有上万行分页加载。不要试图一页拿全部数据逻辑分页采集page1whilepage200:# 安全上限# 处理当前页rowsweb.find_all(tr.data-row)forrowinrows:extract_row_data(row)# 翻页next_btnweb.find(a.next-page)ifdisabledinnext_btn.get_attribute(class,):breaknext_btn.click()page1time.sleep(1)# 给服务器喘息时间Session超时ERP系统通常20-30分钟无操作就自动退出。处理大批量数据时记得每15分钟做一次心跳操作——比如点击一下导航菜单、或者刷新当前页面。六、数据处理# Excel——汇总各门店日报importopenpyxlfromopenpyxl.stylesimportPatternFill wbopenpyxl.load_workbook(门店销售汇总模板.xlsx)wswb.active red_fillPatternFill(start_colorFFD7D7,end_colorFFD7D7,fill_typesolid)row_idx2forstore_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).fillred_fill row_idx1wb.save(门店销售日报_20240624.xlsx)# 数据库存储importpymysql connpymysql.connect(host192.168.1.200,userreport_user,passwordxxx,databaseretail_dw,charsetutf8mb4)cursorconn.cursor()sqlINSERT INTO daily_store_sales (store_code, sales_date, amount, order_count, avg_order_value) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE amountVALUES(amount)cursor.executemany(sql,batch_data)conn.commit()conn.close()七、鼠标键盘图像自动化门店POS系统如果是老式桌面软件用图像识别快捷键操作# 定位日结报表菜单image.click(日结报表菜单.png)# 等待报表窗口出现image.wait_appear(销售日报标题栏.png,timeout15)# 选择日期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)# CtrlStime.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}resprequests.get(https://erp.company.com/api/sales/daily,paramsparams,headersheaders)salesresp.json()[data]OCR——识别拍照的销售小票汇总textocr.recognize(销售小票照片.png)totalre.search(r合计[:]\s*¥?\s*([\d,]\.?\d*),text)Python自定义函数——库存预警计算fromdatetimeimportdatetime,timedeltadefcalculate_stock_warning(current_stock,daily_avg_sales,safety_stock,lead_time_days):计算库存预警等级sell_through_dayscurrent_stock/daily_avg_salesifdaily_avg_sales0else999ifcurrent_stock0:level断货elifcurrent_stocksafety_stock:level紧急补货elifsell_through_dayslead_time_days:level建议补货elifsell_through_days60:level库存积压else:level正常return{预警等级:level,可销天数:round(sell_through_days,1),建议补货量:max(0,round(daily_avg_sales*(lead_time_days7)-current_stock))}九、平台实战200门店日报自动汇总TEMU店群如何管理运营每天早上7点自动登录ERP系统按门店列表逐一查询昨日销售数据营业额、客单数、客单价、前十畅销SKU汇总到总部Excel模板。计算各门店环比增长率、完成率自动标红负增长门店。生成包含排名、趋势、预警的完整日报。库存预警自动通知每小时扫描一次全部门店库存数据对比安全库存线和近7日日均销量计算出可销天数。低于安全库存的SKU按门店归类推送飞书消息给对应的区域经理和店长。这两个流程让总部数据岗从每天的数据搬运工变成了真正的数据分析师——不用再花时间收集数据了专心做趋势分析和运营建议。十、系统联动# 飞书消息——库存预警通知webhookhttps://open.feishu.cn/open-apis/bot/v2/hook/xxxwarning_items\n.join([f{item[门店]}-{item[SKU]}-库存{item[库存]}件foriteminstock_warnings])msg{msg_type:text,content:{text:f【库存预警】以下商品库存低于安全线\n{warning_items}}}requests.post(webhook,jsonmsg)# 飞书多维表格——门店日报看板forstoreinall_sales:lark_base.append_rows(tblDailyReport,[{门店:store[门店],日期:date,销售额:store[销售额],客单价:store[客单价],同比:store[同比增长率]}])# 邮件——发送门店排名邮件给各区总send_email(toregionalcompany.com,subject昨日门店销售排名,bodyf排名前三{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教程 #零售连锁自动化 #库存预警 #销售日报作者林焱