本文目录导读:

我来帮您编写一个库存数量监控脚本,这里提供几种常见场景的实现方案:
基于数据库的库存监控脚本
Python版本(使用MySQL)
import mysql.connector
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class InventoryMonitor:
def __init__(self, db_config, alert_config):
self.db_config = db_config
self.alert_config = alert_config
def check_inventory(self, product_id=None):
"""检查库存数量"""
try:
conn = mysql.connector.connect(**self.db_config)
cursor = conn.cursor(dictionary=True)
if product_id:
query = "SELECT * FROM products WHERE id = %s"
cursor.execute(query, (product_id,))
else:
query = "SELECT * FROM products WHERE quantity < min_threshold"
cursor.execute(query)
results = cursor.fetchall()
return results
except Exception as e:
logging.error(f"数据库查询错误: {e}")
return None
finally:
if 'conn' in locals():
conn.close()
def send_alert(self, product):
"""发送库存预警"""
if self.alert_config['type'] == 'email':
self._send_email_alert(product)
elif self.alert_config['type'] == 'webhook':
self._send_webhook_alert(product)
def _send_email_alert(self, product):
"""发送邮件预警"""
try:
msg = MIMEText(f"""
库存预警通知
商品ID: {product['id']}
商品名称: {product['name']}
当前库存: {product['quantity']}
最低库存: {product['min_threshold']}
时间: {datetime.now()}
""")
msg['Subject'] = f"库存预警 - {product['name']}"
msg['From'] = self.alert_config['email_from']
msg['To'] = self.alert_config['email_to']
with smtplib.SMTP(self.alert_config['smtp_server'],
self.alert_config['smtp_port']) as server:
server.starttls()
server.login(self.alert_config['email_user'],
self.alert_config['email_password'])
server.send_message(msg)
logging.info(f"预警邮件已发送: {product['name']}")
except Exception as e:
logging.error(f"发送邮件失败: {e}")
def monitor_products(self, interval=3600):
"""定期监控库存"""
import schedule
import time
def job():
logging.info("开始库存检查...")
low_stock_products = self.check_inventory()
if low_stock_products:
for product in low_stock_products:
self.send_alert(product)
logging.warning(f"低库存预警: {product['name']} - {product['quantity']}")
else:
logging.info("所有商品库存正常")
# 定时执行
schedule.every(interval).seconds.do(job)
logging.info(f"库存监控已启动,每{interval}秒检查一次")
while True:
schedule.run_pending()
time.sleep(1)
# 使用示例
if __name__ == "__main__":
# 数据库配置
db_config = {
'host': 'localhost',
'user': 'your_user',
'password': 'your_password',
'database': 'inventory_db'
}
# 预警配置
alert_config = {
'type': 'email',
'email_from': 'monitor@example.com',
'email_to': 'admin@example.com',
'smtp_server': 'smtp.gmail.com',
'smtp_port': 587,
'email_user': 'your_email@gmail.com',
'email_password': 'your_app_password'
}
# 创建监控实例
monitor = InventoryMonitor(db_config, alert_config)
# 单次检查
results = monitor.check_inventory(101)
if results:
for product in results:
print(f"商品: {product['name']}, 库存: {product['quantity']}")
# 持续监控
monitor.monitor_products(interval=3600) # 每小时检查一次
基于Excel文件的库存监控
import pandas as pd
from datetime import datetime
import os
class ExcelInventoryMonitor:
def __init__(self, file_path):
self.file_path = file_path
self.last_modified = None
def load_inventory(self):
"""加载库存数据"""
try:
if not os.path.exists(self.file_path):
logging.error(f"文件不存在: {self.file_path}")
return None
df = pd.read_excel(self.file_path)
return df
except Exception as e:
logging.error(f"读取Excel失败: {e}")
return None
def check_thresholds(self, df):
"""检查库存阈值"""
alerts = []
for index, row in df.iterrows():
if row['quantity'] <= row['min_threshold']:
alerts.append({
'product': row['product_name'],
'sku': row['sku'],
'current': row['quantity'],
'threshold': row['min_threshold'],
'time': datetime.now()
})
return alerts
def generate_report(self, alerts):
"""生成库存报告"""
report = f"""
库存监控报告
时间: {datetime.now()}
文件: {self.file_path}
低库存商品:
"""
if alerts:
for alert in alerts:
report += f"""
商品: {alert['product']}
SKU: {alert['sku']}
当前库存: {alert['current']}
最低库存: {alert['threshold']}
"""
else:
report += "\n暂无低库存商品"
return report
def monitor_file_changes(self, check_interval=300):
"""监控文件变化"""
import time
while True:
try:
current_mtime = os.path.getmtime(self.file_path)
if self.last_modified is None:
self.last_modified = current_mtime
elif current_mtime != self.last_modified:
logging.info("检测到文件变化,重新检查库存...")
df = self.load_inventory()
if df is not None:
alerts = self.check_thresholds(df)
if alerts:
report = self.generate_report(alerts)
print(report)
# 可以添加发送通知的代码
self.last_modified = current_mtime
time.sleep(check_interval)
except KeyboardInterrupt:
logging.info("监控已停止")
break
except Exception as e:
logging.error(f"监控出错: {e}")
time.sleep(check_interval)
# 使用示例
monitor = ExcelInventoryMonitor("inventory.xlsx")
monitor.monitor_file_changes(300) # 每5分钟检查一次
基于API的库存监控
import requests
import json
from datetime import datetime
import hashlib
class APIInventoryMonitor:
def __init__(self, api_config):
self.base_url = api_config['base_url']
self.api_key = api_config['api_key']
self.api_secret = api_config['api_secret']
def get_inventory(self, product_id=None):
"""从API获取库存数据"""
headers = {
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
try:
if product_id:
url = f"{self.base_url}/products/{product_id}"
else:
url = f"{self.base_url}/products/inventory"
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
logging.error(f"API请求失败: {e}")
return None
def update_inventory(self, product_id, quantity_change):
"""更新库存"""
headers = {
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
payload = {
'product_id': product_id,
'quantity_change': quantity_change,
'reason': '库存调整',
'timestamp': datetime.now().isoformat()
}
try:
url = f"{self.base_url}/products/{product_id}/inventory"
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
logging.error(f"库存更新失败: {e}")
return None
def check_low_stock(self, threshold=10):
"""检查低库存商品"""
inventory = self.get_inventory()
if not inventory:
return []
low_stock_items = []
for item in inventory:
if item['quantity'] <= threshold:
low_stock_items.append(item)
return low_stock_items
# 使用示例
api_config = {
'base_url': 'https://api.example.com/v1',
'api_key': 'your_api_key',
'api_secret': 'your_api_secret'
}
monitor = APIInventoryMonitor(api_config)
low_stock = monitor.check_low_stock(threshold=5)
print(f"低库存商品数: {len(low_stock)}")
Docker容器化部署
# Dockerfile FROM python:3.9-slim WORKDIR /app # 安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制脚本 COPY inventory_monitor.py . # 设置定时任务(可选) RUN apt-get update && apt-get install -y cron COPY crontab /etc/cron.d/inventory-monitor RUN chmod 0644 /etc/cron.d/inventory-monitor # 运行监控脚本 CMD ["python", "inventory_monitor.py"]
# docker-compose.yml
version: '3.8'
services:
inventory-monitor:
build: .
environment:
- DB_HOST=mysql
- DB_USER=root
- DB_PASSWORD=rootpassword
- DB_NAME=inventory
volumes:
- ./logs:/app/logs
restart: unless-stopped
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=inventory
volumes:
- ./mysql-data:/var/lib/mysql
监控脚本的高级功能
class AdvancedInventoryMonitor:
def __init__(self):
self.alert_channels = [] # 多渠道通知
self.history_buffer = [] # 历史记录
self.prediction_model = None # 预测模型
def add_alert_channel(self, channel_type, config):
"""添加通知渠道"""
channels = {
'email': EmailAlert,
'slack': SlackAlert,
'sms': SMSAlert,
'wechat': WeChatAlert
}
if channel_type in channels:
alert_obj = channels[channel_type](config)
self.alert_channels.append(alert_obj)
def predict_stockout(self, product_id, days=7):
"""预测缺货时间"""
# 使用历史数据预测
history = self.get_product_history(product_id)
if not history:
return None
# 简单移动平均预测
consumption_rates = []
for i in range(1, len(history)):
rate = history[i]['consumption'] / history[i]['days']
consumption_rates.append(rate)
avg_daily_consumption = sum(consumption_rates) / len(consumption_rates)
current_stock = history[-1]['quantity']
days_until_stockout = current_stock / avg_daily_consumption
return {
'product_id': product_id,
'current_stock': current_stock,
'daily_consumption': avg_daily_consumption,
'days_until_stockout': days_until_stockout,
'stockout_date': datetime.now() + timedelta(days=days_until_stockout)
}
def auto_reorder(self, product_id, quantity):
"""自动补货"""
# 连接到供应商API
# 生成采购订单
order = {
'product_id': product_id,
'quantity': quantity,
'supplier': self.get_preferred_supplier(product_id),
'order_date': datetime.now(),
'expected_delivery': datetime.now() + timedelta(days=3)
}
# 发送订单
if self.place_order(order):
logging.info(f"已自动补货: 商品{product_id},数量{quantity}")
return order
return None
# 使用示例
monitor = AdvancedInventoryMonitor()
monitor.add_alert_channel('email', {
'recipient': 'admin@example.com'
})
monitor.add_alert_channel('slack', {
'webhook_url': 'https://hooks.slack.com/services/xxx'
})
# 预测缺货
prediction = monitor.predict_stockout(101)
if prediction and prediction['days_until_stockout'] < 3:
monitor.auto_reorder(101, 100)
使用建议
-
安装依赖:
pip install pandas pymongo mysql-connector-python schedule requests
-
配置文件(config.json):
{ "database": { "type": "mysql", "host": "localhost", "port": 3306, "database": "inventory" }, "monitoring": { "check_interval": 3600, "low_stock_threshold": 10, "alert_channels": ["email", "slack"] }, "alerts": { "email": { "enabled": true, "recipients": ["admin@example.com"] } } } -
运行方式:
# 直接运行 python inventory_monitor.py
Docker运行
docker-compose up -d
设置定时任务(Linux)
crontab -e
添加:0 /2 /usr/bin/python3 /path/to/inventory_monitor.py
这个脚本可以根据您的具体需求进行定制,支持多种数据源、通知方式和部署方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播