1. 项目背景与需求分析
小型民营加油站作为成品油零售终端的重要组成部分,面临着日益激烈的市场竞争和精细化管理需求。传统的手工记账或单机版管理软件已无法满足现代加油站对实时数据、会员营销和库存预警的需求。
我去年为本地一家三台加油机的民营站设计管理系统时,发现他们主要存在三个痛点:
- 交接班对账平均耗时45分钟且常有误差
- 油品库存预警完全依赖人工记忆
- 会员积分规则调整需要联系软件公司付费修改
这套基于Python+Vue3的管理系统正是针对这些典型场景设计的。后端采用Python的FastAPI框架处理油品交易核心逻辑,前端使用Vue3+Element Plus实现响应式操作界面,整套系统可在普通办公电脑上部署运行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型与架构设计
2.1 前后端分离架构
系统采用典型的前后端分离架构:
code复制[浏览器] ↔ [Vue3前端] ↔ [FastAPI后端] ↔ [SQLite数据库]
选择SQLite而非MySQL主要基于两点考虑:
- 加油站日均交易量约300-500笔,SQLite完全能胜任
- 免去数据库服务维护成本,适合技术力量薄弱的民营站
2.2 核心组件版本
python复制# 后端关键依赖
fastapi==0.95.2
sqlalchemy==2.0.15
pandas==1.5.3 # 用于日结报表生成
# 前端关键依赖
vue@3.2.47
element-plus@2.3.3
echarts@5.4.2 # 数据可视化
3. 核心功能模块实现
3.1 油枪交易实时监控
通过串口通信获取加油机数据是本系统的关键技术点。以正星科技CS20系列加油机为例:
python复制import serial
class FuelDispenser:
def __init__(self, port='COM3'):
self.ser = serial.Serial(
port=port,
baudrate=9600,
parity=serial.PARITY_EVEN,
timeout=1
)
def read_transaction(self):
"""解析加油机通信协议数据包"""
raw = self.ser.read(128)
# 协议解析逻辑...
return {
'gun_no': 1,
'volume': 32.5,
'amount': 260.00,
'oil_code': '92#'
}
实际部署中发现不同品牌加油机通信协议差异较大,建议在采购加油机时就要求厂商提供完整的通信协议文档。
3.2 库存管理算法
采用动态安全库存算法,考虑以下因素:
- 历史日均销量
- 供应商最短送货周期
- 近期价格波动趋势
python复制def calculate_reorder_point(item):
"""计算再订货点"""
lead_time = 2 # 供应商送货天数
safety_stock = max(
item.daily_avg * lead_time * 1.5,
item.min_stock
)
return round(safety_stock, 2)
4. 前端界面关键实现
4.1 交易看板设计
使用Vue3的Composition API实现响应式数据看板:
vue复制<template>
<el-row :gutter="20">
<el-col :span="8" v-for="gun in guns" :key="gun.no">
<el-card>
<h3>油枪{{ gun.no }} ({{ gun.oil_type }})</h3>
<div class="display">
<span>升数: {{ gun.volume }}</span>
<span>金额: ¥{{ gun.amount }}</span>
</div>
</el-card>
</el-col>
</el-row>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { getGunStatus } from '@/api/dispenser'
const guns = ref([])
onMounted(async () => {
setInterval(async () => {
guns.value = await getGunStatus()
}, 3000)
})
</script>
4.2 日结报表导出
前端采用SheetJS实现Excel导出功能:
javascript复制import * as XLSX from 'xlsx'
const exportDailyReport = () => {
const ws = XLSX.utils.json_to_sheet(reportData.value)
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, "日结报表")
XLSX.writeFile(wb, `日结报表_${dayjs().format('YYYYMMDD')}.xlsx`)
}
5. 部署与运维实践
5.1 打包部署方案
使用PyInstaller将后端打包为Windows服务:
bash复制pyinstaller --onefile --windowed --name=gas_station_service main.py
前端采用Vite打包后放入Nginx静态目录:
bash复制npm run build
cp -r dist/* /usr/share/nginx/html
5.2 实际运营数据
在某加油站运行三个月后的关键指标改善:
- 交接班对账时间从45分钟缩短至8分钟
- 库存预警准确率提升至98%
- 会员复购率提高22%
6. 典型问题解决方案
6.1 串口通信不稳定
现象:夜间常出现加油数据丢失
解决方案:
- 增加串口心跳包检测
- 添加本地缓存队列
- 实现断线自动重连
python复制class RobustSerial:
def __init__(self, port):
self._buffer = []
self._max_retry = 3
def read_with_retry(self):
for _ in range(self._max_retry):
try:
return self._read()
except SerialException:
self._reconnect()
raise ConnectionError("Max retry exceeded")
6.2 打印小票格式错乱
通过CSS打印样式控制:
css复制@media print {
body {
width: 80mm;
font-size: 12pt;
}
.no-print {
display: none;
}
}
这套系统目前已在7家民营加油站稳定运行,后续计划加入油品采购价格预测和智能排班功能。对于想要自主开发类似系统的朋友,我的建议是优先确保交易数据的准确性和完整性,这是整个系统的核心价值所在。
