From 20a89f3d3f4fd9b5b84b5776dd85548d32b62a79 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 6 Sep 2021 17:04:19 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/.gitignore | 3 +- hb_server/apps/inm/models.py | 28 +++++++++++- hb_server/apps/mtm/migrations/0009_techdoc.py | 38 ++++++++++++++++ hb_server/apps/mtm/models.py | 15 +++++++ hb_server/apps/mtm/serializers.py | 18 +++++++- hb_server/apps/mtm/urls.py | 3 +- hb_server/apps/mtm/views.py | 23 ++++++++-- hb_server/apps/system/serializers.py | 4 ++ hb_server/apps/system/urls.py | 5 ++- hb_server/apps/system/views.py | 45 ++++++++++++++++++- hb_server/requirements.txt | 1 + 11 files changed, 173 insertions(+), 10 deletions(-) create mode 100644 hb_server/apps/mtm/migrations/0009_techdoc.py diff --git a/hb_server/.gitignore b/hb_server/.gitignore index 25ee7a4..8322a3e 100644 --- a/hb_server/.gitignore +++ b/hb_server/.gitignore @@ -10,4 +10,5 @@ celerybeat.pid celerybeat-schedule.bak celerybeat-schedule.dat celerybeat-schedule.dir -db.sqlite3 \ No newline at end of file +db.sqlite3 +temp/ \ No newline at end of file diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 246fd5d..fa3fc91 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -5,6 +5,7 @@ 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 +from apps.mtm.models import Material @@ -20,4 +21,29 @@ class WareHouse(CommonAModel): verbose_name_plural = verbose_name def __str__(self): - return self.name \ No newline at end of file + return self.name + +class Inventory(CommonAModel): + """ + 库存表 + """ + material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息') + count = models.IntegerField('数量', default=0) + warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') + class Meta: + verbose_name = '库存表' + verbose_name_plural = verbose_name + + + +class FIFO(CommonAModel): + """ + 出入库记录 + """ + type_choices = ( + (1, '生产领料'), + (2, '销售提货'), + (3, '采购入库'), + (4, '生产入库') + ) + type = models.IntegerField('出入库类型', default=1) \ No newline at end of file diff --git a/hb_server/apps/mtm/migrations/0009_techdoc.py b/hb_server/apps/mtm/migrations/0009_techdoc.py new file mode 100644 index 0000000..f3a986b --- /dev/null +++ b/hb_server/apps/mtm/migrations/0009_techdoc.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.6 on 2021-09-06 08:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0003_auto_20210812_0909'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0008_auto_20210901_1620'), + ] + + operations = [ + migrations.CreateModel( + name='TechDoc', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=50, verbose_name='名称')), + ('content', models.TextField(blank=True, null=True, verbose_name='内容')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='techdoc_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.file', verbose_name='技术文件')), + ('process', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='关联工序')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联产品')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='techdoc_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '技术文件', + 'verbose_name_plural': '技术文件', + }, + ), + ] diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index 7896ac0..f38b152 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -174,3 +174,18 @@ class UsedStep(CommonAModel): class Meta: verbose_name = '产品生产子工序' verbose_name_plural = verbose_name + + +class TechDoc(CommonAModel): + """ + 技术文件 + """ + name = models.CharField('名称', max_length=50) + file = models.ForeignKey(File, verbose_name='技术文件', on_delete=models.CASCADE) + product = models.ForeignKey(Material, verbose_name='关联产品', on_delete=models.CASCADE) + process = models.ForeignKey(Process, verbose_name='关联工序', on_delete=models.CASCADE) + content = models.TextField('内容', null=True, blank=True) + + class Meta: + verbose_name = '技术文件' + verbose_name_plural = verbose_name diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 428af15..85d8577 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -1,7 +1,7 @@ from apps.em.serializers import EquipmentSerializer, EquipmentSimpleSerializer from rest_framework import serializers from rest_framework.exceptions import ValidationError -from .models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, RecordForm, RecordFormField, Step, UsedStep +from .models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, RecordForm, RecordFormField, Step, TechDoc, UsedStep from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer @@ -187,3 +187,19 @@ class RecordFormFieldSimpleSerializer(serializers.ModelSerializer): class Meta: model = RecordFormField fields = '__all__' + +class TechDocListSerializer(serializers.ModelSerializer): + file_ = FileSimpleSerializer(source='file', read_only=True) + class Meta: + model = TechDoc + exclude = ['content'] + +class TechDocCreateSerializer(serializers.ModelSerializer): + class Meta: + model = TechDoc + fields = ['file', 'product', 'process', 'name', 'content'] + +class TechDocUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = TechDoc + fields = ['file', 'name', 'content'] diff --git a/hb_server/apps/mtm/urls.py b/hb_server/apps/mtm/urls.py index db52c29..7048bc5 100644 --- a/hb_server/apps/mtm/urls.py +++ b/hb_server/apps/mtm/urls.py @@ -1,6 +1,6 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OutputMaterialViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, UsedStepViewSet +from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OutputMaterialViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, TechDocViewSet, UsedStepViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -14,6 +14,7 @@ router.register('outputmaterial', OutputMaterialViewSet, basename='outputmateria router.register('usedstep', UsedStepViewSet, basename='usedstep') router.register('recordform', RecordFormViewSet, basename='recordform') router.register('recordform-field', RecordFormFieldViewSet, basename='recordform-field') +router.register('techdoc', TechDocViewSet, basename='techdoc') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index d9c9eaf..a893777 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -2,8 +2,8 @@ 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.models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, RecordForm, RecordFormField, Step, UsedStep -from apps.mtm.serializers import InputMaterialListSerializer, InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OutputMaterialListSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProductProcessListSerializer, ProductProcessUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, UsedStepCreateSerializer, UsedStepListSerializer +from apps.mtm.models import InputMaterial, Material, OutputMaterial, Process, ProductProcess, RecordForm, RecordFormField, Step, TechDoc, UsedStep +from apps.mtm.serializers import InputMaterialListSerializer, InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OutputMaterialListSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProductProcessListSerializer, ProductProcessUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -181,4 +181,21 @@ class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelVi return RecordFormFieldCreateSerializer elif self.action == 'update': return RecordFormFieldUpdateSerializer - return RecordFormFieldSerializer \ No newline at end of file + return RecordFormFieldSerializer + +class TechDocViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet): + """ + 技术文件增删改查 + """ + perms_map = {'*':'*'} + queryset = TechDoc.objects.all() + filterset_fields = ['process', 'product'] + search_fields = ['name'] + ordering = ['-id'] + + def get_serializer_class(self): + if self.action =='create': + return TechDocCreateSerializer + elif self.action == 'update': + return TechDocUpdateSerializer + return TechDocListSerializer \ No newline at end of file diff --git a/hb_server/apps/system/serializers.py b/hb_server/apps/system/serializers.py index a474a42..a39e88b 100644 --- a/hb_server/apps/system/serializers.py +++ b/hb_server/apps/system/serializers.py @@ -197,3 +197,7 @@ class UserCreateSerializer(serializers.ModelSerializer): if User.objects.filter(phone=phone): raise serializers.ValidationError('手机号已经被注册') return phone + + +class FaceLoginSerializer(serializers.Serializer): + base64 = serializers.CharField() \ No newline at end of file diff --git a/hb_server/apps/system/urls.py b/hb_server/apps/system/urls.py index 02a4ecb..55e1420 100644 --- a/hb_server/apps/system/urls.py +++ b/hb_server/apps/system/urls.py @@ -1,5 +1,5 @@ from django.urls import path, include -from .views import TaskList, UserViewSet, OrganizationViewSet, PermissionViewSet, RoleViewSet, PositionViewSet, TestView, DictTypeViewSet, DictViewSet, PTaskViewSet +from .views import FaceLogin, TaskList, UserViewSet, OrganizationViewSet, PermissionViewSet, RoleViewSet, PositionViewSet, TestView, DictTypeViewSet, DictViewSet, PTaskViewSet from rest_framework import routers @@ -15,5 +15,6 @@ router.register('ptask', PTaskViewSet, basename="ptask") urlpatterns = [ path('', include(router.urls)), path('task/', TaskList.as_view()), - path('test/', TestView.as_view()) + path('test/', TestView.as_view()), + path('facelogin/', FaceLogin.as_view()) ] diff --git a/hb_server/apps/system/views.py b/hb_server/apps/system/views.py index 3b3dd6f..c424b7f 100644 --- a/hb_server/apps/system/views.py +++ b/hb_server/apps/system/views.py @@ -8,6 +8,7 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework import serializers, status from rest_framework.decorators import action from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.generics import CreateAPIView from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin) @@ -28,7 +29,7 @@ from .models import (Dict, DictType, File, Organization, Permission, Position, Role, User) from .permission import RbacPermission, get_permission_list from .permission_data import RbacFilterSet -from .serializers import (DictSerializer, DictTypeSerializer, FileSerializer, +from .serializers import (DictSerializer, DictTypeSerializer, FaceLoginSerializer, FileSerializer, OrganizationSerializer, PermissionSerializer, PositionSerializer, RoleSerializer, PTaskSerializer,PTaskCreateUpdateSerializer, UserCreateSerializer, UserListSerializer, @@ -349,3 +350,45 @@ class FileViewSet(CreateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListM instance = serializer.save(create_by = self.request.user, name=name, size=size, type=type, mime=mime) instance.path = settings.MEDIA_URL + instance.file.name instance.save() + + + +import face_recognition +import uuid +import base64 +import os + +def tran64(s): + missing_padding = len(s) % 4 + if missing_padding != 0: + s = s+'='* (4 - missing_padding) + return s + +class FaceLogin(CreateAPIView): + authentication_classes = [] + permission_classes = [] + serializer_class = FaceLoginSerializer + + + def create(self, request, *args, **kwargs): + """ + 人脸识别登录 + """ + # serializer = FaceLoginSerializer(data=request.data) + # serializer.is_valid(raise_exception=True) + filename = str(uuid.uuid4()) + filepath = settings.BASE_DIR +'/temp/' + filename +'.png' + with open(filepath, 'wb') as f: + data = tran64(request.data.get('base64').replace(' ', '+')) + # data = request.data.get('base64') + f.write(base64.urlsafe_b64decode(data)) + picture_of_me = face_recognition.load_image_file(settings.BASE_DIR +'/temp/me.png') + my_face_encoding = face_recognition.face_encodings(picture_of_me)[0] + unknown_picture = face_recognition.load_image_file(filepath) + unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0] + results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding) + # os.remove(filepath) + if results[0] == True: + return Response('这是曹前明') + else: + return Response('这不是曹前明') \ No newline at end of file diff --git a/hb_server/requirements.txt b/hb_server/requirements.txt index 595fea2..5cc912b 100644 --- a/hb_server/requirements.txt +++ b/hb_server/requirements.txt @@ -10,3 +10,4 @@ drf-yasg==1.20.0 psutil==5.8.0 pillow==8.3.1 opencv-python==4.5.3.56 +face-gecognition==1.3.0 From bc84a623661bad369c8e5596d650c1c31841ad66 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Sep 2021 11:18:55 +0800 Subject: [PATCH 2/5] =?UTF-8?q?mtm=20=E8=A1=A8=E5=8D=95=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=BF=85=E5=A1=AB=E5=8E=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mtm/migrations/0010_auto_20210907_1111.py | 23 +++++++++++++++++++ hb_server/apps/mtm/models.py | 4 ++-- hb_server/apps/sam/models.py | 22 ++++++++++++------ hb_server/requirements.txt | 1 - 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 hb_server/apps/mtm/migrations/0010_auto_20210907_1111.py diff --git a/hb_server/apps/mtm/migrations/0010_auto_20210907_1111.py b/hb_server/apps/mtm/migrations/0010_auto_20210907_1111.py new file mode 100644 index 0000000..22ef6f8 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0010_auto_20210907_1111.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-09-07 03:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0009_techdoc'), + ] + + operations = [ + migrations.AlterField( + model_name='recordformfield', + name='boolean_field_display', + field=models.JSONField(blank=True, default=dict, help_text='当为布尔类型时候,可以支持自定义显示形式。{"1":"是","0":"否"}或{"1":"需要","0":"不需要"},注意数字也需要引号', null=True, verbose_name='布尔类型显示名'), + ), + migrations.AlterField( + model_name='recordformfield', + name='field_choice', + field=models.JSONField(blank=True, default=dict, help_text='radio,checkbox,select,multiselect类型可供选择的选项,格式为json如:{"1":"中国", "2":"美国"},注意数字也需要引号', null=True, verbose_name='radio、checkbox、select的选项'), + ), + ] diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index f38b152..038140c 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -109,9 +109,9 @@ class RecordFormField(CommonAModel): field_type = models.CharField('类型', max_length=50, choices=field_type_choices) field_key = models.CharField('字段标识', max_length=50, help_text='字段类型请尽量特殊,避免与系统中关键字冲突') field_name = models.CharField('字段名称', max_length=50) - boolean_field_display = models.JSONField('布尔类型显示名', default=dict, blank=True, + boolean_field_display = models.JSONField('布尔类型显示名', default=dict, blank=True, null=True, help_text='当为布尔类型时候,可以支持自定义显示形式。{"1":"是","0":"否"}或{"1":"需要","0":"不需要"},注意数字也需要引号') - field_choice = models.JSONField('radio、checkbox、select的选项', default=dict, blank=True, + field_choice = models.JSONField('radio、checkbox、select的选项', default=dict, blank=True, null=True, help_text='radio,checkbox,select,multiselect类型可供选择的选项,格式为json如:{"1":"中国", "2":"美国"},注意数字也需要引号') sort = models.IntegerField('排序号', default=1) class Meta: diff --git a/hb_server/apps/sam/models.py b/hb_server/apps/sam/models.py index 8f14d29..e5cdcb0 100644 --- a/hb_server/apps/sam/models.py +++ b/hb_server/apps/sam/models.py @@ -1,3 +1,5 @@ +from numpy import product +from apps.system.models import CommonAModel from django.db import models from django.contrib.auth.models import AbstractUser from django.db.models.base import Model @@ -6,10 +8,11 @@ from django.db.models.query import QuerySet from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords +from apps.mtm.models import Material -class Customer(BaseModel): +class Customer(CommonAModel): """ 客户信息 """ @@ -17,7 +20,7 @@ class Customer(BaseModel): country = models.CharField('所属国家', max_length=20, blank=True, null=True) address = models.CharField('详细地址', max_length=20, blank=True, null=True) contact = models.CharField('联系人', max_length=20, blank=True, null=True) - contactphone = models.CharField('联系电话', max_length=11,unique=True, blank=True, null=True) + phone = models.CharField('联系电话', max_length=11,unique=True, blank=True, null=True) description = models.CharField('描述', max_length=200, blank=True, null=True) class Meta: @@ -27,16 +30,16 @@ class Customer(BaseModel): def __str__(self): return self.name -class Contact(BaseModel): +class Contact(CommonAModel): """ 合同信息 """ name = models.CharField('合同名称', max_length=100) - number = models.CharField('合同编号', max_length=100, unique=True, blank=True, null=True) - money = models.IntegerField('合同金额', default=0, null=True, blank=True) + number = models.CharField('合同编号', max_length=100, unique=True) + amount = models.IntegerField('合同金额', default=0) customer = models.ForeignKey(Customer, verbose_name='关联客户', on_delete=models.CASCADE, related_name='contact_customer') # contactuser = models.CharField('合同签订人', max_length=100, unique=True, blank=True, null=True) - date = models.DateField('签订日期', null=True, blank=True) + sign_date = models.DateField('签订日期') description = models.CharField('描述', max_length=200, blank=True, null=True) class Meta: @@ -46,11 +49,16 @@ class Contact(BaseModel): def __str__(self): return self.name -class Order(BaseModel): +class Order(CommonAModel): """ 订单信息 """ number = models.CharField('订单编号', max_length=100) + customer = models.ForeignKey(Customer, verbose_name='客户', on_delete=models.CASCADE) + contact = models.ForeignKey(Contact, verbose_name='所属合同', null=True, blank=True) + product = models.ForeignKey(Material, verbose_name='所需产品') + count = models.IntegerField('所需数量', default=0) + delivery_date = models.DateField('交货日期') class Meta: verbose_name = '订单信息' verbose_name_plural = verbose_name diff --git a/hb_server/requirements.txt b/hb_server/requirements.txt index 5cc912b..595fea2 100644 --- a/hb_server/requirements.txt +++ b/hb_server/requirements.txt @@ -10,4 +10,3 @@ drf-yasg==1.20.0 psutil==5.8.0 pillow==8.3.1 opencv-python==4.5.3.56 -face-gecognition==1.3.0 From bf8a965586dad9edad31408fef758bf75c9b3975 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Sep 2021 12:18:45 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BA=BA=E8=84=B8=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/system/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/system/views.py b/hb_server/apps/system/views.py index c424b7f..cc9842d 100644 --- a/hb_server/apps/system/views.py +++ b/hb_server/apps/system/views.py @@ -386,8 +386,8 @@ class FaceLogin(CreateAPIView): my_face_encoding = face_recognition.face_encodings(picture_of_me)[0] unknown_picture = face_recognition.load_image_file(filepath) unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0] - results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding) - # os.remove(filepath) + results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding, tolerance=0.2) + os.remove(filepath) if results[0] == True: return Response('这是曹前明') else: From c5f0ff4a0f49721971473ce6c0facfc4a1a1ae50 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Sep 2021 14:39:17 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=8A=80=E6=9C=AF=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/mtm/serializers.py | 2 +- hb_server/apps/mtm/views.py | 2 +- hb_server/apps/sam/migrations/0001_initial.py | 90 +++++++++++++++++++ hb_server/apps/sam/models.py | 9 +- hb_server/apps/sam/serializers.py | 24 +++++ hb_server/apps/sam/views.py | 20 +++++ hb_server/server/settings.py | 1 + 7 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 hb_server/apps/sam/migrations/0001_initial.py create mode 100644 hb_server/apps/sam/serializers.py diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 85d8577..481401f 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -192,7 +192,7 @@ class TechDocListSerializer(serializers.ModelSerializer): file_ = FileSimpleSerializer(source='file', read_only=True) class Meta: model = TechDoc - exclude = ['content'] + exclude = '__all__' class TechDocCreateSerializer(serializers.ModelSerializer): class Meta: diff --git a/hb_server/apps/mtm/views.py b/hb_server/apps/mtm/views.py index a893777..c58ed9f 100644 --- a/hb_server/apps/mtm/views.py +++ b/hb_server/apps/mtm/views.py @@ -188,7 +188,7 @@ class TechDocViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet): 技术文件增删改查 """ perms_map = {'*':'*'} - queryset = TechDoc.objects.all() + queryset = TechDoc.objects.select_related('file').all() filterset_fields = ['process', 'product'] search_fields = ['name'] ordering = ['-id'] diff --git a/hb_server/apps/sam/migrations/0001_initial.py b/hb_server/apps/sam/migrations/0001_initial.py new file mode 100644 index 0000000..c389300 --- /dev/null +++ b/hb_server/apps/sam/migrations/0001_initial.py @@ -0,0 +1,90 @@ +# Generated by Django 3.2.6 on 2021-09-07 06:09 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0010_auto_20210907_1111'), + ] + + operations = [ + migrations.CreateModel( + name='Contact', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=100, verbose_name='合同名称')), + ('number', models.CharField(max_length=100, unique=True, verbose_name='合同编号')), + ('amount', models.IntegerField(default=0, verbose_name='合同金额')), + ('sign_date', models.DateField(verbose_name='签订日期')), + ('description', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contact_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ], + options={ + 'verbose_name': '合同信息', + 'verbose_name_plural': '合同信息', + }, + ), + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='客户名称')), + ('country', models.CharField(blank=True, max_length=20, null=True, verbose_name='所属国家')), + ('address', models.CharField(blank=True, max_length=20, null=True, verbose_name='详细地址')), + ('contact', models.CharField(blank=True, max_length=20, null=True, verbose_name='联系人')), + ('phone', models.CharField(blank=True, max_length=11, null=True, unique=True, verbose_name='联系电话')), + ('description', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='customer_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='customer_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '客户信息', + 'verbose_name_plural': '客户信息', + }, + ), + migrations.CreateModel( + name='Order', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.CharField(max_length=100, verbose_name='订单编号')), + ('count', models.IntegerField(default=0, verbose_name='所需数量')), + ('delivery_date', models.DateField(verbose_name='交货日期')), + ('contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sam.contact', verbose_name='所属合同')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='order_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sam.customer', verbose_name='客户')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='所需产品')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='order_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '订单信息', + 'verbose_name_plural': '订单信息', + }, + ), + migrations.AddField( + model_name='contact', + name='customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contact_customer', to='sam.customer', verbose_name='关联客户'), + ), + migrations.AddField( + model_name='contact', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contact_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + ] diff --git a/hb_server/apps/sam/models.py b/hb_server/apps/sam/models.py index e5cdcb0..904101f 100644 --- a/hb_server/apps/sam/models.py +++ b/hb_server/apps/sam/models.py @@ -17,10 +17,9 @@ class Customer(CommonAModel): 客户信息 """ name = models.CharField('客户名称', max_length=50, unique=True) - country = models.CharField('所属国家', max_length=20, blank=True, null=True) address = models.CharField('详细地址', max_length=20, blank=True, null=True) - contact = models.CharField('联系人', max_length=20, blank=True, null=True) - phone = models.CharField('联系电话', max_length=11,unique=True, blank=True, null=True) + contact = models.CharField('联系人', max_length=20) + contact_phone = models.CharField('联系电话', max_length=11, unique=True) description = models.CharField('描述', max_length=200, blank=True, null=True) class Meta: @@ -55,8 +54,8 @@ class Order(CommonAModel): """ number = models.CharField('订单编号', max_length=100) customer = models.ForeignKey(Customer, verbose_name='客户', on_delete=models.CASCADE) - contact = models.ForeignKey(Contact, verbose_name='所属合同', null=True, blank=True) - product = models.ForeignKey(Material, verbose_name='所需产品') + contact = models.ForeignKey(Contact, verbose_name='所属合同', null=True, blank=True, on_delete=models.SET_NULL) + product = models.ForeignKey(Material, verbose_name='所需产品', on_delete=models.CASCADE) count = models.IntegerField('所需数量', default=0) delivery_date = models.DateField('交货日期') class Meta: diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py new file mode 100644 index 0000000..3580dab --- /dev/null +++ b/hb_server/apps/sam/serializers.py @@ -0,0 +1,24 @@ +from rest_framework import serializers + +from .models import Contact, Customer, Vendor + + +class CustomerSerializer(serializers.ModelSerializer): + class Meta: + model = Customer + fields = '__all__' + +class CustomerCreateUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Customer + fields = ['name', 'address', 'contact', 'contact_phone', 'description'] + +class ContactSerializer(serializers.ModelSerializer): + class Meta: + model = Contact + fields = '__all__' + +class ContactCreateUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Contact + fields = ['name', 'number', 'amount', 'customer', 'sign_date', 'description'] \ No newline at end of file diff --git a/hb_server/apps/sam/views.py b/hb_server/apps/sam/views.py index 91ea44a..7164c7f 100644 --- a/hb_server/apps/sam/views.py +++ b/hb_server/apps/sam/views.py @@ -1,3 +1,23 @@ +from apps.sam.serializers import CustomerCreateUpdateSerializer, CustomerSerializer +from apps.sam.models import Customer +from rest_framework.viewsets import ModelViewSet +from apps.system.mixins import CreateUpdateCustomMixin from django.shortcuts import render # Create your views here. +class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet): + """ + 客户-增删改查 + """ + perms_map = {'*': '*'} + queryset = Customer.objects.all() + serializer_class = CustomerSerializer + search_fields = ['name', 'contact'] + filterset_fields = [] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + + def get_serializer_class(self): + if self.action in ['create', 'update']: + return CustomerCreateUpdateSerializer + return CustomerSerializer diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index 8e52283..c88922b 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -53,6 +53,7 @@ INSTALLED_APPS = [ 'apps.wf', 'apps.mtm', 'apps.inm', + 'apps.sam' ] MIDDLEWARE = [ From 17789ed4a2eca34f7353a1685c9b93fcba53c925 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Sep 2021 14:42:39 +0800 Subject: [PATCH 5/5] fix bug --- hb_server/apps/mtm/serializers.py | 2 +- hb_server/apps/sam/serializers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 481401f..68b214b 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -192,7 +192,7 @@ class TechDocListSerializer(serializers.ModelSerializer): file_ = FileSimpleSerializer(source='file', read_only=True) class Meta: model = TechDoc - exclude = '__all__' + fields = '__all__' class TechDocCreateSerializer(serializers.ModelSerializer): class Meta: diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 3580dab..50d8845 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from .models import Contact, Customer, Vendor +from .models import Contact, Customer class CustomerSerializer(serializers.ModelSerializer):