diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 52a7ddc..b48ae3d 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -6,7 +6,7 @@ from apps.system.models import CommonAModel, CommonBModel, Organization, User, D from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material - +from apps.pm.models import SubProductionPlan class WareHouse(CommonAModel): @@ -57,4 +57,13 @@ class FIFO(CommonAModel): (3, '采购入库'), (4, '生产入库') ) - type = models.IntegerField('出入库类型', default=1) \ No newline at end of file + type = models.IntegerField('出入库类型', default=1) + operator = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) + subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.DO_NOTHING, null=True, blank=True) + +class FIFODetail(CommonAModel): + """ + 领料详细记录 + """ + + diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index e8c35cb..62c2473 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -122,6 +122,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo obj.save() return Response() raise APIException('计划状态有误') + class ResourceViewSet(GenericViewSet): perms_map = {'*': '*'} @@ -164,7 +165,7 @@ class ResourceViewSet(GenericViewSet): rdata_l.append(i['id']) subproductions = SubProduction.objects.filter(product__id__in=rdata_l, is_deleted=False) steps = Step.objects.filter(usedstep__is_deleted=False, usedstep__subproduction__in=subproductions) - equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False) + equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False).distinct() serializer = EquipmentSerializer(instance=equips, many=True) return Response(serializer.data) diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 0ddfec3..8df0377 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -7,6 +7,7 @@ from rest_framework.exceptions import APIException from django.utils import timezone from datetime import timedelta import random + class WfService(object): @staticmethod def get_worlflow_states(workflow:Workflow): @@ -111,6 +112,9 @@ class WfService(object): destination_state = transition.destination_state ticket_all_value = cls.get_ticket_all_field_value(ticket) ticket_all_value.update(**ticket_data) + for key, value in ticket_all_value.items(): + if isinstance(ticket_all_value[key], str): + ticket_all_value[key] = "'" + ticket_all_value[key] + "'" if transition.condition_expression: for i in transition.condition_expression: expression = i['expression'].format(**ticket_all_value) diff --git a/hb_server/apps/wf/views.py b/hb_server/apps/wf/views.py index a86e3f3..f2cc372 100644 --- a/hb_server/apps/wf/views.py +++ b/hb_server/apps/wf/views.py @@ -175,7 +175,7 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin queryset = Ticket.objects.filter(participant__contains=request.user.id, is_deleted=False)\ .exclude(act_state__in=[Ticket.TICKET_ACT_STATE_FINISH, Ticket.TICKET_ACT_STATE_CLOSED]) ret['total_count'] = queryset.count() - ret['details'] = list(queryset.annotate(count = Count('workflow')).values('workflow', 'workflow__name', 'count')) + ret['details'] = list(queryset.values('workflow', 'workflow__name').annotate(count = Count('workflow'))) return Response(ret) @action(methods=['post'], detail=True, perms_map={'post':'*'}) diff --git a/hb_server/apps/wpm/__init__.py b/hb_server/apps/wpm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/wpm/admin.py b/hb_server/apps/wpm/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/hb_server/apps/wpm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hb_server/apps/wpm/apps.py b/hb_server/apps/wpm/apps.py new file mode 100644 index 0000000..7c2337e --- /dev/null +++ b/hb_server/apps/wpm/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + +class WpmConfig(AppConfig): + name = 'apps.wpm' + verbose_name = '车间生产' + + diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py new file mode 100644 index 0000000..ab9aa54 --- /dev/null +++ b/hb_server/apps/wpm/models.py @@ -0,0 +1,26 @@ +from django.db import models +from django.db.models.base import Model +import django.utils.timezone as timezone +from django.db.models.query import QuerySet +from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from utils.model import SoftModel, BaseModel +from simple_history.models import HistoricalRecords + + +class Vendor(CommonAModel): + """ + 供应商信息 + """ + + name = models.CharField('供应商名称', max_length=50, unique=True) + contact = models.CharField('联系人', max_length=20) + contact_phone = models.CharField('联系电话', max_length=11, unique=True) + address = models.CharField('地址', max_length=200, null=True, blank=True) + description = models.CharField('描述', max_length=200, blank=True, null=True) + material = models.CharField('供应的物料', max_length=200, blank=True, null=True) + class Meta: + verbose_name = '供应商信息' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name \ No newline at end of file diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py new file mode 100644 index 0000000..037f7ef --- /dev/null +++ b/hb_server/apps/wpm/serializers.py @@ -0,0 +1,9 @@ +from rest_framework.serializers import ModelSerializer + +from .models import Vendor + + +class VendorSerializer(ModelSerializer): + class Meta: + model = Vendor + fields = '__all__' diff --git a/hb_server/apps/wpm/tests.py b/hb_server/apps/wpm/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/hb_server/apps/wpm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hb_server/apps/wpm/urls.py b/hb_server/apps/wpm/urls.py new file mode 100644 index 0000000..a81ad24 --- /dev/null +++ b/hb_server/apps/wpm/urls.py @@ -0,0 +1,12 @@ +from django.db.models import base +from rest_framework import urlpatterns +from apps.pum.views import VendorViewSet +from django.urls import path, include +from rest_framework.routers import DefaultRouter + +router = DefaultRouter() +router.register('vendor', VendorViewSet, basename='vendor') +urlpatterns = [ + path('', include(router.urls)), +] + diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py new file mode 100644 index 0000000..bb46fb1 --- /dev/null +++ b/hb_server/apps/wpm/views.py @@ -0,0 +1,23 @@ +from django.shortcuts import render +from rest_framework.viewsets import ModelViewSet + +from apps.pum.models import Vendor +from apps.pum.serializers import VendorSerializer +from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin + + + + +# Create your views here. +class VendorViewSet(CreateUpdateModelAMixin, ModelViewSet): + """ + 供应商-增删改查 + """ + perms_map = {'get': '*', 'post': 'vendor_create', + 'put': 'vendor_update', 'delete': 'vendor_delete'} + queryset = Vendor.objects.all() + serializer_class = VendorSerializer + search_fields = ['name', 'contact'] + filterset_fields = [] + ordering_fields = ['create_time'] + ordering = ['-create_time']