diff --git a/hb_server/apps/hrm/views.py b/hb_server/apps/hrm/views.py index 151fa06..e4b7b3e 100644 --- a/hb_server/apps/hrm/views.py +++ b/hb_server/apps/hrm/views.py @@ -85,6 +85,7 @@ class FaceLogin(CreateAPIView): unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0] os.remove(filepath) except: + os.remove(filepath) return Response('头像解码失败', status=status.HTTP_400_BAD_REQUEST) # 匹配人脸库 diff --git a/hb_server/apps/mtm/filters.py b/hb_server/apps/mtm/filters.py index 41d7b73..8eb6b52 100644 --- a/hb_server/apps/mtm/filters.py +++ b/hb_server/apps/mtm/filters.py @@ -1,5 +1,6 @@ +from django.db.models.expressions import F from django_filters import rest_framework as filters -from apps.mtm.models import TechDoc +from apps.mtm.models import Material, TechDoc @@ -13,3 +14,14 @@ class TechDocFilterset(filters.FilterSet): def filter_operation(self, queryset, name, value): return queryset.filter(subproduction__subplan_subprod__ow_subplan__operation=value).distinct() + +class MaterialFilterSet(filters.FilterSet): + tag = filters.CharFilter(method='filter_tag') + class Meta: + model = Material + fields = ['type', 'tag'] + + def filter_tag(self, queryset, name, value): + if value == 'low_inm': + queryset = queryset.exclude(count_safe=None).filter(count__lte = F('count_safe')) + return queryset diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index e1c8f95..b7be795 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin -from apps.mtm.filters import TechDocFilterset +from apps.mtm.filters import MaterialFilterSet, TechDocFilterset from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer @@ -22,7 +22,7 @@ class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): queryset = Material.objects.all() serializer_class = MaterialSerializer search_fields = ['name', 'number'] - filterset_fields = ['type'] + filterset_class = MaterialFilterSet ordering_fields = ['number', 'sort_str'] ordering = ['number'] diff --git a/hb_server/apps/pm/filters.py b/hb_server/apps/pm/filters.py index bb7d83c..8e4b625 100644 --- a/hb_server/apps/pm/filters.py +++ b/hb_server/apps/pm/filters.py @@ -1,10 +1,20 @@ from django_filters import rest_framework as filters from apps.mtm.models import Material, Step -from apps.pm.models import SubProductionProgress +from apps.pm.models import ProductionPlan, SubProductionProgress from apps.wpm.models import Operation, WProduct from apps.wpm.services import WpmServies +class PlanFilterSet(filters.FilterSet): + create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') + create_time_end = filters.NumberFilter(field_name="create_time", lookup_expr='lte') + tag = filters.CharFilter(method='filter_tag') + class Meta: + model = ProductionPlan + fields = ['product', 'order', 'create_time_start', 'create_time_end'] + + def filter_tag(self, queryset, name, value): + pass class SubproductionProgressFilterSet(filters.FilterSet): @@ -24,4 +34,5 @@ class SubproductionProgressFilterSet(filters.FilterSet): queryset = queryset.filter(subproduction_plan__in=subplans) if step.type == Step.STEP_TYPE_NOM: queryset = queryset.exclude(material__type__in =[Material.MA_TYPE_HALFGOOD, Material.MA_TYPE_GOOD]) - return queryset \ No newline at end of file + return queryset + diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index cf367aa..3fe8799 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -8,7 +8,7 @@ from apps.em.serializers import EquipmentSerializer from apps.inm.models import MaterialBatch from apps.inm.serializers import MaterialBatchSerializer from apps.mtm.models import Step, SubProduction, SubprodctionMaterial, UsedStep -from apps.pm.filters import SubproductionProgressFilterSet +from apps.pm.filters import PlanFilterSet, SubproductionProgressFilterSet from apps.system.mixins import CreateUpdateModelAMixin from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin @@ -43,7 +43,7 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel queryset = ProductionPlan.objects.select_related('order', 'order__contract', 'product') serializer_class = ProductionPlanSerializer search_fields = ['number', 'order__number', 'order__contract__number', 'product__number'] - filterset_fields = ['product', 'order'] + filterset_class = PlanFilterSet ordering_fields = ['id'] ordering = ['-id'] diff --git a/hb_server/apps/sam/filters.py b/hb_server/apps/sam/filters.py index e69de29..72ed1b7 100644 --- a/hb_server/apps/sam/filters.py +++ b/hb_server/apps/sam/filters.py @@ -0,0 +1,11 @@ +from django_filters import rest_framework as filters + +from apps.sam.models import Order + + +class OrderFilterSet(filters.FilterSet): + create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') + create_time_end = filters.NumberFilter(field_name="create_time", lookup_expr='lte') + class Meta: + model = Order + fields = ['product', 'contract', 'customer', 'create_time_start', 'create_time_end'] \ No newline at end of file diff --git a/hb_server/apps/sam/views.py b/hb_server/apps/sam/views.py index 8a5f004..616ca13 100644 --- a/hb_server/apps/sam/views.py +++ b/hb_server/apps/sam/views.py @@ -5,6 +5,7 @@ from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModel from apps.mtm.models import Material from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, WareHouse from apps.inm.signals import update_inm +from apps.sam.filters import OrderFilterSet from apps.sam.serializers import ContractCreateUpdateSerializer, ContractSerializer, CustomerCreateUpdateSerializer, CustomerSerializer, OrderCreateUpdateSerializer, OrderSerializer, SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer from apps.sam.models import Contract, Customer, Order, Sale, SaleProduct from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -60,7 +61,7 @@ class OrderViewSet(CreateUpdateCustomMixin, ModelViewSet): queryset = Order.objects.select_related('contract', 'customer').all() serializer_class = OrderSerializer search_fields = ['number', 'product'] - filterset_fields = ['product', 'contract', 'customer'] + filterset_class = OrderFilterSet ordering_fields = ['create_time'] ordering = ['-create_time'] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index d07847a..7b615e5 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -86,7 +86,7 @@ class WProduct(CommonAModel): step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True, related_name='w_step') act_state = models.IntegerField('进行状态', default=0, choices=act_state_choices) is_hidden = models.BooleanField('是否隐藏', default=False) - child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE) + child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='wproduct_child') remark = models.CharField('备注', max_length=200, null=True, blank=True) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='wproduct_subplan') @@ -142,7 +142,7 @@ class WproductFlow(CommonAModel): step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True, related_name='wl_step') act_state = models.IntegerField('进行状态', default=0, choices=WProduct.act_state_choices) is_hidden = models.BooleanField('是否隐藏', default=False) - child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE) + child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='wproduct_child') remark = models.CharField('备注', max_length=200, null=True, blank=True) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 499debc..68a76ee 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -191,7 +191,7 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): """ perms_map={'*':'*'} queryset = WProduct.objects.select_related('step', 'material', - 'subproduction_plan', 'warehouse').prefetch_related('child') + 'subproduction_plan', 'warehouse').prefetch_related('wproduct_child') serializer_class = WProductListSerializer filterset_class = WProductFilterSet search_fields = ['number'] diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py index 65fdbf1..cad2e29 100644 --- a/hb_server/server/urls.py +++ b/hb_server/server/urls.py @@ -71,6 +71,7 @@ urlpatterns = [ path('api/wpm/', include('apps.wpm.urls')), path('api/srm/', include('apps.srm.urls')), path('api/develop/', include('apps.develop.urls')), + # 工具 path('api/utils/signature/', GenSignature.as_view()), path('api/utils/develop/', UpdateDevelop.as_view()),