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 django.db import models
|
||||||
from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel
|
from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Process(CommonBModel):
|
class Process(CommonBModel):
|
||||||
"""
|
"""
|
||||||
工序 belong_dept为所在车间
|
工序 belong_dept为所在车间
|
||||||
|
@ -8,7 +9,8 @@ class Process(CommonBModel):
|
||||||
name = models.CharField('工序名称', max_length=100)
|
name = models.CharField('工序名称', max_length=100)
|
||||||
cate = models.CharField('大类', max_length=10, default='')
|
cate = models.CharField('大类', max_length=10, default='')
|
||||||
sort = models.PositiveSmallIntegerField('排序', default=1)
|
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)
|
instruction_content = models.TextField('指导书内容', null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,8 +24,8 @@ class Material(CommonAModel):
|
||||||
MA_TYPE_TOOL = 50
|
MA_TYPE_TOOL = 50
|
||||||
MA_TYPE_HELPTOOL = 60
|
MA_TYPE_HELPTOOL = 60
|
||||||
MA_TYPE_OFFICE = 70
|
MA_TYPE_OFFICE = 70
|
||||||
|
|
||||||
type_choices=(
|
type_choices = (
|
||||||
(MA_TYPE_BASE, '电/水/气'),
|
(MA_TYPE_BASE, '电/水/气'),
|
||||||
(MA_TYPE_GOOD, '成品'),
|
(MA_TYPE_GOOD, '成品'),
|
||||||
(MA_TYPE_HALFGOOD, '半成品'),
|
(MA_TYPE_HALFGOOD, '半成品'),
|
||||||
|
@ -35,22 +37,29 @@ class Material(CommonAModel):
|
||||||
)
|
)
|
||||||
name = models.CharField('名称', max_length=50)
|
name = models.CharField('名称', max_length=50)
|
||||||
number = models.CharField('编号', max_length=100, null=True, blank=True)
|
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)
|
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)
|
testitems = models.JSONField('检测项目', default=list, blank=True)
|
||||||
sort = models.PositiveSmallIntegerField('排序', default=1)
|
sort = models.PositiveSmallIntegerField('排序', default=1)
|
||||||
unit = models.CharField('基准计量单位', default='个', max_length=10)
|
unit = models.CharField('基准计量单位', default='个', max_length=10)
|
||||||
count = models.PositiveIntegerField('物料库存总数', default=0)
|
count = models.PositiveIntegerField('物料库存总数', default=0)
|
||||||
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True)
|
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True)
|
||||||
process = models.ForeignKey(Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True)
|
process = models.ForeignKey(
|
||||||
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料')
|
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)
|
is_hidden = models.BooleanField('是否隐藏', default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '物料表'
|
verbose_name = '物料表'
|
||||||
ordering = ['sort', '-create_time']
|
ordering = ['sort', '-create_time']
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Shift(CommonAModel):
|
class Shift(CommonAModel):
|
||||||
"""班次
|
"""班次
|
||||||
|
@ -67,7 +76,8 @@ class Team(CommonBModel):
|
||||||
"""班组
|
"""班组
|
||||||
"""
|
"""
|
||||||
name = models.CharField('名称', max_length=50)
|
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):
|
class Mgroup(CommonBModel):
|
||||||
|
@ -75,10 +85,16 @@ class Mgroup(CommonBModel):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = models.CharField('名称', max_length=50)
|
name = models.CharField('名称', max_length=50)
|
||||||
cate = models.CharField('分类', max_length=50, default='section', help_text='section/other') # section是工段
|
cate = models.CharField(
|
||||||
product = models.ForeignKey(Material, verbose_name='主要产品', on_delete=models.SET_NULL, null=True, blank=True)
|
'分类', max_length=50, default='section', help_text='section/other') # section是工段
|
||||||
input_materials = models.JSONField('直接材料', default=list, blank=True, help_text='material的ID列表')
|
process = models.ForeignKey(
|
||||||
test_materials = models.JSONField('检测材料', default=list, blank=True, help_text='material的ID列表')
|
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)
|
sort = models.PositiveSmallIntegerField('排序', default=1)
|
||||||
is_runing = models.BooleanField('是否正常运行', default=True)
|
is_runing = models.BooleanField('是否正常运行', default=True)
|
||||||
|
|
||||||
|
@ -90,9 +106,11 @@ class Mgroup(CommonBModel):
|
||||||
class Goal(CommonADModel):
|
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('年')
|
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 = models.FloatField('全年目标值')
|
||||||
goal_val_1 = models.FloatField('1月份目标值')
|
goal_val_1 = models.FloatField('1月份目标值')
|
||||||
goal_val_2 = models.FloatField('2月份目标值')
|
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)
|
material = models.ForeignKey(
|
||||||
process = models.ForeignKey(Process, verbose_name='工序', on_delete=models.CASCADE, null=True, blank=True)
|
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)
|
sort = models.PositiveSmallIntegerField('顺序', default=1)
|
||||||
is_autotask = models.BooleanField('是否自动排产', default=False)
|
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()
|
queryset = Mgroup.objects.all()
|
||||||
serializer_class = MgroupSerializer
|
serializer_class = MgroupSerializer
|
||||||
select_related_fields = ['create_by', 'belong_dept']
|
select_related_fields = ['create_by', 'belong_dept', 'process']
|
||||||
filterset_fields = ['belong_dept']
|
filterset_fields = ['belong_dept', 'process']
|
||||||
search_fields = ['number']
|
search_fields = ['number']
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class GoalViewSet(CustomModelViewSet):
|
||||||
vdata = sr.validated_data
|
vdata = sr.validated_data
|
||||||
res = get_mgroup_goals(vdata['mgroup'], vdata['year'], True)
|
res = get_mgroup_goals(vdata['mgroup'], vdata['year'], True)
|
||||||
return Response(res)
|
return Response(res)
|
||||||
|
|
||||||
|
|
||||||
class ProcessViewSet(CustomModelViewSet):
|
class ProcessViewSet(CustomModelViewSet):
|
||||||
queryset = Process.objects.all()
|
queryset = Process.objects.all()
|
||||||
|
@ -106,8 +106,9 @@ class ProcessViewSet(CustomModelViewSet):
|
||||||
raise ParseError('存在使用的工艺路线!')
|
raise ParseError('存在使用的工艺路线!')
|
||||||
return super().perform_destroy(instance)
|
return super().perform_destroy(instance)
|
||||||
|
|
||||||
|
|
||||||
class RouteViewSet(CustomModelViewSet):
|
class RouteViewSet(CustomModelViewSet):
|
||||||
queryset = Route.objects.all()
|
queryset = Route.objects.all()
|
||||||
serializer_class = RouteSerializer
|
serializer_class = RouteSerializer
|
||||||
filterset_fields = ['material', 'process', 'is_autotask']
|
filterset_fields = ['material', 'process', 'is_autotask']
|
||||||
ordering = ['sort', 'create_time']
|
ordering = ['sort', 'create_time']
|
||||||
|
|
Loading…
Reference in New Issue