From 0d021f188722bedbd37814c928c56f37773de476 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 25 Jan 2022 10:43:37 +0800 Subject: [PATCH 01/21] =?UTF-8?q?equipsimple=20=E5=A2=9E=E5=8A=A0type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/em/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py index c22238d..5398909 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -37,7 +37,7 @@ class EquipmentCreateUpdateSerializer(ModelSerializer): class EquipmentSimpleSerializer(ModelSerializer): class Meta: model = Equipment - fields = ['id', 'number', 'name', 'state', 'model'] + fields = ['id', 'number', 'name', 'state', 'model', 'type'] From 4ba365b24380b973808b5eadf30e8583b3d139df Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 25 Jan 2022 10:57:25 +0800 Subject: [PATCH 02/21] order create update need_mtest --- hb_server/apps/sam/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 81ed0df..7c0525c 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -44,7 +44,7 @@ class ContractCreateUpdateSerializer(serializers.ModelSerializer): class OrderCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = Order - fields = ['customer', 'contract', 'product', 'count', 'delivery_date'] + fields = ['customer', 'contract', 'product', 'count', 'delivery_date', 'need_mtest'] def create(self, validated_data): validated_data['number'] = 'DD' + ranstr(7) From e90213d6cec8aaf655d47f400f8e23e5e2b5da2c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 25 Jan 2022 11:16:43 +0800 Subject: [PATCH 03/21] =?UTF-8?q?wproduct=20=E5=A2=9E=E5=8A=A0need=5Fto=5F?= =?UTF-8?q?order=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/serializers.py | 1 + hb_server/apps/wpm/filters.py | 2 +- .../wpm/migrations/0052_auto_20220125_1116.py | 31 +++++++++++++++++++ hb_server/apps/wpm/models.py | 3 ++ hb_server/apps/wpm/tasks.py | 0 hb_server/apps/wpm/views.py | 20 ++++++++++++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 hb_server/apps/wpm/migrations/0052_auto_20220125_1116.py create mode 100644 hb_server/apps/wpm/tasks.py diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 3569848..a807059 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -51,6 +51,7 @@ class MaterialBatchSerializer(serializers.ModelSerializer): class IProductListSerializer(serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) + need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True) is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True) remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True) diff --git a/hb_server/apps/wpm/filters.py b/hb_server/apps/wpm/filters.py index c4db494..5cfb6ea 100644 --- a/hb_server/apps/wpm/filters.py +++ b/hb_server/apps/wpm/filters.py @@ -41,7 +41,7 @@ class WProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): class Meta: model = WProduct fields = ['step', 'subproduction_plan', 'material', - 'step__process', 'act_state', 'material__type'] + 'step__process', 'act_state', 'material__type', 'need_to_order'] def filter_tag(self, queryset, name, value): if value == 'no_scrap': diff --git a/hb_server/apps/wpm/migrations/0052_auto_20220125_1116.py b/hb_server/apps/wpm/migrations/0052_auto_20220125_1116.py new file mode 100644 index 0000000..ff2d3d1 --- /dev/null +++ b/hb_server/apps/wpm/migrations/0052_auto_20220125_1116.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.9 on 2022-01-25 03:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0051_auto_20220120_1541'), + ] + + operations = [ + migrations.RemoveField( + model_name='wproduct', + name='is_mtested', + ), + migrations.RemoveField( + model_name='wproductflow', + name='is_mtested', + ), + migrations.AddField( + model_name='wproduct', + name='need_to_order', + field=models.BooleanField(default=False, verbose_name='是否要指派订单'), + ), + migrations.AddField( + model_name='wproductflow', + name='need_to_order', + field=models.BooleanField(default=False, verbose_name='是否要指派订单'), + ), + ] diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 9027301..571960e 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -119,6 +119,7 @@ class WProduct(CommonAModel): ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_ticket') + need_to_order = models.BooleanField('是否要指派订单', default=False) to_order = models.ForeignKey('sam.order', verbose_name='指派的订单', null=True, blank=True, on_delete = models.CASCADE) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) @@ -192,6 +193,8 @@ class WproductFlow(CommonAModel): on_delete=models.SET_NULL, null=True, blank=True) ticket = models.ForeignKey('wf.ticket', verbose_name='当前工单', on_delete=models.SET_NULL, null=True, blank=True) + + need_to_order = models.BooleanField('是否要指派订单', default=False) to_order = models.ForeignKey('sam.order', verbose_name='指派的订单', null=True, blank=True, on_delete = models.CASCADE) is_mtestok = models.BooleanField('是否军检合格', null=True, blank=True) remark_mtest = models.TextField('军检备注', null=True, blank=True) diff --git a/hb_server/apps/wpm/tasks.py b/hb_server/apps/wpm/tasks.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index d1f9c5a..923dd09 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -441,6 +441,24 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): ret.append([str(index + 1), item['step_name'], item['actions']]) return Response(ret) + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproductToOrderSerializer) + @transaction.atomic + def need_to_order(self, request, pk=None): + """ + 设为需要指派订单 + """ + serializer = WproductToOrderSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + wps = WProduct.objects.filter(id__in = [i.id for i in vdata.get('wproducts')]) + wps.update() + for i in wps: + i.need_to_order = True + i.update_by = request.user + i.save() + WpmServies.add_wproduct_flow_log(i, change_str='need_to_order') + return Response() + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproductToOrderSerializer) @transaction.atomic def to_order(self, request, pk=None): @@ -451,6 +469,8 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): serializer.is_valid(raise_exception=True) vdata = serializer.validated_data wps = WProduct.objects.filter(id__in = [i.id for i in vdata.get('wproducts')]) + if wps.filter(need_to_order = False).exists(): + raise exceptions.ValidationError('存在不需要指派订单的产品') wp = wps.first() order = vdata['order'] if wp.material != order.product: From c98613785b28ef4553413840061b9e2069c9d84c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 25 Jan 2022 13:13:11 +0800 Subject: [PATCH 04/21] bug --- hb_server/apps/develop/urls.py | 5 +++-- hb_server/apps/develop/views.py | 6 ++++++ hb_server/apps/inm/serializers2.py | 15 +++++++++++++++ hb_server/apps/sam/serializers.py | 3 ++- 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 hb_server/apps/inm/serializers2.py diff --git a/hb_server/apps/develop/urls.py b/hb_server/apps/develop/urls.py index 22621ac..0048316 100644 --- a/hb_server/apps/develop/urls.py +++ b/hb_server/apps/develop/urls.py @@ -2,7 +2,7 @@ from django.db.models import base from rest_framework import urlpatterns from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.develop.views import CleanDataView, UpdateCuttingView, UpdateEquipState, UpdateFIFOItem, UpdateLastTestResult, UpdateSpg +from apps.develop.views import CleanDataView, UpdateCuttingView, UpdateEquipState, UpdateFIFOItem, UpdateLastTestResult, UpdateNeedToOrder, UpdateSpg urlpatterns = [ path('cleandata/', CleanDataView.as_view()), @@ -11,6 +11,7 @@ urlpatterns = [ path('update_last_result/', UpdateLastTestResult.as_view()), path('update_fifoitem/', UpdateFIFOItem.as_view()), path('update_spg/', UpdateSpg.as_view()), - path('update_equip_state/', UpdateEquipState.as_view()) + path('update_equip_state/', UpdateEquipState.as_view()), + path('update_need_to_order/', UpdateNeedToOrder.as_view()) ] diff --git a/hb_server/apps/develop/views.py b/hb_server/apps/develop/views.py index c1b5b84..4d6c050 100644 --- a/hb_server/apps/develop/views.py +++ b/hb_server/apps/develop/views.py @@ -99,4 +99,10 @@ class UpdateEquipState(APIView): def post(self, request, format=None): update_equip_state_by_next_check_date() + return Response() + +class UpdateNeedToOrder(APIView): + permission_classes = [IsAdminUser] + def post(self, request): + WProduct.objects.exclude(to_order=None).update(need_to_order=True) return Response() \ No newline at end of file diff --git a/hb_server/apps/inm/serializers2.py b/hb_server/apps/inm/serializers2.py new file mode 100644 index 0000000..3149e89 --- /dev/null +++ b/hb_server/apps/inm/serializers2.py @@ -0,0 +1,15 @@ +from rest_framework import serializers +from apps.inm.models import IProduct +from apps.mtm.serializers import MaterialSimpleSerializer + + +class IProductListSerializer(serializers.ModelSerializer): + material_ = MaterialSimpleSerializer(source='material', read_only=True) + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) + need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True) + is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True) + remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True) + + class Meta: + model = IProduct + fields = '__all__' \ No newline at end of file diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 7c0525c..c00c178 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -66,7 +66,8 @@ class OrderSimpleSerializer(serializers.ModelSerializer): fields = ['id', 'number', 'contract_', 'customer_', 'need_mtest'] class SaleCreateSerializer(serializers.ModelSerializer): - iproducts = serializers.PrimaryKeyRelatedField(queryset=IProduct.objects.all(), many=True) + iproducts = serializers.PrimaryKeyRelatedField(queryset= + IProduct.objects.all(), many=True) class Meta: model = Sale fields = ['customer', 'order', 'product', 'iproducts'] From 9d3cbbd1511e57ab28db08fc3ffb944ad226171a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 25 Jan 2022 17:04:24 +0800 Subject: [PATCH 05/21] =?UTF-8?q?system=E5=A2=9E=E5=8A=A0last=5Fcheck=5Fti?= =?UTF-8?q?me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/hrm/tasks.py | 2 +- hb_server/apps/hrm/views.py | 1 + hb_server/apps/inm/serializers.py | 2 +- hb_server/apps/inm/serializers2.py | 15 --------------- hb_server/apps/sam/serializers.py | 2 +- .../migrations/0005_user_last_check_time.py | 18 ++++++++++++++++++ hb_server/apps/system/models.py | 1 + hb_server/apps/system/serializers.py | 2 +- 8 files changed, 24 insertions(+), 19 deletions(-) delete mode 100644 hb_server/apps/inm/serializers2.py create mode 100644 hb_server/apps/system/migrations/0005_user_last_check_time.py diff --git a/hb_server/apps/hrm/tasks.py b/hb_server/apps/hrm/tasks.py index d5d5a9f..65ffe92 100644 --- a/hb_server/apps/hrm/tasks.py +++ b/hb_server/apps/hrm/tasks.py @@ -11,7 +11,7 @@ def update_all_user_not_atwork(): """ 将所有员工设为非在岗状态 """ - User.objects.all().update(is_atwork=False) + User.objects.all().update(is_atwork=False, last_check_time = None) @shared_task def update_all_user_facedata_cache(): diff --git a/hb_server/apps/hrm/views.py b/hb_server/apps/hrm/views.py index dafe59c..e3d86b5 100644 --- a/hb_server/apps/hrm/views.py +++ b/hb_server/apps/hrm/views.py @@ -91,6 +91,7 @@ class ClockRecordViewSet(CreateModelMixin, ListModelMixin, GenericViewSet): ins.save() # 设为在岗 user.is_atwork = True + user.last_check_time = now user.save() return Response(UserSimpleSerializer(instance=user).data) return Response(msg, status=status.HTTP_400_BAD_REQUEST) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index a807059..1a35e32 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -4,6 +4,7 @@ from rest_framework import serializers from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory from apps.qm.models import TestRecord, TestRecordItem + from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer from django.db import transaction @@ -54,7 +55,6 @@ class IProductListSerializer(serializers.ModelSerializer): need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True) is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True) remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True) - class Meta: model = IProduct fields = '__all__' diff --git a/hb_server/apps/inm/serializers2.py b/hb_server/apps/inm/serializers2.py deleted file mode 100644 index 3149e89..0000000 --- a/hb_server/apps/inm/serializers2.py +++ /dev/null @@ -1,15 +0,0 @@ -from rest_framework import serializers -from apps.inm.models import IProduct -from apps.mtm.serializers import MaterialSimpleSerializer - - -class IProductListSerializer(serializers.ModelSerializer): - material_ = MaterialSimpleSerializer(source='material', read_only=True) - warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) - need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True) - is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True) - remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True) - - class Meta: - model = IProduct - fields = '__all__' \ No newline at end of file diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index c00c178..a7d618b 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -63,7 +63,7 @@ class OrderSimpleSerializer(serializers.ModelSerializer): customer_ = CustomerSimpleSerializer(source='customer', read_only=True) class Meta: model = Order - fields = ['id', 'number', 'contract_', 'customer_', 'need_mtest'] + fields = ['id', 'number', 'contract_', 'customer_', 'need_mtest', 'delivery_date'] class SaleCreateSerializer(serializers.ModelSerializer): iproducts = serializers.PrimaryKeyRelatedField(queryset= diff --git a/hb_server/apps/system/migrations/0005_user_last_check_time.py b/hb_server/apps/system/migrations/0005_user_last_check_time.py new file mode 100644 index 0000000..284e91b --- /dev/null +++ b/hb_server/apps/system/migrations/0005_user_last_check_time.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-01-25 08:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0004_user_is_atwork'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='last_check_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='打卡时间'), + ), + ] diff --git a/hb_server/apps/system/models.py b/hb_server/apps/system/models.py index e77eae3..d69121a 100644 --- a/hb_server/apps/system/models.py +++ b/hb_server/apps/system/models.py @@ -117,6 +117,7 @@ class User(AbstractUser): 'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='上级主管') roles = models.ManyToManyField(Role, blank=True, verbose_name='角色') is_atwork = models.BooleanField('当前在岗', default=False) + last_check_time = models.DateTimeField('打卡时间', null=True, blank=True) class Meta: verbose_name = '用户信息' diff --git a/hb_server/apps/system/serializers.py b/hb_server/apps/system/serializers.py index 1e397c5..209061c 100644 --- a/hb_server/apps/system/serializers.py +++ b/hb_server/apps/system/serializers.py @@ -144,7 +144,7 @@ class UserListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializ fields = ['id', 'name', 'phone', 'email', 'position', 'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar', - 'roles_name', 'is_atwork'] + 'roles_name', 'is_atwork', 'last_check_time'] @staticmethod def setup_eager_loading(queryset): From 47804a0835d4f3b84095f26a3c9cfb12626a73d2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 08:41:03 +0800 Subject: [PATCH 06/21] =?UTF-8?q?=E8=B5=84=E6=BA=90=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=A2=9E=E5=8A=A0count=5Fsafe=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/views.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 3761ead..fcf6388 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -7,7 +7,7 @@ from apps.em.models import Equipment from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import MaterialBatch from apps.inm.serializers import MaterialBatchSerializer -from apps.mtm.models import Step, SubProduction, SubprodctionMaterial, UsedStep +from apps.mtm.models import Material, Step, SubProduction, SubprodctionMaterial 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 @@ -220,8 +220,12 @@ class ResourceViewSet(GenericViewSet): for i in rdata: # 计算输入物料 materials = SubprodctionMaterial.objects.filter(subproduction__product__id=i['id'], - subproduction__is_deleted=False, is_deleted=False, material__type__in=[3,4], type=1).order_by('material__number')\ - .values('material__id', 'material__name', 'material__number', 'material__type', 'count', 'material__count') + subproduction__is_deleted=False, is_deleted=False, + material__type__in=[Material.MA_TYPE_MAINSO, + Material.MA_TYPE_HELPSO], type= SubprodctionMaterial.SUB_MA_TYPE_IN).order_by('material__number')\ + .values('material__id', 'material__name', + 'material__number', 'material__type', + 'count', 'material__count', 'material__count_safe') l_m = list(materials) for m in l_m: if m['material__id'] in res_d_list: @@ -231,7 +235,8 @@ class ResourceViewSet(GenericViewSet): res_d_list.append(m['material__id']) res.append({'id':m['material__id'], 'name':m['material__name'], 'type':m['material__type'], 'number':m['material__number'], - 'count':m['count']*i['count'], 'inv_count':m['material__count']}) + 'count':m['count']*i['count'], 'inv_count':m['material__count'], + 'count_safe':'material__count_safe'}) return Response(res) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=ResourceCalListSerializer) From 04b864e72f48ec8de5d8af4eff94afa51e860c40 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 08:44:39 +0800 Subject: [PATCH 07/21] =?UTF-8?q?=E4=B8=8A=E4=B8=80=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index fcf6388..0fea0a7 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -236,7 +236,7 @@ class ResourceViewSet(GenericViewSet): res.append({'id':m['material__id'], 'name':m['material__name'], 'type':m['material__type'], 'number':m['material__number'], 'count':m['count']*i['count'], 'inv_count':m['material__count'], - 'count_safe':'material__count_safe'}) + 'count_safe':m['material__count_safe']}) return Response(res) @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=ResourceCalListSerializer) From 9eab3aa5921149bf843971ada4a793a892d32e9f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 09:21:23 +0800 Subject: [PATCH 08/21] =?UTF-8?q?iproduct=20list=E5=A2=9E=E5=8A=A0order=20?= =?UTF-8?q?to=5Forder=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/filters.py | 4 +- hb_server/apps/inm/serializers.py | 7 +- hb_server/apps/inm/views.py | 4 +- hb_server/apps/sam/serializers.py | 51 +-------- hb_server/apps/sam/serializers_sale.py | 51 +++++++++ hb_server/apps/sam/urls.py | 4 +- hb_server/apps/sam/views.py | 143 +------------------------ hb_server/apps/sam/views_sale.py | 142 ++++++++++++++++++++++++ 8 files changed, 214 insertions(+), 192 deletions(-) create mode 100644 hb_server/apps/sam/serializers_sale.py create mode 100644 hb_server/apps/sam/views_sale.py diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py index 41dcf61..3209136 100644 --- a/hb_server/apps/inm/filters.py +++ b/hb_server/apps/inm/filters.py @@ -3,7 +3,7 @@ from django_filters import rest_framework as filters from apps.mtm.models import Material from .models import IProduct, MaterialBatch from django.utils import timezone - +from utils.mixins import DynamicFieldsFilterMixin class MbFilterSet(filters.FilterSet): material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all()) @@ -20,7 +20,7 @@ class MbFilterSet(filters.FilterSet): return queryset -class IProductFilterSet(filters.FilterSet): +class IProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): order = filters.NumberFilter(field_name="wproduct__subproduction_plan__production_plan__order") to_order = filters.NumberFilter(field_name="wproduct__to_order") update_time_start = filters.DateFilter(field_name="update_time", lookup_expr='gte') diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 1a35e32..6f4b97a 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -3,11 +3,13 @@ from rest_framework import serializers from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory from apps.qm.models import TestRecord, TestRecordItem +from apps.sam.serializers import OrderSimpleSerializer from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer from django.db import transaction +from utils.mixins import DynamicFieldsSerializerMixin @@ -49,12 +51,15 @@ class MaterialBatchSerializer(serializers.ModelSerializer): fields = '__all__' -class IProductListSerializer(serializers.ModelSerializer): +class IProductListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True) is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True) remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True) + to_order_ = OrderSimpleSerializer(source='wproduct.to_order', read_only=True) + order_ = OrderSimpleSerializer( + source='wproduct.subproduction_plan.production_plan.order', read_only=True) class Meta: model = IProduct fields = '__all__' diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 8f20cf7..26823cb 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -187,7 +187,9 @@ class IProductViewSet(ListModelMixin, GenericViewSet): """ perms_map = {'*': '*'} queryset = IProduct.objects.select_related( - 'material', 'warehouse', 'wproduct__subproduction_plan__production_plan__order') + 'material', 'warehouse', + 'wproduct__subproduction_plan__production_plan__order', + 'wproduct__to_order') serializer_class = IProductListSerializer filterset_class = IProductFilterSet search_fields = [] diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index a7d618b..ac0e9a6 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -1,10 +1,7 @@ -from django.db import transaction -from rest_framework import exceptions, serializers -from apps.inm.models import IProduct -from apps.inm.serializers import IProductListSerializer +from rest_framework import serializers -from .models import Contract, Customer, Order, Sale, SaleProduct +from .models import Contract, Customer, Order from apps.mtm.serializers import MaterialSimpleSerializer from utils.tools import ranstr @@ -65,47 +62,3 @@ class OrderSimpleSerializer(serializers.ModelSerializer): model = Order fields = ['id', 'number', 'contract_', 'customer_', 'need_mtest', 'delivery_date'] -class SaleCreateSerializer(serializers.ModelSerializer): - iproducts = serializers.PrimaryKeyRelatedField(queryset= - IProduct.objects.all(), many=True) - class Meta: - model = Sale - fields = ['customer', 'order', 'product', 'iproducts'] - - def validate(self, attrs): - order = attrs.get('order', None) - if order: - if order.customer: - attrs['customer'] = order.customer - attrs['product'] = order.product - for i in attrs['iproducts']: - if i.material != attrs['product']: - raise exceptions.APIException('产品选取错误') - return super().validate(attrs) - - -class SaleListSerializer(serializers.ModelSerializer): - customer_ = CustomerSimpleSerializer(source='customer', read_only=True) - order_ = OrderSimpleSerializer(source='order', read_only=True) - product_ = MaterialSimpleSerializer(source='product', read_only=True) - class Meta: - model = Sale - fields = '__all__' - -class SaleProductListSerializer(serializers.ModelSerializer): - iproduct_ = IProductListSerializer(source='iproduct', read_only=True) - class Meta: - model = SaleProduct - fields = '__all__' - -class SaleProductCreateSerializer(serializers.ModelSerializer): - class Meta: - model = SaleProduct - fields = ['sale', 'iproduct'] - - def create(self, validated_data): - validated_data['number'] = validated_data['iproduct'].number - instance = SaleProduct.objects.create(**validated_data) - instance.sale.count = SaleProduct.objects.filter(sale=instance.sale).count() - instance.sale.save() - return instance \ No newline at end of file diff --git a/hb_server/apps/sam/serializers_sale.py b/hb_server/apps/sam/serializers_sale.py new file mode 100644 index 0000000..627c4f2 --- /dev/null +++ b/hb_server/apps/sam/serializers_sale.py @@ -0,0 +1,51 @@ +from rest_framework import serializers +from rest_framework import exceptions +from apps.inm.models import IProduct +from apps.inm.serializers import IProductListSerializer +from apps.mtm.serializers import MaterialSimpleSerializer +from apps.sam.models import Sale, SaleProduct +from apps.sam.serializers import CustomerSimpleSerializer, OrderSimpleSerializer +class SaleCreateSerializer(serializers.ModelSerializer): + iproducts = serializers.PrimaryKeyRelatedField(queryset= + IProduct.objects.all(), many=True) + class Meta: + model = Sale + fields = ['customer', 'order', 'product', 'iproducts'] + + def validate(self, attrs): + order = attrs.get('order', None) + if order: + if order.customer: + attrs['customer'] = order.customer + attrs['product'] = order.product + for i in attrs['iproducts']: + if i.material != attrs['product']: + raise exceptions.APIException('产品选取错误') + return super().validate(attrs) + + +class SaleListSerializer(serializers.ModelSerializer): + customer_ = CustomerSimpleSerializer(source='customer', read_only=True) + order_ = OrderSimpleSerializer(source='order', read_only=True) + product_ = MaterialSimpleSerializer(source='product', read_only=True) + class Meta: + model = Sale + fields = '__all__' + +class SaleProductListSerializer(serializers.ModelSerializer): + iproduct_ = IProductListSerializer(source='iproduct', read_only=True) + class Meta: + model = SaleProduct + fields = '__all__' + +class SaleProductCreateSerializer(serializers.ModelSerializer): + class Meta: + model = SaleProduct + fields = ['sale', 'iproduct'] + + def create(self, validated_data): + validated_data['number'] = validated_data['iproduct'].number + instance = SaleProduct.objects.create(**validated_data) + instance.sale.count = SaleProduct.objects.filter(sale=instance.sale).count() + instance.sale.save() + return instance \ No newline at end of file diff --git a/hb_server/apps/sam/urls.py b/hb_server/apps/sam/urls.py index 7a66e01..5907df0 100644 --- a/hb_server/apps/sam/urls.py +++ b/hb_server/apps/sam/urls.py @@ -1,9 +1,11 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet, SaleProductViewSet, SaleViewSet +from apps.sam.views import CustomerViewSet,ContractViewSet, OrderViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter +from apps.sam.views_sale import SaleProductViewSet, SaleViewSet + router = DefaultRouter() router.register('customer', CustomerViewSet, basename='customer') router.register('contract', ContractViewSet, basename='contract') diff --git a/hb_server/apps/sam/views.py b/hb_server/apps/sam/views.py index 357706e..ea52cb4 100644 --- a/hb_server/apps/sam/views.py +++ b/hb_server/apps/sam/views.py @@ -1,22 +1,12 @@ -from django.db import transaction -from django.db.models.aggregates import Count -from rest_framework import exceptions, serializers -from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin -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 ContractFilterSet, 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 +from apps.sam.serializers import ContractCreateUpdateSerializer, ContractSerializer, \ + CustomerCreateUpdateSerializer, CustomerSerializer, OrderCreateUpdateSerializer, OrderSerializer +from apps.sam.models import Contract, Customer, Order +from rest_framework.viewsets import ModelViewSet from apps.system.mixins import CreateUpdateCustomMixin -from django.shortcuts import render -from rest_framework.decorators import action from django.db.models import F from rest_framework.response import Response -from django.utils import timezone - -from apps.wf.models import Workflow +from rest_framework.decorators import action # Create your views here. class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet): """ @@ -81,129 +71,6 @@ class OrderViewSet(CreateUpdateCustomMixin, ModelViewSet): return Response(serializer.data) -class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet): - """ - 销售记录 - """ - perms_map = {'*': '*'} - queryset = Sale.objects.select_related('customer', 'order', 'product', 'order__contract').all() - serializer_class = SaleListSerializer - search_fields = ['customer__name', 'order__number'] - filterset_fields = ['product', 'order', 'customer'] - ordering_fields = ['create_time'] - ordering = ['-create_time'] - def get_serializer_class(self): - if self.action == 'create': - return SaleCreateSerializer - elif self.action == 'retrieve': - return SaleListSerializer - return super().get_serializer_class() - - def create(self, request, *args, **kwargs): - data = request.data - serializer = SaleCreateSerializer(data=data) - serializer.is_valid(raise_exception=True) - vdata = serializer.validated_data - with transaction.atomic(): - iproducts = vdata.pop('iproducts') - vdata['count'] = len(iproducts) - sale = Sale.objects.create(**vdata) - i_l = [] - for i in iproducts: - i_d ={} - i_d['sale'] = sale - i_d['number'] = i.number - i_d['iproduct'] = i - i_l.append(SaleProduct(**i_d)) - SaleProduct.objects.bulk_create(i_l) - return Response() - - @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) - @transaction.atomic - def audit(self, request, pk=None): - """ - 审核 - """ - obj = self.get_object() - if obj.is_audited: - raise exceptions.APIException('已审核通过') - # 创建出库记录 - fifo = FIFO() - fifo.type = FIFO.FIFO_TYPE_SALE_OUT - fifo.is_audited = True - fifo.auditor = request.user - fifo.inout_date = timezone.now() - fifo.create_by = request.user - fifo.save() - # 创建出库条目 - ips = IProduct.objects.filter(sale_iproduct__sale=obj) - items = ips.values('warehouse', 'material', 'batch').annotate(total=Count('id')) - for i in items: - warehouse = WareHouse.objects.get(id=i['warehouse']) - material = Material.objects.get(id=i['material']) - fifoitem = FIFOItem() - fifoitem.need_test = False - fifoitem.warehouse = warehouse - fifoitem.material = material - fifoitem.count = i['total'] - fifoitem.batch = i['batch'] - fifoitem.fifo = fifo - fifoitem.save() - items_p = ips.filter(warehouse=warehouse, batch=i['batch']) - ipxs = [] - for i in items_p: - # 创建出库明细半成品 - ip = {} - ip['fifoitem'] = fifoitem - ip['number'] = i.number - ip['material'] = i.material - ip['iproduct'] = i - ipxs.append(FIFOItemProduct(**ip)) - FIFOItemProduct.objects.bulk_create(ipxs) - # 更新成品库情况 - ips.update(is_saled=True) - # 更新动态产品表情况 - from apps.wpm.models import WProduct - WProduct.objects.filter(iproduct_wproduct__sale_iproduct__sale=obj).update( - act_state=WProduct.WPR_ACT_STATE_SELLED) - # 更新库存 - update_inm(fifo) - # 变更审核状态 - obj.is_audited = True - obj.save() - # 变更订单状态 - if obj.order: - order = obj.order - order.delivered_count = order.delivered_count + obj.count - order.save() - return Response() - -class SaleProductViewSet(ListModelMixin, DestroyModelMixin, CreateModelMixin, GenericViewSet): - """ - 销售记录关联产品 - """ - perms_map = {'*': '*'} - queryset = SaleProduct.objects.select_related('iproduct', 'iproduct__material', 'iproduct__warehouse').all() - serializer_class = SaleProductListSerializer - search_fields = [] - filterset_fields = ['sale', 'iproduct'] - ordering_fields = ['create_time'] - ordering = ['id'] - - def get_serializer_class(self): - if self.action == 'create': - return SaleProductCreateSerializer - return super().get_serializer_class() - - def destroy(self, request, *args, **kwargs): - obj = self.get_object() - sale = obj.sale - if sale.is_audited: - raise exceptions.APIException('该销售记录已审核,不可删除产品') - sale.count = SaleProduct.objects.filter(sale=obj.sale).count() - sale.save() - obj.delete() - return Response() \ No newline at end of file diff --git a/hb_server/apps/sam/views_sale.py b/hb_server/apps/sam/views_sale.py new file mode 100644 index 0000000..c2c81a1 --- /dev/null +++ b/hb_server/apps/sam/views_sale.py @@ -0,0 +1,142 @@ +from rest_framework.mixins import ListModelMixin, DestroyModelMixin, CreateModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet +from rest_framework.response import Response +from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, WareHouse +from apps.mtm.models import Material +from apps.sam.models import Sale, SaleProduct +from apps.sam.serializers_sale import SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer +from rest_framework import exceptions +from django.db import transaction +from rest_framework.decorators import action +from django.utils import timezone + +from apps.system.mixins import CreateUpdateModelAMixin +from apps.inm.signals import update_inm +from rest_framework import serializers + +class SaleViewSet(CreateUpdateModelAMixin, ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet): + """ + 销售记录 + """ + perms_map = {'*': '*'} + queryset = Sale.objects.select_related('customer', 'order', 'product', 'order__contract').all() + serializer_class = SaleListSerializer + search_fields = ['customer__name', 'order__number'] + filterset_fields = ['product', 'order', 'customer'] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + + def get_serializer_class(self): + if self.action == 'create': + return SaleCreateSerializer + elif self.action == 'retrieve': + return SaleListSerializer + return super().get_serializer_class() + + def create(self, request, *args, **kwargs): + data = request.data + serializer = SaleCreateSerializer(data=data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + with transaction.atomic(): + iproducts = vdata.pop('iproducts') + vdata['count'] = len(iproducts) + sale = Sale.objects.create(**vdata) + i_l = [] + for i in iproducts: + i_d ={} + i_d['sale'] = sale + i_d['number'] = i.number + i_d['iproduct'] = i + i_l.append(SaleProduct(**i_d)) + SaleProduct.objects.bulk_create(i_l) + return Response() + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) + @transaction.atomic + def audit(self, request, pk=None): + """ + 审核 + """ + obj = self.get_object() + if obj.is_audited: + raise exceptions.APIException('已审核通过') + # 创建出库记录 + fifo = FIFO() + fifo.type = FIFO.FIFO_TYPE_SALE_OUT + fifo.is_audited = True + fifo.auditor = request.user + fifo.inout_date = timezone.now() + fifo.create_by = request.user + fifo.save() + # 创建出库条目 + ips = IProduct.objects.filter(sale_iproduct__sale=obj) + items = ips.values('warehouse', 'material', 'batch').annotate(total=Count('id')) + for i in items: + warehouse = WareHouse.objects.get(id=i['warehouse']) + material = Material.objects.get(id=i['material']) + fifoitem = FIFOItem() + fifoitem.need_test = False + fifoitem.warehouse = warehouse + fifoitem.material = material + fifoitem.count = i['total'] + fifoitem.batch = i['batch'] + fifoitem.fifo = fifo + fifoitem.save() + items_p = ips.filter(warehouse=warehouse, batch=i['batch']) + ipxs = [] + for i in items_p: + # 创建出库明细半成品 + ip = {} + ip['fifoitem'] = fifoitem + ip['number'] = i.number + ip['material'] = i.material + ip['iproduct'] = i + ipxs.append(FIFOItemProduct(**ip)) + FIFOItemProduct.objects.bulk_create(ipxs) + # 更新成品库情况 + ips.update(is_saled=True) + # 更新动态产品表情况 + from apps.wpm.models import WProduct + WProduct.objects.filter(iproduct_wproduct__sale_iproduct__sale=obj).update( + act_state=WProduct.WPR_ACT_STATE_SELLED) + # 更新库存 + update_inm(fifo) + # 变更审核状态 + obj.is_audited = True + obj.save() + # 变更订单状态 + if obj.order: + order = obj.order + order.delivered_count = order.delivered_count + obj.count + order.save() + return Response() + + + +class SaleProductViewSet(ListModelMixin, DestroyModelMixin, CreateModelMixin, GenericViewSet): + """ + 销售记录关联产品 + """ + perms_map = {'*': '*'} + queryset = SaleProduct.objects.select_related('iproduct', 'iproduct__material', 'iproduct__warehouse').all() + serializer_class = SaleProductListSerializer + search_fields = [] + filterset_fields = ['sale', 'iproduct'] + ordering_fields = ['create_time'] + ordering = ['id'] + + def get_serializer_class(self): + if self.action == 'create': + return SaleProductCreateSerializer + return super().get_serializer_class() + + def destroy(self, request, *args, **kwargs): + obj = self.get_object() + sale = obj.sale + if sale.is_audited: + raise exceptions.APIException('该销售记录已审核,不可删除产品') + sale.count = SaleProduct.objects.filter(sale=obj.sale).count() + sale.save() + obj.delete() + return Response() \ No newline at end of file From 850c18ba5f425481181af59e863a56731ea7da2e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 09:55:42 +0800 Subject: [PATCH 09/21] fit json render bug --- hb_server/utils/response.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hb_server/utils/response.py b/hb_server/utils/response.py index 0411547..864862c 100644 --- a/hb_server/utils/response.py +++ b/hb_server/utils/response.py @@ -48,11 +48,13 @@ class FitJSONRenderer(JSONRenderer): response_body = BaseResponse() response = renderer_context.get("response") status_code = response.status_code # Http状态异常码 + print(status_code) if status_code >= 400: # 如果http响应异常 if isinstance(data, dict) and 'code' in data: # 如果自定义了异常码 response_body = data else: response_body.data = data # data里是详细异常信息 + response_body.code = status_code prefix = "" if isinstance(data, dict): prefix = list(data.keys())[0] From c6080849d741049700bf416b8fe165028be31557 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 10:27:22 +0800 Subject: [PATCH 10/21] =?UTF-8?q?iproduct=E5=A2=9E=E5=8A=A0need=5Fto=5Ford?= =?UTF-8?q?er=E7=AD=9B=E9=80=89=EF=BC=9Bpm=E5=A2=9E=E5=8A=A0near=5Fdone?= =?UTF-8?q?=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/filters.py | 4 +++- hb_server/apps/pm/filters.py | 14 ++++++++++++-- hb_server/apps/sam/filters.py | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py index 3209136..cba2735 100644 --- a/hb_server/apps/inm/filters.py +++ b/hb_server/apps/inm/filters.py @@ -23,9 +23,11 @@ class MbFilterSet(filters.FilterSet): class IProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): order = filters.NumberFilter(field_name="wproduct__subproduction_plan__production_plan__order") to_order = filters.NumberFilter(field_name="wproduct__to_order") + need_to_order = filters.BooleanFilter() update_time_start = filters.DateFilter(field_name="update_time", lookup_expr='gte') update_time_end = filters.DateFilter(field_name="update_time", lookup_expr='lte') class Meta: model = IProduct fields = ['material', 'warehouse', 'batch', 'order', 'material__type', - 'is_saled', 'update_time_start', 'update_time_end', 'to_order'] + 'is_saled', 'update_time_start', 'update_time_end', + 'to_order', 'need_to_order'] diff --git a/hb_server/apps/pm/filters.py b/hb_server/apps/pm/filters.py index f530238..fb5367b 100644 --- a/hb_server/apps/pm/filters.py +++ b/hb_server/apps/pm/filters.py @@ -2,8 +2,9 @@ from django_filters import rest_framework as filters from apps.mtm.models import Material, Step from apps.pm.models import ProductionPlan, SubProductionProgress from apps.wpm.models import Operation, WProduct - +from datetime import * from apps.wpm.services import WpmServies +from django.db.models import F class PlanFilterSet(filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') @@ -15,10 +16,19 @@ class PlanFilterSet(filters.FilterSet): fields = ['product', 'order', 'create_time_start', 'create_time_end'] def filter_tag(self, queryset, name, value): + now = datetime.now() + day7_after = now + timedelta(days=7) if value == 'planed': queryset = queryset.filter(is_planed=True) elif value == 'working': - queryset = queryset.exclude(state__in=[ProductionPlan.PLAN_STATE_DONE, ProductionPlan.PLAN_MTEST_DONE]) + queryset = queryset.exclude(state__in=[ProductionPlan.PLAN_STATE_DONE, + ProductionPlan.PLAN_MTEST_DONE]) + elif value == 'near_done': + queryset = queryset.filter(count_ok__lt=F('count'), + end_date__lte = datetime.date(day7_after)) + elif value == 'out_done': + queryset = queryset.filter(count_ok__lt=F('count'), + end_date__gt = datetime.date(now)) return queryset def filter_material(self, queryset, name, value): diff --git a/hb_server/apps/sam/filters.py b/hb_server/apps/sam/filters.py index a0c3626..5af1a57 100644 --- a/hb_server/apps/sam/filters.py +++ b/hb_server/apps/sam/filters.py @@ -23,8 +23,9 @@ class OrderFilterSet(filters.FilterSet): plan_order__subplan_plan__progress_subplan__material__id=value).distinct() def filter_tag(self, queryset, name, value): + now = datetime.now() + day7_after = now + timedelta(days=7) if value == 'near_delivery': - day7_after = datetime.now() + timedelta(days=7) queryset = queryset.filter(delivered_count__lt=F('count'), delivery_date__lte = datetime.date(day7_after)) elif value == 'out_delivery': From f075b119eed95b01e03f31ddbee6eff8bc7edfa6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 10:32:32 +0800 Subject: [PATCH 11/21] =?UTF-8?q?iproduct=20need=5Fto=5Forder=E7=AD=9B?= =?UTF-8?q?=E9=80=89bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/em/filters.py | 0 hb_server/apps/inm/filters.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 hb_server/apps/em/filters.py diff --git a/hb_server/apps/em/filters.py b/hb_server/apps/em/filters.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py index cba2735..50c1548 100644 --- a/hb_server/apps/inm/filters.py +++ b/hb_server/apps/inm/filters.py @@ -23,7 +23,7 @@ class MbFilterSet(filters.FilterSet): class IProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): order = filters.NumberFilter(field_name="wproduct__subproduction_plan__production_plan__order") to_order = filters.NumberFilter(field_name="wproduct__to_order") - need_to_order = filters.BooleanFilter() + need_to_order = filters.BooleanFilter(field_name="wproduct__need_to_order") update_time_start = filters.DateFilter(field_name="update_time", lookup_expr='gte') update_time_end = filters.DateFilter(field_name="update_time", lookup_expr='lte') class Meta: From a2c025cdf22ddffa3047b81dd886423749993b86 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 10:37:00 +0800 Subject: [PATCH 12/21] =?UTF-8?q?=E4=BA=BA=E8=84=B8=E8=AF=86=E5=88=ABbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/hrm/services.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/hrm/services.py b/hb_server/apps/hrm/services.py index 8cfb277..7f7334b 100644 --- a/hb_server/apps/hrm/services.py +++ b/hb_server/apps/hrm/services.py @@ -28,8 +28,11 @@ class HRMService: face_users = cache.get('face_users') if face_datas is None: update_all_user_facedata_cache() - - results = face_recognition.compare_faces(face_datas, unknown_face_encoding, tolerance=0.5) + try: + results = face_recognition.compare_faces(face_datas, + unknown_face_encoding, tolerance=0.5) + except: + return None, '识别失败' for index, value in enumerate(results): if value: # 识别成功 From 0955a208cfe6d55ce0bbd2e0f7177213a621ec4e Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 11:06:23 +0800 Subject: [PATCH 13/21] =?UTF-8?q?=E5=9C=A8=E9=9C=80=E8=A6=81=E7=9A=84list?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/em/filters.py | 24 ++++++++++++++++++++++++ hb_server/apps/em/serializers.py | 4 +++- hb_server/apps/em/views.py | 3 ++- hb_server/apps/inm/filters.py | 2 +- hb_server/apps/inm/serializers.py | 2 +- hb_server/apps/mtm/filters.py | 3 ++- hb_server/apps/mtm/serializers.py | 4 +++- hb_server/apps/pm/filters.py | 4 +++- hb_server/apps/pm/serializers.py | 3 ++- hb_server/apps/sam/filters.py | 4 +++- hb_server/apps/sam/serializers.py | 4 +++- 11 files changed, 47 insertions(+), 10 deletions(-) diff --git a/hb_server/apps/em/filters.py b/hb_server/apps/em/filters.py index e69de29..39fd93c 100644 --- a/hb_server/apps/em/filters.py +++ b/hb_server/apps/em/filters.py @@ -0,0 +1,24 @@ +from django_filters import rest_framework as filters + +from apps.em.models import Equipment +from datetime import * + +from utils.mixins import DynamicFieldsFilterMixin + + +class EquipFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): + tag = filters.CharFilter(method='filter_tag') + class Meta: + model = Equipment + fields = ['keeper', 'type', 'tag'] + + def filter_tag(self, queryset, name, value): + now = datetime.now() + day7_after = now + timedelta(days=7) + if value == 'near_check': + queryset = queryset.filter( + next_check_date__lte = datetime.date(day7_after)) + elif value == 'out_check': + queryset = queryset.filter( + next_check_date__gt = datetime.date(now)) + return queryset \ No newline at end of file diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py index 5398909..614528f 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -2,11 +2,13 @@ from apps.mtm.models import Step from rest_framework import serializers from rest_framework.serializers import ModelSerializer from rest_framework import exceptions + +from utils.mixins import DynamicFieldsSerializerMixin from .models import Equipment, ECheckRecord from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer -class EquipmentListSerializer(ModelSerializer): +class EquipmentListSerializer(DynamicFieldsSerializerMixin, ModelSerializer): keeper_ = UserSimpleSerializer(source='keeper', read_only=True) step_ = serializers.SerializerMethodField() class Meta: diff --git a/hb_server/apps/em/views.py b/hb_server/apps/em/views.py index aec05f7..4357479 100644 --- a/hb_server/apps/em/views.py +++ b/hb_server/apps/em/views.py @@ -7,6 +7,7 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, ListModelMixin, DestroyModelMixin from rest_framework import serializers, status from rest_framework.response import Response +from apps.em.filters import EquipFilterSet from apps.em.models import Equipment, ECheckRecord from apps.em.serializers import DaqCreateSerializer, EChcekRecordCreateSerializer, ECheckRecordListSerializer, \ EquipmentCreateUpdateSerializer, EquipmentListSerializer @@ -26,7 +27,7 @@ class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet) queryset = Equipment.objects.all() serializer_class = EquipmentListSerializer search_fields = ['number', 'name','description'] - filterset_fields = ['keeper', 'type'] + filterset_class = EquipFilterSet ordering_fields = ['create_time'] ordering = ['-create_time'] diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py index 50c1548..7f16ac4 100644 --- a/hb_server/apps/inm/filters.py +++ b/hb_server/apps/inm/filters.py @@ -5,7 +5,7 @@ from .models import IProduct, MaterialBatch from django.utils import timezone from utils.mixins import DynamicFieldsFilterMixin -class MbFilterSet(filters.FilterSet): +class MbFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all()) tag = filters.CharFilter(method="filter_tag") diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 6f4b97a..858c06d 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -42,7 +42,7 @@ class InventorySerializer(serializers.ModelSerializer): fields = '__all__' -class MaterialBatchSerializer(serializers.ModelSerializer): +class MaterialBatchSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) diff --git a/hb_server/apps/mtm/filters.py b/hb_server/apps/mtm/filters.py index 8eb6b52..723345a 100644 --- a/hb_server/apps/mtm/filters.py +++ b/hb_server/apps/mtm/filters.py @@ -1,6 +1,7 @@ from django.db.models.expressions import F from django_filters import rest_framework as filters from apps.mtm.models import Material, TechDoc +from utils.mixins import DynamicFieldsFilterMixin @@ -15,7 +16,7 @@ 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): +class MaterialFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): tag = filters.CharFilter(method='filter_tag') class Meta: model = Material diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 99cdfb6..538e70f 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -1,11 +1,13 @@ from apps.em.serializers import EquipmentSimpleSerializer from rest_framework import serializers from rest_framework.exceptions import ParseError, ValidationError + +from utils.mixins import DynamicFieldsSerializerMixin from .models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer -class MaterialSerializer(serializers.ModelSerializer): +class MaterialSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer): class Meta: model = Material fields = '__all__' diff --git a/hb_server/apps/pm/filters.py b/hb_server/apps/pm/filters.py index fb5367b..aa9c6da 100644 --- a/hb_server/apps/pm/filters.py +++ b/hb_server/apps/pm/filters.py @@ -6,7 +6,9 @@ from datetime import * from apps.wpm.services import WpmServies from django.db.models import F -class PlanFilterSet(filters.FilterSet): +from utils.mixins import DynamicFieldsFilterMixin + +class PlanFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') tag = filters.CharFilter(method='filter_tag') diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index b3bfb7a..a77694f 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -3,6 +3,7 @@ from rest_framework import serializers from apps.sam.serializers import OrderSerializer, OrderSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, SubProductionSimpleSerializer from apps.system.serializers import OrganizationSimpleSerializer +from utils.mixins import DynamicFieldsSerializerMixin class ProductionPlanCreateFromOrderSerializer(serializers.ModelSerializer): @@ -10,7 +11,7 @@ class ProductionPlanCreateFromOrderSerializer(serializers.ModelSerializer): model = ProductionPlan fields = ['order', 'count', 'start_date', 'end_date'] -class ProductionPlanSerializer(serializers.ModelSerializer): +class ProductionPlanSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer): order_ = OrderSimpleSerializer(source='order', read_only=True) product_ = MaterialSimpleSerializer(source='product', read_only=True) class Meta: diff --git a/hb_server/apps/sam/filters.py b/hb_server/apps/sam/filters.py index 5af1a57..c1b7607 100644 --- a/hb_server/apps/sam/filters.py +++ b/hb_server/apps/sam/filters.py @@ -4,8 +4,10 @@ from apps.sam.models import Order from django.db.models import F from datetime import datetime, timedelta +from utils.mixins import DynamicFieldsFilterMixin -class OrderFilterSet(filters.FilterSet): + +class OrderFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') material = filters.NumberFilter(method='filter_material') diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index ac0e9a6..4aeaeb9 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -1,6 +1,8 @@ from rest_framework import serializers +from utils.mixins import DynamicFieldsSerializerMixin + from .models import Contract, Customer, Order from apps.mtm.serializers import MaterialSimpleSerializer @@ -47,7 +49,7 @@ class OrderCreateUpdateSerializer(serializers.ModelSerializer): validated_data['number'] = 'DD' + ranstr(7) return super().create(validated_data) -class OrderSerializer(serializers.ModelSerializer): +class OrderSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer): contract_ = ContractSimpleSerializer(source='contract', read_only=True) customer_ = CustomerSimpleSerializer(source='customer', read_only=True) product_ = MaterialSimpleSerializer(source='product', read_only=True) From 4139ef91c302970b2e4680c374bf00d3b25e797a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 11:11:56 +0800 Subject: [PATCH 14/21] =?UTF-8?q?need=5Fto=5Forder=20=E6=8E=A5=E5=8F=A3ser?= =?UTF-8?q?ializer=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/serializers.py | 5 ++++- hb_server/apps/wpm/views.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index cf7ca24..9636c0f 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -574,4 +574,7 @@ class WproductMtestSerializer(serializers.ModelSerializer): class WproductToOrderSerializer(serializers.Serializer): wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), many=True) - order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all()) \ No newline at end of file + order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all()) + +class WproductNeedToOrderSerializer(serializers.Serializer): + wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), many=True) \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 923dd09..630baba 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -26,7 +26,7 @@ from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerial OperationListSerializer, OperationWproductUpdateSerializer, PickHalfsSerializer, \ PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, \ WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, \ - WpmTestFormInitSerializer, WproductMtestSerializer, WproductPutInSerializer, \ + WpmTestFormInitSerializer, WproductMtestSerializer, WproductNeedToOrderSerializer, WproductPutInSerializer, \ WproductPutInsSerializer, WproductTicketListSerializer, WproductToOrderSerializer from rest_framework.response import Response @@ -441,13 +441,13 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): ret.append([str(index + 1), item['step_name'], item['actions']]) return Response(ret) - @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproductToOrderSerializer) + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproductNeedToOrderSerializer) @transaction.atomic def need_to_order(self, request, pk=None): """ 设为需要指派订单 """ - serializer = WproductToOrderSerializer(data=request.data) + serializer = WproductNeedToOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data wps = WProduct.objects.filter(id__in = [i.id for i in vdata.get('wproducts')]) From a5494e8509bd5288a04e5b33dd350077e88a508b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 13:52:14 +0800 Subject: [PATCH 15/21] =?UTF-8?q?employee=E5=AD=97=E6=AE=B5=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/hrm/filters.py | 11 +++++- .../hrm/migrations/0005_auto_20220126_1351.py | 37 +++++++++++++++++++ hb_server/apps/hrm/models.py | 15 ++++---- hb_server/apps/hrm/serializers.py | 8 +++- hb_server/apps/hrm/views.py | 3 +- 5 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 hb_server/apps/hrm/migrations/0005_auto_20220126_1351.py diff --git a/hb_server/apps/hrm/filters.py b/hb_server/apps/hrm/filters.py index 40c9b45..8ec72fe 100644 --- a/hb_server/apps/hrm/filters.py +++ b/hb_server/apps/hrm/filters.py @@ -1,9 +1,16 @@ from django_filters import rest_framework as filters -from apps.hrm.models import ClockRecord +from apps.hrm.models import ClockRecord, Employee +from utils.mixins import DynamicFieldsFilterMixin class ClockRecordFilterSet(filters.FilterSet): create_time_start = filters.DateFilter(field_name="create_time", lookup_expr='gte') create_time_end = filters.DateFilter(field_name="create_time", lookup_expr='lte') class Meta: model = ClockRecord - fields = ['create_by', 'create_time_start', 'create_time_end'] \ No newline at end of file + fields = ['create_by', 'create_time_start', 'create_time_end'] + +class EmployeeFilterSet(DynamicFieldsFilterMixin, filters.FilterSet): + + class Meta: + model = Employee + fields = ['job_state'] \ No newline at end of file diff --git a/hb_server/apps/hrm/migrations/0005_auto_20220126_1351.py b/hb_server/apps/hrm/migrations/0005_auto_20220126_1351.py new file mode 100644 index 0000000..d6bd2c3 --- /dev/null +++ b/hb_server/apps/hrm/migrations/0005_auto_20220126_1351.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.9 on 2022-01-26 05:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('hrm', '0004_clockrecord'), + ] + + operations = [ + migrations.RenameField( + model_name='employee', + old_name='birthdate', + new_name='birthday', + ), + migrations.RenameField( + model_name='employee', + old_name='ID_number', + new_name='id_number', + ), + migrations.RenameField( + model_name='employee', + old_name='jobstate', + new_name='job_state', + ), + migrations.RenameField( + model_name='employee', + old_name='academic', + new_name='qualification', + ), + migrations.RemoveField( + model_name='employee', + name='job', + ), + ] diff --git a/hb_server/apps/hrm/models.py b/hb_server/apps/hrm/models.py index 490237e..219caea 100644 --- a/hb_server/apps/hrm/models.py +++ b/hb_server/apps/hrm/models.py @@ -14,20 +14,21 @@ class Employee(CommonAModel): """ 员工信息 """ + JOB_ON = 1 + JOB_OFF = 2 jobstate_choices = ( - (1, '在职'), - (2, '离职'), + (JOB_ON, '在职'), + (JOB_OFF, '离职'), ) user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee_user') number = models.CharField('人员编号', max_length=50,null=True, blank=True, unique=True) photo = models.CharField('证件照', max_length=1000, null=True, blank=True) - ID_number = models.CharField('身份证号', max_length=100, null=True, blank=True) + id_number = models.CharField('身份证号', max_length=100, null=True, blank=True) gender = models.CharField('性别', max_length=10, default='男') signature = models.CharField('签名图片', max_length=200, null=True, blank=True) - birthdate = models.DateField('出生年月', null=True, blank=True) - academic = models.CharField('学历', max_length=50, null=True, blank=True) - jobstate = models.IntegerField('在职状态', choices=jobstate_choices, default=1) - job = models.ForeignKey(Position, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='岗位') + birthday = models.DateField('出生年月', null=True, blank=True) + qualification = models.CharField('学历', max_length=50, null=True, blank=True) + job_state = models.IntegerField('在职状态', choices=jobstate_choices, default=1) face_data = models.JSONField('人脸识别数据', null=True, blank=True) class Meta: verbose_name = '员工补充信息' diff --git a/hb_server/apps/hrm/serializers.py b/hb_server/apps/hrm/serializers.py index 31eb30d..4f70427 100644 --- a/hb_server/apps/hrm/serializers.py +++ b/hb_server/apps/hrm/serializers.py @@ -1,11 +1,15 @@ from apps.system.models import User from rest_framework.serializers import ModelSerializer from rest_framework import serializers + +from utils.mixins import DynamicFieldsSerializerMixin from .models import ClockRecord, Employee -from apps.system.serializers import UserListSerializer, UserSimpleSerializer +from apps.system.serializers import OrganizationSimpleSerializer, UserListSerializer, UserSimpleSerializer from django.db.models.query import Prefetch -class EmployeeSerializer(ModelSerializer): +class EmployeeSerializer(DynamicFieldsSerializerMixin, ModelSerializer): + name = serializers.CharField(source='user.name', read_only=True) + dept_ = OrganizationSimpleSerializer(source='user.dept_', read_only=True) class Meta: model = Employee exclude = ['face_data'] diff --git a/hb_server/apps/hrm/views.py b/hb_server/apps/hrm/views.py index e3d86b5..61fb2f4 100644 --- a/hb_server/apps/hrm/views.py +++ b/hb_server/apps/hrm/views.py @@ -4,7 +4,7 @@ from django.utils import timezone from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.mixins import UpdateModelMixin, RetrieveModelMixin, CreateModelMixin, ListModelMixin -from apps.hrm.filters import ClockRecordFilterSet +from apps.hrm.filters import ClockRecordFilterSet, EmployeeFilterSet from apps.hrm.services import HRMService from apps.hrm.tasks import update_all_user_facedata_cache from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin @@ -30,6 +30,7 @@ class EmployeeViewSet(CreateUpdateModelAMixin, OptimizationMixin, UpdateModelMix """ perms_map = {'get': '*', 'put': 'employee_update'} queryset = Employee.objects.all() + filterset_class = EmployeeFilterSet serializer_class = EmployeeSerializer ordering = ['-pk'] From 16fb06f646837f788201e7c72456caf65a0626ea Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 13:55:55 +0800 Subject: [PATCH 16/21] wpm mtest bug --- hb_server/apps/wpm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 630baba..9c8b2aa 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -399,7 +399,7 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): 军检 """ obj = self.get_object() - if obj.is_mtestok is None: + if obj.is_mtestok is not None: raise exceptions.APIException('已进行军检') if obj.material.type != Material.MA_TYPE_GOOD: raise exceptions.APIException('军检必须是成品') From 1b5b0a5032fac27e262abcefef5f91ea17a0713b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 26 Jan 2022 13:57:48 +0800 Subject: [PATCH 17/21] wpm mtest bug --- hb_server/apps/wpm/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 9c8b2aa..d9c24f4 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -409,6 +409,7 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): if is_mtestok: WpmServies.update_plan_state_by_mtestok( obj.subproduction_plan.production_plan) + obj.update_by = request.user obj.save() change_str = 'mtest_notok' if is_mtestok: From 09f1937474aac39585db8ca6aff044696aba2e14 Mon Sep 17 00:00:00 2001 From: shijing Date: Wed, 26 Jan 2022 14:00:12 +0800 Subject: [PATCH 18/21] searchshiftandaddtwowarnings --- hb_client/src/App.vue | 3 + .../Gantt/components/dashLeftMenu.vue | 6 +- hb_client/src/components/Gantt/dashGantt.vue | 9 +- hb_client/src/views/dashboard/index.vue | 345 ++++++++++-------- 4 files changed, 199 insertions(+), 164 deletions(-) diff --git a/hb_client/src/App.vue b/hb_client/src/App.vue index 1698488..3e65971 100644 --- a/hb_client/src/App.vue +++ b/hb_client/src/App.vue @@ -63,4 +63,7 @@ export default { .overFlowShow .el-tabs__content{ overflow: visible; } + #warningTabs .el-tabs__item{ + padding: 0 10px!important; + } diff --git a/hb_client/src/components/Gantt/components/dashLeftMenu.vue b/hb_client/src/components/Gantt/components/dashLeftMenu.vue index 9014840..2df8e74 100644 --- a/hb_client/src/components/Gantt/components/dashLeftMenu.vue +++ b/hb_client/src/components/Gantt/components/dashLeftMenu.vue @@ -19,14 +19,12 @@ @expand-change="handlerExpand" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" > - + - + - - diff --git a/hb_client/src/components/Gantt/dashGantt.vue b/hb_client/src/components/Gantt/dashGantt.vue index 9bb04ed..4947167 100644 --- a/hb_client/src/components/Gantt/dashGantt.vue +++ b/hb_client/src/components/Gantt/dashGantt.vue @@ -255,11 +255,11 @@ {{ currentProjectMsg.allTime }}天
- 当前进度: + 订单计划: {{ currentProjectMsg.per }}
- 合格数量: + 当前进度: {{ currentProjectMsg.per1 }}
@@ -1389,8 +1389,9 @@ .searchWrap{ position: absolute; z-index: 2000; - top: -38px; - display: flex + top: -35px; + right: 10px; + display: flex; } #searchWrap .el-range-editor--medium.el-input__inner{ height: 30px!important; diff --git a/hb_client/src/views/dashboard/index.vue b/hb_client/src/views/dashboard/index.vue index a5cb9e0..cc88406 100644 --- a/hb_client/src/views/dashboard/index.vue +++ b/hb_client/src/views/dashboard/index.vue @@ -86,22 +86,11 @@
- - +
+
任务进度
- - - -
- 成品率 -
-
- - - -
-
- - -
-
- - -
-
- 本周 -
-
本月 -
-
三个月 -
-
-
+
+
+
+ 成品率 +
+
+ +
- - +
+
-
+
生产设备 + + +
- +
@@ -222,8 +203,11 @@
-
+
人员到岗 + + +
-
+
提醒 + + +
+ @tab-click="activeNameClick" id="warningTabs">
    -
  • +
  • - {{item.name}}({{item.unit}})剩余{{item.count}},低于安全库存{{item.count_safe}} + {{item.name}}({{item.unit}})低于安全库存
@@ -307,9 +294,9 @@
    -
  • +
  • - {{item.name}}({{item.number}}){{item.delivery_date}}到交货日期 + {{item.name}}({{item.number}}){{item.delivery_date}}为交货日期
@@ -317,13 +304,39 @@
    -
  • +
  • {{item.name}}({{item.number}}){{item.delivery_date}}到期
+ +
    +
  • +
    + {{item.name}}({{item.number}}) + 接近校准日期 + 已过校准日期 +
    +
  • +
+
+ +
    +
  • +
    + {{item.name}}({{item.number}}) + 接近计划日期 + 已过计划日期 +
    +
  • +
+
@@ -331,7 +344,6 @@
-