forked from erp-dev/erp
init
This commit is contained in:
285
basic_info/models.py
Normal file
285
basic_info/models.py
Normal file
@@ -0,0 +1,285 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from django.db import models
|
||||
from flower.common import ModelBase
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
METER_TO_YARD_RATE = 0.9144
|
||||
YARD_TO_METER_RATE = 1.09361
|
||||
|
||||
|
||||
class VehicleType(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=50, verbose_name='车辆类型名称')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '车辆类型'
|
||||
verbose_name_plural = '车辆类型'
|
||||
|
||||
|
||||
class WareHouse(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='仓库名称')
|
||||
location = models.CharField(max_length=200, blank=True, null=True, verbose_name='仓库地址')
|
||||
contact = models.CharField(max_length=100, blank=True, null=True, verbose_name='联系人')
|
||||
mobile = models.CharField(max_length=20, blank=True, null=True, verbose_name='手机')
|
||||
area = models.CharField(max_length=100, blank=True, null=True, verbose_name='地区')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '仓库资料'
|
||||
verbose_name_plural = '仓库资料'
|
||||
|
||||
|
||||
class ProductUnitEnum(models.IntegerChoices):
|
||||
METER = 1, '米'
|
||||
YARD = 2, '码'
|
||||
KG = 3, '公斤'
|
||||
|
||||
|
||||
class Supplier(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='供应商名称')
|
||||
area = models.CharField(max_length=100, blank=True, null=True, verbose_name='地区')
|
||||
email = models.EmailField(blank=True, null=True, verbose_name='电子邮箱')
|
||||
mobile = models.CharField(max_length=20, blank=True, null=True, verbose_name='手机')
|
||||
contact = models.TextField(blank=True, null=True, verbose_name='联系人')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '供应商'
|
||||
verbose_name_plural = '供应商'
|
||||
|
||||
|
||||
class BankAccount(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='名称')
|
||||
auto_number = models.CharField(max_length=50, verbose_name='自动编号')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
attachment = models.FileField(upload_to='bank_accounts/', blank=True, null=True, verbose_name='附件')
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.name} - {self.auto_number}'
|
||||
|
||||
class Meta:
|
||||
verbose_name = '银行账户'
|
||||
verbose_name_plural = '银行账户'
|
||||
|
||||
|
||||
class ProductCategory(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='类别名称')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='类别描述')
|
||||
product_prefix = models.CharField(max_length=5, verbose_name='产品编号前缀')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '产品类别'
|
||||
verbose_name_plural = '产品类别'
|
||||
|
||||
|
||||
class Product(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
category = models.ForeignKey(
|
||||
ProductCategory,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='products',
|
||||
verbose_name='产品类别',
|
||||
)
|
||||
name = models.CharField(max_length=100, verbose_name='产品名')
|
||||
human_id = models.CharField(max_length=100, verbose_name='产品编号', blank=True)
|
||||
color = models.CharField(max_length=50, blank=True, null=True, verbose_name='颜色')
|
||||
width_size = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True, verbose_name='宽幅')
|
||||
single_price_in = models.DecimalField(
|
||||
max_digits=10,
|
||||
decimal_places=2,
|
||||
verbose_name='参考进价',
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
single_price_out = models.DecimalField(
|
||||
max_digits=10,
|
||||
decimal_places=2,
|
||||
verbose_name='参考售价',
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
spec = models.CharField(max_length=100, blank=True, null=True, verbose_name='规格')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
transform_rate = models.DecimalField(
|
||||
max_digits=10,
|
||||
decimal_places=4,
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name='公斤转换率',
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def save(
|
||||
self,
|
||||
*args,
|
||||
force_insert=False,
|
||||
force_update=False,
|
||||
using=None,
|
||||
update_fields=None,
|
||||
):
|
||||
super().save(
|
||||
*args,
|
||||
force_insert=force_insert,
|
||||
force_update=force_update,
|
||||
using=using,
|
||||
update_fields=update_fields,
|
||||
)
|
||||
# Generate human_id if not set after saving to get the ID
|
||||
if not self.human_id and self.category:
|
||||
self.human_id = f'{self.category.product_prefix}{self.id:05d}'
|
||||
super().save(
|
||||
*args,
|
||||
force_insert=False,
|
||||
force_update=False,
|
||||
using=using,
|
||||
update_fields=['human_id'],
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '产品资料'
|
||||
verbose_name_plural = '产品资料'
|
||||
|
||||
|
||||
class Customer(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='客户名称')
|
||||
mobile = models.CharField(max_length=20, verbose_name='手机')
|
||||
area = models.CharField(max_length=100, blank=True, null=True, verbose_name='地区')
|
||||
email = models.EmailField(blank=True, null=True, verbose_name='电子邮箱')
|
||||
contact = models.CharField(blank=True, null=True, verbose_name='联系人')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '客户资料'
|
||||
verbose_name_plural = '客户资料'
|
||||
|
||||
|
||||
class EmployeeTypeEnum(models.TextChoices):
|
||||
PRINTER = '打纸', '打纸'
|
||||
ROLLING = '滚筒', '滚筒'
|
||||
WARE = '仓库', '仓库'
|
||||
DELIVERY = '送货', '送货'
|
||||
|
||||
|
||||
class EmployeeStatusEnum(models.TextChoices):
|
||||
ACTIVE = '在职', '在职'
|
||||
INACTIVE = '离职', '离职'
|
||||
|
||||
|
||||
class Employee(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
sys_user = models.OneToOneField(
|
||||
User,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='employee',
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name='系统用户',
|
||||
)
|
||||
name = models.CharField(max_length=100, verbose_name='员工姓名')
|
||||
job_type = models.CharField(
|
||||
max_length=20,
|
||||
choices=EmployeeTypeEnum.choices,
|
||||
default=EmployeeTypeEnum.PRINTER,
|
||||
verbose_name='职位',
|
||||
)
|
||||
mobile = models.CharField(max_length=20, blank=True, null=True, verbose_name='手机')
|
||||
area = models.CharField(max_length=100, blank=True, null=True, verbose_name='地区')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
status = models.CharField(
|
||||
max_length=20,
|
||||
choices=EmployeeStatusEnum.choices,
|
||||
default=EmployeeStatusEnum.ACTIVE,
|
||||
verbose_name='员工状态',
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '员工资料'
|
||||
verbose_name_plural = '员工资料'
|
||||
|
||||
|
||||
class DeviceStatusEnum(models.TextChoices):
|
||||
ACTIVE = '使用中', '使用中'
|
||||
INACTIVE = '停用', '停用'
|
||||
MAINTENANCE = '维修中', '维修中'
|
||||
|
||||
|
||||
class DeviceTypeEnum(models.TextChoices):
|
||||
ROLLING = '滚筒', '滚筒'
|
||||
PRINTER = '打印', '打印'
|
||||
|
||||
|
||||
class DeviceInfo(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
name = models.CharField(max_length=100, verbose_name='设备名称')
|
||||
type = models.CharField(
|
||||
max_length=20,
|
||||
choices=DeviceTypeEnum.choices,
|
||||
default=DeviceTypeEnum.ROLLING,
|
||||
verbose_name='设备类型',
|
||||
)
|
||||
status = models.CharField(
|
||||
max_length=20,
|
||||
choices=DeviceStatusEnum.choices,
|
||||
default=DeviceStatusEnum.ACTIVE,
|
||||
verbose_name='设备状态',
|
||||
)
|
||||
start_working_at = models.DateField(blank=True, null=True, verbose_name='开始服役日期')
|
||||
stop_working_at = models.DateField(blank=True, null=True, verbose_name='停止服役日期')
|
||||
is_occupied = models.BooleanField(default=False, verbose_name='是否被占用')
|
||||
description = models.TextField(blank=True, null=True, verbose_name='备注描述')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = '设备资料'
|
||||
verbose_name_plural = '设备资料'
|
||||
|
||||
|
||||
class VehicleTransportRecord(ModelBase):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
vehicle_type = models.ForeignKey(
|
||||
VehicleType,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='vehicles',
|
||||
verbose_name='车次',
|
||||
)
|
||||
driver_name = models.CharField(max_length=100, verbose_name='司机姓名')
|
||||
contact_number = models.CharField(max_length=20, blank=True, null=True, verbose_name='联系电话')
|
||||
license_plate = models.CharField(max_length=20, verbose_name='车牌号码', null=True, blank=True)
|
||||
delivery_date = models.DateField(verbose_name='送货日期')
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.vehicle_type}-{self.driver_name}-{self.delivery_date}'
|
||||
|
||||
class Meta:
|
||||
verbose_name = '司机车次'
|
||||
verbose_name_plural = '司机车次'
|
||||
Reference in New Issue
Block a user