diff --git a/apps/mtm/migrations/0002_auto_20230626_1559.py b/apps/mtm/migrations/0002_auto_20230626_1559.py new file mode 100644 index 00000000..d65b484b --- /dev/null +++ b/apps/mtm/migrations/0002_auto_20230626_1559.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.12 on 2023-06-26 07:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='material', + name='qitems', + ), + migrations.AddField( + model_name='material', + name='testitems', + field=models.JSONField(blank=True, default=list, verbose_name='检测项目'), + ), + migrations.AlterField( + model_name='material', + name='type', + field=models.PositiveSmallIntegerField(choices=[(0, '电/水/气'), (10, '成品'), (20, '半成品'), (30, '主要原料'), (40, '辅助材料'), (50, '加工工具'), (60, '辅助工装')], default=1, help_text="((0, '电/水/气'), (10, '成品'), (20, '半成品'), (30, '主要原料'), (40, '辅助材料'), (50, '加工工具'), (60, '辅助工装'))", verbose_name='物料类型'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index d5bed074..1a832171 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -3,13 +3,16 @@ from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADM # Create your models here. class Material(CommonAModel): + MA_TYPE_BASE = 0 MA_TYPE_GOOD = 10 MA_TYPE_HALFGOOD = 20 MA_TYPE_MAINSO = 30 MA_TYPE_HELPSO = 40 MA_TYPE_TOOL = 50 MA_TYPE_HELPTOOL = 60 + type_choices=( + (MA_TYPE_BASE, '电/水/气'), (MA_TYPE_GOOD, '成品'), (MA_TYPE_HALFGOOD, '半成品'), (MA_TYPE_MAINSO, '主要原料'), @@ -20,7 +23,7 @@ class Material(CommonAModel): name = models.CharField('名称', max_length=50) code = models.CharField('标识', max_length=50, null=True, blank=True) type = models.PositiveSmallIntegerField('物料类型', choices= type_choices, default=1, help_text=str(type_choices)) - qitems = models.ManyToManyField(Dictionary, verbose_name='质检项目', blank=True) + testitems = models.JSONField('检测项目', default=list, blank=True) class Meta: verbose_name = '物料表' diff --git a/apps/qm/migrations/0002_auto_20230626_1559.py b/apps/qm/migrations/0002_auto_20230626_1559.py new file mode 100644 index 00000000..19241d8d --- /dev/null +++ b/apps/qm/migrations/0002_auto_20230626_1559.py @@ -0,0 +1,50 @@ +# Generated by Django 3.2.12 on 2023-06-26 07:59 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0002_auto_20230625_1709'), + ('qm', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='quastat', + old_name='product', + new_name='material', + ), + migrations.AddField( + model_name='quastat', + name='sflog', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.sflog', verbose_name='关联值班记录'), + ), + migrations.AlterField( + model_name='quastat', + name='num_ok', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='合格次数'), + ), + migrations.AlterField( + model_name='quastat', + name='num_test', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='检测次数'), + ), + migrations.AlterField( + model_name='quastat', + name='type', + field=models.CharField(default='day', help_text='year/month/day/sflog', max_length=50, verbose_name='统计维度'), + ), + migrations.AlterField( + model_name='quastat', + name='val_avg', + field=models.FloatField(blank=True, null=True, verbose_name='平均值'), + ), + migrations.AlterField( + model_name='quastat', + name='year', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='年'), + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index 32a4c174..3766e4e9 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -2,6 +2,7 @@ from django.db import models from apps.system.models import CommonAModel from apps.utils.models import CommonBDModel from apps.mtm.models import Material +from apps.wpm.models import SfLog class TestItem(CommonAModel): """ @@ -14,13 +15,14 @@ class QuaStat(CommonBDModel): """ 质量数据统计表 需要有belong_dept """ - type = models.CharField('统计维度', max_length=50, default='day', help_text='year/month/day') - year = models.PositiveSmallIntegerField('年') + type = models.CharField('统计维度', max_length=50, default='day', help_text='year/month/day/sflog') + year = models.PositiveSmallIntegerField('年', null=True, blank=True) month = models.PositiveSmallIntegerField('月', null=True, blank=True) day = models.PositiveSmallIntegerField('日', null=True, blank=True) - product = models.ForeignKey(Material, verbose_name='关联产物', on_delete=models.CASCADE) + material = models.ForeignKey(Material, verbose_name='关联产物', on_delete=models.CASCADE) + sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True) testitem = models.ForeignKey(TestItem, verbose_name='质检项目', on_delete=models.CASCADE) - val_avg = models.FloatField('平均值') - num_test = models.PositiveSmallIntegerField('检测次数') - num_ok = models.PositiveSmallIntegerField('合格次数') + val_avg = models.FloatField('平均值', null=True, blank=True) + num_test = models.PositiveSmallIntegerField('检测次数', null=True, blank=True) + num_ok = models.PositiveSmallIntegerField('合格次数', null=True, blank=True) rate_pass = models.FloatField('合格率') \ No newline at end of file diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index db3e1735..b037cd28 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -3,6 +3,7 @@ from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from apps.system.models import Dept, Dictionary +from apps.wpm.models import SfLog class TestItemSerializer(CustomModelSerializer): class Meta: @@ -16,9 +17,22 @@ class QuaStatSerializer(CustomModelSerializer): day = serializers.IntegerField(label='天', required=True) belong_dept = serializers.PrimaryKeyRelatedField(label="所属部门", queryset=Dept.objects.all(), required=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) - product_name = serializers.CharField(source='product.name', read_only=True) - qitem_name = serializers.CharField(source='qitem.name', read_only=True) + material_name = serializers.CharField(source='material.name', read_only=True) + testitem_name = serializers.CharField(source='testitem.name', read_only=True) class Meta: model = QuaStat fields = '__all__' - read_only_fields = EXCLUDE_FIELDS + ['type', 'rate_pass'] \ No newline at end of file + read_only_fields = EXCLUDE_FIELDS + ['type', 'rate_pass'] + extra_kwargs = {'val_avg': {'required': True}, 'num_test':{'required': True}, 'num_ok': {'required': True}} + + +class QuaStatSfLogSerializer(CustomModelSerializer): + sflog = serializers.PrimaryKeyRelatedField(label="值班记录", queryset=SfLog.objects.all(), required=True) + class Meta: + model = QuaStat + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS + ['type', 'year', 'month', 'day'] + + def validate(self, attrs): + attrs['type'] = 'sflog' + return attrs \ No newline at end of file diff --git a/apps/qm/urls.py b/apps/qm/urls.py index b986fab8..77a96895 100644 --- a/apps/qm/urls.py +++ b/apps/qm/urls.py @@ -1,13 +1,14 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.qm.views import QuaStatViewSet, TestItemViewSet +from apps.qm.views import QuaStatViewSet, TestItemViewSet, QuaStatSfLogViewSet API_BASE_URL = 'api/qm/' HTML_BASE_URL = 'qm/' router = DefaultRouter() router.register('quastat', QuaStatViewSet, basename='quastat') +router.register('quastat_sflog', QuaStatSfLogViewSet, basename='quastat_sflog') router.register('testitem', TestItemViewSet, basename='testitem') urlpatterns = [ path(API_BASE_URL, include(router.urls)), diff --git a/apps/qm/views.py b/apps/qm/views.py index 97267738..312c9fa3 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -1,8 +1,10 @@ from django.shortcuts import render from rest_framework.mixins import ListModelMixin, CreateModelMixin +from rest_framework.decorators import action from apps.qm.models import QuaStat, TestItem -from apps.qm.serializers import QuaStatSerializer, TestItemSerializer +from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatSfLogSerializer from apps.qm.tasks import cal_quastat +from rest_framework.response import Response from apps.utils.viewsets import CustomGenericViewSet @@ -26,7 +28,7 @@ class QuaStatViewSet(ListModelMixin, CreateModelMixin, CustomGenericViewSet): """ queryset = QuaStat.objects.all() serializer_class = QuaStatSerializer - filterset_fields = ['type', 'year', 'month', 'day', 'product', 'testitem', 'belong_dept'] + filterset_fields = ['type', 'year', 'month', 'day', 'product', 'testitem', 'belong_dept', 'sflog'] select_related_fields = ['belong_dept', 'product', 'testitem'] def perform_create(self, serializer): @@ -34,4 +36,14 @@ class QuaStatViewSet(ListModelMixin, CreateModelMixin, CustomGenericViewSet): ins.rate_pass = ins.num_ok/ ins.num_test ins.save() # 计算月和年的统计 - cal_quastat.delay(ins.id) \ No newline at end of file + cal_quastat.delay(ins.id) + + +class QuaStatSfLogViewSet(CreateModelMixin, CustomGenericViewSet): + """ + 值班-质量分析 + + 值班-质量分析 + """ + queryset = QuaStat.objects.all() + serializer_class = QuaStatSfLogSerializer \ No newline at end of file diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 87400333..639af0ee 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -41,12 +41,4 @@ class StSfLogSerializer(CustomModelSerializer): class Meta: model = StSfLog fields = '__all__' - read_only_fields = EXCLUDE_FIELDS + ['stlog', 'sflog', 'is_current_down'] - -class QItemDataSerializer(serializers.Serializer): - qitem = serializers.PrimaryKeyRelatedField(label='检测项目', queryset=Dictionary.objects.filter(type__code='qitem')) - val = serializers.FloatField(label='值') - - -class SfLogQuaSerializer(serializers.Serializer): - qua_data = QItemDataSerializer(many=True) \ No newline at end of file + read_only_fields = EXCLUDE_FIELDS + ['stlog', 'sflog', 'is_current_down'] \ No newline at end of file diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 18d10881..c9748fcb 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -7,7 +7,7 @@ from rest_framework.exceptions import ParseError from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.wpm.models import SfLog, StLog, StSfLog -from apps.wpm.serializers import SfLogQuaSerializer, SfLogSerializer, StLogSerializer, StSfLogSerializer +from apps.wpm.serializers import SfLogSerializer, StLogSerializer, StSfLogSerializer # Create your views here. class StLogViewSet(ListModelMixin, CustomGenericViewSet): @@ -49,25 +49,9 @@ class SfLogViewSet(CustomModelViewSet): if stsflog: stsflog.is_current_down = True stsflog.save() - - @action(methods=['put'], detail=True, perms_map={'put': 'sflogqua.update'}, serializer_class=SfLogQuaSerializer) - def qua_data(self, request, pk=None): - """ - 质量数据录入 - - 质量数据录入 - """ - sflog = self.get_object() - sr = SfLogQuaSerializer(data=request.data) - sr.is_valid(raise_exception=True) - vdata = sr.validated_data - qua_data = vdata['qua_data'] - qua_data_new = [] - for i in qua_data: - qua_data_new.append({'qitem': i['qitem'].id, 'qitem_name': i['qitem'].name, 'val': i['val']}) - sflog.qua_data = qua_data_new - sflog.save() - return Response() + # 计算能耗 + from apps.enm.tasks import cal_sflog_en_val + cal_sflog_en_val.delay(ins.id) class StSfLogViewSet(ListModelMixin, UpdateModelMixin, CustomGenericViewSet): """