156 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			6.1 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
 | |
|     FIFO_TYPE_OTHER_OUT = 6
 | |
|     type_choices = (
 | |
|         (FIFO_TYPE_DO_OUT, '生产领料'),
 | |
|         (FIFO_TYPE_SALE_OUT, '销售提货'),
 | |
|         (FIFO_TYPE_PUR_IN, '采购入库'),
 | |
|         (FIFO_TYPE_DO_IN, '生产入库'),
 | |
|         (FIFO_TYPE_OTHER_IN, '其他入库'),
 | |
|         (FIFO_TYPE_OTHER_OUT, '其他出库')
 | |
|     )
 | |
|     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) |