feat: mgroup 关联process

This commit is contained in:
caoqianming 2023-09-27 09:37:57 +08:00
parent aa281e6c46
commit 0ac87f5c09
4 changed files with 69 additions and 23 deletions

View File

@ -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='工序'),
),
]

View File

@ -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')

View File

@ -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']

View File

@ -1,4 +1,3 @@
line-length = 120
ignore-init-module-imports = true
line-length = 200
fix = true