From 0b5c837fe59d54dea1e61bcb4a60aa430cd6b7c6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 08:16:29 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B5=81?= =?UTF-8?q?=E8=BD=AC=E5=AE=89=E5=85=A8=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/views.py | 1 + hb_server/apps/wf/services.py | 3 ++- hb_server/apps/wpm/__init__.py | 0 hb_server/apps/wpm/admin.py | 3 +++ hb_server/apps/wpm/apps.py | 7 +++++++ hb_server/apps/wpm/models.py | 27 +++++++++++++++++++++++++++ hb_server/apps/wpm/serializers.py | 9 +++++++++ hb_server/apps/wpm/tests.py | 3 +++ hb_server/apps/wpm/urls.py | 12 ++++++++++++ hb_server/apps/wpm/views.py | 21 +++++++++++++++++++++ 10 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 hb_server/apps/wpm/__init__.py create mode 100644 hb_server/apps/wpm/admin.py create mode 100644 hb_server/apps/wpm/apps.py create mode 100644 hb_server/apps/wpm/models.py create mode 100644 hb_server/apps/wpm/serializers.py create mode 100644 hb_server/apps/wpm/tests.py create mode 100644 hb_server/apps/wpm/urls.py create mode 100644 hb_server/apps/wpm/views.py diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index e8c35cb..d625812 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 = {'*': '*'} diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 0ddfec3..5bc23e1 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 +from ast import literal_eval class WfService(object): @staticmethod def get_worlflow_states(workflow:Workflow): @@ -115,7 +116,7 @@ class WfService(object): for i in transition.condition_expression: expression = i['expression'].format(**ticket_all_value) import datetime, time # 用于支持条件表达式中对时间的操作 - if eval(expression): + if literal_eval(expression): destination_state = State.objects.get(pk=i['target_state']) return destination_state 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..a705f8a --- /dev/null +++ b/hb_server/apps/wpm/models.py @@ -0,0 +1,27 @@ +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..1258ca9 --- /dev/null +++ b/hb_server/apps/wpm/views.py @@ -0,0 +1,21 @@ +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'] From 5046f4dbb1727748c33d928b0fead754a5bbda4a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 09:24:06 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/views.py | 4 ++-- hb_server/apps/wpm/models.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index d625812..62c2473 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -122,7 +122,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo obj.save() return Response() raise APIException('计划状态有误') - + class ResourceViewSet(GenericViewSet): perms_map = {'*': '*'} @@ -165,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/wpm/models.py b/hb_server/apps/wpm/models.py index a705f8a..ab9aa54 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -7,7 +7,6 @@ from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords - class Vendor(CommonAModel): """ 供应商信息 From c5fc214c10ddeb91b72a42e28fad203e7ebed642 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 11:12:21 +0800 Subject: [PATCH 3/6] =?UTF-8?q?eval=E5=87=BD=E6=95=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/models.py | 13 +++++++++++-- hb_server/apps/wf/services.py | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 52a7ddc..372e384 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/wf/services.py b/hb_server/apps/wf/services.py index 5bc23e1..e9a0cb4 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -7,7 +7,7 @@ from rest_framework.exceptions import APIException from django.utils import timezone from datetime import timedelta import random -from ast import literal_eval + class WfService(object): @staticmethod def get_worlflow_states(workflow:Workflow): @@ -116,7 +116,7 @@ class WfService(object): for i in transition.condition_expression: expression = i['expression'].format(**ticket_all_value) import datetime, time # 用于支持条件表达式中对时间的操作 - if literal_eval(expression): + if eval(expression): destination_state = State.objects.get(pk=i['target_state']) return destination_state From 526127b1e4b6e27d5c493ab5b355ce5de080eb6d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 14:38:00 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/models.py | 2 +- hb_server/apps/wf/views.py | 2 +- hb_server/apps/wpm/views.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 372e384..b48ae3d 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -65,5 +65,5 @@ class FIFODetail(CommonAModel): """ 领料详细记录 """ - + 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/views.py b/hb_server/apps/wpm/views.py index 1258ca9..bb46fb1 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -6,6 +6,8 @@ from apps.pum.serializers import VendorSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin + + # Create your views here. class VendorViewSet(CreateUpdateModelAMixin, ModelViewSet): """ From 70f71874e7a10a7e2c513f4cdf2f5caf8587ccf4 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 14:41:01 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=B5=81=E8=BD=ACbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/services.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index e9a0cb4..7ff0fbe 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -112,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) From c63a636efe951317f7b56ab57d7f12de9c15d810 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 Oct 2021 14:50:49 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=B5=81=E8=BD=ACbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wf/services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/wf/services.py b/hb_server/apps/wf/services.py index 7ff0fbe..8df0377 100644 --- a/hb_server/apps/wf/services.py +++ b/hb_server/apps/wf/services.py @@ -114,7 +114,7 @@ class WfService(object): 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] + "'''" + 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)