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.inm.models import WareHouse from apps.pm.models import ProductionPlan, SubProductionPlan 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, Process, RecordFormField, Step, RecordForm from django.core.validators import MinValueValidator from apps.em.models import Equipment class WMaterial(BaseModel): """ 车间生产物料 """ subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子计划', on_delete=models.CASCADE) material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE) batch = models.CharField('批次号', max_length=100, null=True, blank=True) count = models.IntegerField('当前数量', default=0, validators=[MinValueValidator(0)]) class WProduct(CommonAModel): """ 动态半成品/成品表 """ WPR_ACT_STATE_DOING = 1 WPR_ACT_STATE_TOTEST = 2 WPR_ACT_STATE_OK = 3 WPR_ACT_STATE_INM = 4 act_state_choices=( (WPR_ACT_STATE_DOING, '生产中'), (WPR_ACT_STATE_TOTEST, '待检测'), (WPR_ACT_STATE_OK, '已合格'), (WPR_ACT_STATE_INM, '库存中'), ) number = models.CharField('物品编号', unique=True, null=True, blank=True, max_length=50) material = models.ForeignKey(Material, verbose_name='所属物料状态', on_delete=models.CASCADE) pre_step = models.ForeignKey(Step, verbose_name='已执行到', help_text='已执行完的步骤', null=True, blank=True, on_delete=models.CASCADE, related_name='w_pre_step') step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True, related_name='w_step') act_state = models.IntegerField('进行状态', default=0, choices=act_state_choices) is_executed = models.BooleanField('子工序是否已执行', default=False) is_hidden = models.BooleanField('是否隐藏', default=False) parent = models.JSONField('父', default=list, blank=True) remark = models.CharField('备注', max_length=200, null=True, blank=True) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE) production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE) warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True) operation = models.ForeignKey('wpm.operation', verbose_name='关联操作', on_delete=models.SET_NULL, null=True, blank=True, related_name='current_operation') class Operation(CommonADModel): """ 生产操作 """ step = models.ForeignKey(Step, verbose_name='操作步骤', on_delete=models.CASCADE, null=True, blank=True) use_scrap = models.BooleanField('是否使用的边角料', default=False) remark = models.CharField('操作备注', max_length=200, null=True, blank=True) is_submited = models.BooleanField('是否提交', default=False) class OperationWproduct(BaseModel): """ 生产操作半成品关联表 """ operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE) wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE) number = models.CharField('物品编号', null=True, blank=True, max_length=50) material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE) production_plan = models.ForeignKey(ProductionPlan, verbose_name='当前主生产计划', on_delete=models.CASCADE) class OperationMaterial(BaseModel): """ 生产操作物料消耗产出表 """ type_choices=( (1, '消耗'), (2, '产出') ) type = models.IntegerField('类型', default=0, choices=type_choices) operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE) wmaterial = models.ForeignKey(WMaterial, verbose_name='关联的车间物料', on_delete=models.CASCADE, null=True, blank=True) material = models.ForeignKey(Material, verbose_name='可能产出的副产品', on_delete=models.CASCADE, null=True, blank=True) count = models.IntegerField('消耗或产出数量', validators=[MinValueValidator(0)]) class OperationRecord(BaseModel): """ 记录表格 """ form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格', on_delete=models.CASCADE) operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE) is_filled = models.BooleanField('是否填写', default=True) class OperationRecordItem(BaseModel): """ 记录表格字段值 """ form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, db_constraint=False) field_name = models.CharField('字段名', max_length=50) field_key = models.CharField('字段标识', max_length=50) field_type = models.CharField('字段类型', choices=RecordForm.type_choices, max_length=50) field_value = models.JSONField('录入值', default=dict, blank=True) sort = models.IntegerField('排序号', default=1) operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE) class OperationEquip(BaseModel): operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE) equip = models.ForeignKey(Equipment, verbose_name='生产设备', on_delete=models.CASCADE) remark = models.TextField('备注', null=True, blank=True)