1. 为什么选择从零搭建简易ERP系统
作为一名在制造业信息化领域摸爬滚打多年的从业者,我见过太多企业被复杂的ERP系统折磨得苦不堪言。去年帮朋友的小型加工厂实施某知名ERP时,光是基础数据准备就花了三周,最终上线后操作人员依然频频出错。这让我意识到:对于小微企业或学生作业场景,与其研究SAP、用友这些"航空母舰",不如掌握快速搭建轻量级ERP的核心方法。
用Python+Django+SQLite这套技术栈,我最近帮五家小微企业实现了进销存管理数字化,平均开发时间控制在8小时以内。这种"够用就好"的解决方案特别适合:
- 需要快速完成ERP课程作业的学生
- 初创团队验证业务流程
- 传统企业数字化转型的过渡方案
重要提示:真正的企业级ERP涉及财务合规、多仓库协同等复杂需求,本文方案仅适用于教学演示或小微场景,切勿直接用于生产环境。
2. 开发环境准备与项目初始化
2.1 工具选型背后的思考
选择Django而非Flask的原因很实际:
- 自带Admin后台(省去50%基础CRUD开发量)
- ORM支持多数据库切换(SQLite开发→MySQL上线无缝迁移)
- 完善的用户权限体系(不用从零实现RBAC)
安装只需两条命令:
bash复制pip install django==4.2.6
django-admin startproject mini_erp
2.2 数据库设计的实用技巧
小微企业ERP最核心的三张表:
- 产品表(Product)
- 客户表(Customer)
- 订单表(Order)
在models.py中这样定义(去掉了非必要字段):
python复制from django.db import models
class Product(models.Model):
sku = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=100)
stock = models.IntegerField(default=0)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Customer(models.Model):
name = models.CharField(max_length=100)
contact = models.CharField(max_length=50)
credit_limit = models.DecimalField(max_digits=10, decimal_places=2)
class Order(models.Model):
ORDER_STATUS = [
('draft', '草稿'),
('confirmed', '已确认'),
('delivered', '已发货'),
]
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
order_date = models.DateField(auto_now_add=True)
status = models.CharField(max_length=20, choices=ORDER_STATUS, default='draft')
避坑指南:不要一开始就设计复杂的库存流水表,先用Product.stock字段实现简单加减,业务跑通后再考虑细化。
3. 快速实现核心业务逻辑
3.1 订单创建的防呆设计
在views.py中处理订单提交时,必须包含库存检查:
python复制from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
def create_order(request):
if request.method == 'POST':
product_id = request.POST.get('product_id')
quantity = int(request.POST.get('quantity'))
product = get_object_or_404(Product, pk=product_id)
if product.stock < quantity:
return JsonResponse({'success': False, 'message': '库存不足'})
# 实际项目这里要加事务处理
product.stock -= quantity
product.save()
Order.objects.create(
product=product,
quantity=quantity,
customer=request.user.customer_profile
)
return JsonResponse({'success': True})
3.2 利用Admin后台加速开发
在admin.py中简单配置就能获得功能完备的后台:
python复制from django.contrib import admin
from .models import Product, Customer, Order
class ProductAdmin(admin.ModelAdmin):
list_display = ('sku', 'name', 'stock', 'price')
search_fields = ('sku', 'name')
admin.site.register(Product, ProductAdmin)
admin.site.register(Customer)
admin.site.register(Order)
启动服务后访问/admin即可看到:
bash复制python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
4. 必须实现的三个增强功能
4.1 基础报表生成
安装reportlab库实现PDF导出:
bash复制pip install reportlab
在views.py中添加:
python复制from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse
def inventory_report(request):
buffer = BytesIO()
p = canvas.Canvas(buffer)
products = Product.objects.all()
y = 800
for product in products:
p.drawString(100, y, f"{product.name}: {product.stock}件")
y -= 20
p.showPage()
p.save()
buffer.seek(0)
return HttpResponse(buffer, content_type='application/pdf')
4.2 简易权限控制
在settings.py中添加:
python复制AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
]
LOGIN_URL = '/accounts/login/'
然后修饰需要登录的视图:
python复制from django.contrib.auth.decorators import login_required
@login_required
def create_order(request):
# 原有代码
4.3 数据可视化看板
使用Chart.js快速实现:
html复制<!-- 在模板中引入 -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<canvas id="inventoryChart" width="400" height="200"></canvas>
<script>
fetch('/api/inventory-data/')
.then(response => response.json())
.then(data => {
new Chart(
document.getElementById('inventoryChart'),
{
type: 'bar',
data: {
labels: data.products,
datasets: [{
label: '当前库存',
data: data.stocks
}]
}
}
);
});
</script>
5. 从作业到真实场景的升级路径
当这个简易系统需要投入实际使用时,建议按以下优先级逐步增强:
- 数据完整性:添加操作日志(谁在什么时候修改了什么)
- 业务流程:实现采购入库→销售出库的完整链路
- 财务对接:增加与记账软件的API对接
- 移动支持:开发微信小程序端
我曾用这个方法论帮助一家年营收300万的五金店实现数字化,关键是把80%的精力放在他们最痛的库存管理环节,其他功能后续逐步迭代。三个月后,他们的库存周转率提升了40%,这就是"最小可行ERP"的价值。
