154 lines
6.0 KiB
Python
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) |