hberp/hb_server/apps/inm/models.py

154 lines
6.0 KiB
Python

from django.db import models
from django.db.models.base import Model
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
from apps.pum.models import PuOrder, PuOrderItem, Vendor
from apps.sam.models import Sale
from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File
from utils.model import SoftModel, BaseModel
from simple_history.models import HistoricalRecords
from apps.mtm.models import Material
from apps.pm.models import SubProductionPlan
from django.core.validators import MinValueValidator, MaxValueValidator
class WareHouse(CommonAModel):
"""
仓库信息
"""
number = models.CharField('仓库编号', max_length=20, unique=True)
name = models.CharField('仓库名称', max_length=20, unique=True)
place = models.CharField('具体地点', max_length=50)
class Meta:
verbose_name = '仓库信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Inventory(BaseModel):
"""
库存物料
"""
material = models.ForeignKey(
Material, on_delete=models.CASCADE, verbose_name='物料信息')
count = models.PositiveIntegerField('仓库物料存量', default=0)
warehouse = models.ForeignKey(
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
class Meta:
verbose_name = '库存表'
verbose_name_plural = verbose_name
class MaterialBatch(BaseModel):
"""
物料批次
"""
material = models.ForeignKey(
Material, on_delete=models.CASCADE, verbose_name='物料信息')
warehouse = models.ForeignKey(
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
count = models.PositiveIntegerField('存量', default=0)
batch = models.CharField('批次号', max_length=100, default='')
expiration_date = models.DateField('有效期', null=True, blank=True)
class Meta:
verbose_name = '库存表'
verbose_name_plural = verbose_name
class FIFO(CommonADModel):
"""
出入库记录
"""
FIFO_TYPE_DO_OUT = 1 # 生产领料
FIFO_TYPE_SALE_OUT = 2
FIFO_TYPE_PUR_IN = 3
FIFO_TYPE_DO_IN = 4
FIFO_TYPE_OTHER_IN = 5
type_choices = (
(FIFO_TYPE_DO_OUT, '生产领料'),
(FIFO_TYPE_SALE_OUT, '销售提货'),
(FIFO_TYPE_PUR_IN, '采购入库'),
(FIFO_TYPE_DO_IN, '生产入库'),
(FIFO_TYPE_OTHER_IN, '其他入库')
)
number = models.CharField('记录编号', max_length=100)
type = models.IntegerField('出入库类型', default=1)
is_audited = models.BooleanField('是否审核', default=False)
auditor = models.ForeignKey(
User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True)
inout_date = models.DateField('出入库日期', null=True, blank=True)
remark = models.CharField('备注', max_length=1000, default='')
vendor = models.ForeignKey(Vendor, verbose_name='供应商',
on_delete=models.CASCADE, null=True, blank=True)
pu_order = models.ForeignKey(PuOrder, verbose_name='关联采购订单',
null=True, blank=True, on_delete=models.CASCADE)
sale = models.ForeignKey(Sale, verbose_name='关联销售记录',
null=True, blank=True, on_delete=models.CASCADE, related_name='fifo_sale')
class FIFOItem(BaseModel):
"""
出入库详细条目
"""
need_test = models.BooleanField('是否需要复验', default=False)
is_testok = models.BooleanField('是否复验合格', null=True, blank=True)
warehouse = models.ForeignKey(
WareHouse, on_delete=models.CASCADE, verbose_name='仓库')
material = models.ForeignKey(
Material, verbose_name='物料类型', on_delete=models.CASCADE)
count = models.PositiveIntegerField('数量', default=0)
batch = models.CharField('批次号', max_length=100, default='')
fifo = models.ForeignKey(FIFO, verbose_name='关联出入库',
on_delete=models.CASCADE)
expiration_date = models.DateField('有效期', null=True, blank=True)
subproduction_plan = models.ForeignKey(
SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE, null=True, blank=True)
files = models.ManyToManyField(File, verbose_name='上传材料', blank=True)
pu_order_item = models.ForeignKey(PuOrderItem,
verbose_name='关联采购订单条目', null=True, blank=True, on_delete=models.CASCADE)
class IProduct(BaseModel):
"""
具体产品条目
"""
SALE_OK = 10
SALE_LOCK = 20
SALED = 30
state_choices = (
(SALE_OK, '可销售'),
(SALE_LOCK, '已锁定'),
(SALED, '已售出')
)
number = models.CharField('物品编号', unique=True, max_length=50)
material = models.ForeignKey(
Material, verbose_name='物料类型', on_delete=models.CASCADE)
warehouse = models.ForeignKey(
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
batch = models.CharField('所属批次号', max_length=100, default='')
wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False,
null=True, blank=True, related_name='iproduct_wproduct')
state = models.IntegerField('状态', default=SALE_OK, choices=state_choices)
class FIFOItemProduct(BaseModel):
"""
出入库记录具体产品
"""
fifoitem = models.ForeignKey(
FIFOItem, verbose_name='关联出入库条目', on_delete=models.CASCADE)
wproduct = models.ForeignKey('wpm.wproduct',
on_delete=models.CASCADE, verbose_name='关联的动态产品',
db_constraint=False, null=True, blank=True,
related_name='fifoitem_wproduct')
number = models.CharField('物品编号', max_length=50)
material = models.ForeignKey(
Material, verbose_name='物料类型', on_delete=models.CASCADE)
iproduct = models.ForeignKey(
IProduct, verbose_name='关联库存产品',
null=True, blank=True, on_delete=models.SET_NULL)