From 0ac87f5c09fb4a4d0b0da97f1a536bf60f9b2e4d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 27 Sep 2023 09:37:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mgroup=20=E5=85=B3=E8=81=94process?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/migrations/0013_mgroup_process.py | 19 +++++++ apps/mtm/models.py | 61 ++++++++++++++++------ apps/mtm/views.py | 9 ++-- ruff.toml | 3 +- 4 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 apps/mtm/migrations/0013_mgroup_process.py diff --git a/apps/mtm/migrations/0013_mgroup_process.py b/apps/mtm/migrations/0013_mgroup_process.py new file mode 100644 index 00000000..a0e99cd8 --- /dev/null +++ b/apps/mtm/migrations/0013_mgroup_process.py @@ -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='工序'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index c57e2aeb..9e2689b4 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -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) \ No newline at end of file + 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') diff --git a/apps/mtm/views.py b/apps/mtm/views.py index 844020ef..9c23789e 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -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'] \ No newline at end of file + ordering = ['sort', 'create_time'] diff --git a/ruff.toml b/ruff.toml index 491757d7..c514775d 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,4 +1,3 @@ -line-length = 120 -ignore-init-module-imports = true +line-length = 200 fix = true \ No newline at end of file