feat: mgroup 关联process
This commit is contained in:
parent
aa281e6c46
commit
0ac87f5c09
|
@ -0,0 +1,19 @@
|
|||
# Generated by Django 3.2.12 on 2023-09-27 01:36
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mtm', '0012_auto_20230926_1054'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='mgroup',
|
||||
name='process',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mtm.process', verbose_name='工序'),
|
||||
),
|
||||
]
|
|
@ -1,6 +1,7 @@
|
|||
from django.db import models
|
||||
from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel
|
||||
|
||||
|
||||
class Process(CommonBModel):
|
||||
"""
|
||||
工序 belong_dept为所在车间
|
||||
|
@ -8,7 +9,8 @@ class Process(CommonBModel):
|
|||
name = models.CharField('工序名称', max_length=100)
|
||||
cate = models.CharField('大类', max_length=10, default='')
|
||||
sort = models.PositiveSmallIntegerField('排序', default=1)
|
||||
instruction = models.ForeignKey(File, verbose_name='指导书', on_delete=models.SET_NULL, null=True, blank=True)
|
||||
instruction = models.ForeignKey(
|
||||
File, verbose_name='指导书', on_delete=models.SET_NULL, null=True, blank=True)
|
||||
instruction_content = models.TextField('指导书内容', null=True, blank=True)
|
||||
|
||||
|
||||
|
@ -22,8 +24,8 @@ class Material(CommonAModel):
|
|||
MA_TYPE_TOOL = 50
|
||||
MA_TYPE_HELPTOOL = 60
|
||||
MA_TYPE_OFFICE = 70
|
||||
|
||||
type_choices=(
|
||||
|
||||
type_choices = (
|
||||
(MA_TYPE_BASE, '电/水/气'),
|
||||
(MA_TYPE_GOOD, '成品'),
|
||||
(MA_TYPE_HALFGOOD, '半成品'),
|
||||
|
@ -35,22 +37,29 @@ class Material(CommonAModel):
|
|||
)
|
||||
name = models.CharField('名称', max_length=50)
|
||||
number = models.CharField('编号', max_length=100, null=True, blank=True)
|
||||
specification = models.CharField('型号', max_length=100, null=True, blank=True)
|
||||
specification = models.CharField(
|
||||
'型号', max_length=100, null=True, blank=True)
|
||||
code = models.CharField('标识', max_length=50, null=True, blank=True)
|
||||
type = models.PositiveSmallIntegerField('物料类型', choices= type_choices, default=1, help_text=str(type_choices))
|
||||
type = models.PositiveSmallIntegerField(
|
||||
'物料类型', choices=type_choices, default=1, help_text=str(type_choices))
|
||||
testitems = models.JSONField('检测项目', default=list, blank=True)
|
||||
sort = models.PositiveSmallIntegerField('排序', default=1)
|
||||
unit = models.CharField('基准计量单位', default='个', max_length=10)
|
||||
count = models.PositiveIntegerField('物料库存总数', default=0)
|
||||
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True)
|
||||
process = models.ForeignKey(Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料')
|
||||
process = models.ForeignKey(
|
||||
Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
parent = models.ForeignKey(
|
||||
'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料')
|
||||
is_hidden = models.BooleanField('是否隐藏', default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '物料表'
|
||||
ordering = ['sort', '-create_time']
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Shift(CommonAModel):
|
||||
"""班次
|
||||
|
@ -67,7 +76,8 @@ class Team(CommonBModel):
|
|||
"""班组
|
||||
"""
|
||||
name = models.CharField('名称', max_length=50)
|
||||
leader = models.ForeignKey('system.user', verbose_name='班长', on_delete=models.CASCADE)
|
||||
leader = models.ForeignKey(
|
||||
'system.user', verbose_name='班长', on_delete=models.CASCADE)
|
||||
|
||||
|
||||
class Mgroup(CommonBModel):
|
||||
|
@ -75,10 +85,16 @@ class Mgroup(CommonBModel):
|
|||
"""
|
||||
|
||||
name = models.CharField('名称', max_length=50)
|
||||
cate = models.CharField('分类', max_length=50, default='section', help_text='section/other') # section是工段
|
||||
product = models.ForeignKey(Material, verbose_name='主要产品', on_delete=models.SET_NULL, null=True, blank=True)
|
||||
input_materials = models.JSONField('直接材料', default=list, blank=True, help_text='material的ID列表')
|
||||
test_materials = models.JSONField('检测材料', default=list, blank=True, help_text='material的ID列表')
|
||||
cate = models.CharField(
|
||||
'分类', max_length=50, default='section', help_text='section/other') # section是工段
|
||||
process = models.ForeignKey(
|
||||
Process, verbose_name='工序', on_delete=models.SET_NULL, null=True, blank=True)
|
||||
product = models.ForeignKey(
|
||||
Material, verbose_name='主要产品', on_delete=models.SET_NULL, null=True, blank=True)
|
||||
input_materials = models.JSONField(
|
||||
'直接材料', default=list, blank=True, help_text='material的ID列表')
|
||||
test_materials = models.JSONField(
|
||||
'检测材料', default=list, blank=True, help_text='material的ID列表')
|
||||
sort = models.PositiveSmallIntegerField('排序', default=1)
|
||||
is_runing = models.BooleanField('是否正常运行', default=True)
|
||||
|
||||
|
@ -90,9 +106,11 @@ class Mgroup(CommonBModel):
|
|||
class Goal(CommonADModel):
|
||||
"""目标
|
||||
"""
|
||||
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True)
|
||||
mgroup = models.ForeignKey(
|
||||
Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True)
|
||||
year = models.PositiveSmallIntegerField('年')
|
||||
goal_cate = models.ForeignKey(Dictionary, verbose_name='目标种类', on_delete=models.CASCADE)
|
||||
goal_cate = models.ForeignKey(
|
||||
Dictionary, verbose_name='目标种类', on_delete=models.CASCADE)
|
||||
goal_val = models.FloatField('全年目标值')
|
||||
goal_val_1 = models.FloatField('1月份目标值')
|
||||
goal_val_2 = models.FloatField('2月份目标值')
|
||||
|
@ -115,8 +133,17 @@ class Route(CommonAModel):
|
|||
"""
|
||||
工艺路线
|
||||
"""
|
||||
material = models.ForeignKey(Material, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True)
|
||||
process = models.ForeignKey(Process, verbose_name='工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
material = models.ForeignKey(
|
||||
Material, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True)
|
||||
process = models.ForeignKey(
|
||||
Process, verbose_name='工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
sort = models.PositiveSmallIntegerField('顺序', default=1)
|
||||
is_autotask = models.BooleanField('是否自动排产', default=False)
|
||||
out_rate = models.FloatField('出材率', default=100, null=True, blank=True)
|
||||
out_rate = models.FloatField('出材率', default=100, null=True, blank=True)
|
||||
|
||||
@staticmethod
|
||||
def get_routes(material: Material, autotask: bool = False):
|
||||
kwargs = {'material': material}
|
||||
if autotask:
|
||||
kwargs['is_autotask'] = True
|
||||
return Route.objects.filter(**kwargs).order_by('sort', 'process_sort' 'create_time')
|
||||
|
|
|
@ -48,8 +48,8 @@ class MgroupViewSet(CustomModelViewSet):
|
|||
"""
|
||||
queryset = Mgroup.objects.all()
|
||||
serializer_class = MgroupSerializer
|
||||
select_related_fields = ['create_by', 'belong_dept']
|
||||
filterset_fields = ['belong_dept']
|
||||
select_related_fields = ['create_by', 'belong_dept', 'process']
|
||||
filterset_fields = ['belong_dept', 'process']
|
||||
search_fields = ['number']
|
||||
|
||||
|
||||
|
@ -91,7 +91,7 @@ class GoalViewSet(CustomModelViewSet):
|
|||
vdata = sr.validated_data
|
||||
res = get_mgroup_goals(vdata['mgroup'], vdata['year'], True)
|
||||
return Response(res)
|
||||
|
||||
|
||||
|
||||
class ProcessViewSet(CustomModelViewSet):
|
||||
queryset = Process.objects.all()
|
||||
|
@ -106,8 +106,9 @@ class ProcessViewSet(CustomModelViewSet):
|
|||
raise ParseError('存在使用的工艺路线!')
|
||||
return super().perform_destroy(instance)
|
||||
|
||||
|
||||
class RouteViewSet(CustomModelViewSet):
|
||||
queryset = Route.objects.all()
|
||||
serializer_class = RouteSerializer
|
||||
filterset_fields = ['material', 'process', 'is_autotask']
|
||||
ordering = ['sort', 'create_time']
|
||||
ordering = ['sort', 'create_time']
|
||||
|
|
Loading…
Reference in New Issue