diff --git a/hb_client/.env.production b/hb_client/.env.production index 9305698..d12d8ae 100644 --- a/hb_client/.env.production +++ b/hb_client/.env.production @@ -3,6 +3,6 @@ ENV = 'production' # base api #VUE_APP_BASE_API = 'http://192.168.1.250/api' -VUE_APP_BASE_API = 'http://49.232.14.174:2222/api' +VUE_APP_BASE_API = 'http://127.0.0.1:3333/api' #VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' diff --git a/hb_client/package.json b/hb_client/package.json index a6eb736..88cafcb 100644 --- a/hb_client/package.json +++ b/hb_client/package.json @@ -29,6 +29,7 @@ "file-saver": "^2.0.2", "fuse.js": "^6.4.6", "html-docx-js": "^0.3.1", + "html-docx-js-typescript": "^0.1.5", "html2canvas": "^1.4.1", "js-cookie": "^3.0.0", "jspdf": "^2.5.1", diff --git a/hb_server/apps/hrm/services.py b/hb_server/apps/hrm/services.py index eca4639..180ea62 100644 --- a/hb_server/apps/hrm/services.py +++ b/hb_server/apps/hrm/services.py @@ -30,7 +30,7 @@ class HRMService: face_datas = cache.get('face_datas') face_users = cache.get('face_users') results = face_recognition.compare_faces(face_datas, - unknown_face_encoding, tolerance=0.45) + unknown_face_encoding, tolerance=0.42) for index, value in enumerate(results): if value: # 识别成功 diff --git a/hb_server/apps/mtm/migrations/0050_auto_20220419_1109.py b/hb_server/apps/mtm/migrations/0050_auto_20220419_1109.py new file mode 100644 index 0000000..344566a --- /dev/null +++ b/hb_server/apps/mtm/migrations/0050_auto_20220419_1109.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2022-04-19 03:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0049_auto_20220222_0944'), + ] + + operations = [ + migrations.AddField( + model_name='recordform', + name='export_template', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='导出模板'), + ), + migrations.AddField( + model_name='recordformfield', + name='span', + field=models.PositiveSmallIntegerField(default=12, verbose_name='span值'), + ), + ] diff --git a/hb_server/apps/mtm/models.py b/hb_server/apps/mtm/models.py index 9ea0abd..d54c93a 100644 --- a/hb_server/apps/mtm/models.py +++ b/hb_server/apps/mtm/models.py @@ -139,6 +139,7 @@ class RecordForm(CommonAModel): material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True) enabled = models.BooleanField('是否启用', default=False) number = models.CharField('编号', null=True, blank=True, max_length=32) + export_template = models.CharField('导出模板', max_length=200, null=True, blank=True) class Meta: verbose_name = '记录表格' @@ -212,7 +213,7 @@ class RecordFormField(CommonAModel): parent = models.ForeignKey('self', verbose_name='父', on_delete=models.CASCADE, null=True, blank=True) draw_template = models.CharField('绘图模板', max_length=200, null=True, blank=True) - + span = models.PositiveSmallIntegerField('span值', default=12) class Meta: verbose_name = '记录表格字段' diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 942ae3b..e0afabb 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -212,7 +212,7 @@ class RecordFormCreateSerializer(serializers.ModelSerializer): queryset=RecordForm.objects.all(), label="复制表ID", required=False) class Meta: model = RecordForm - fields = ['name', 'type', 'step', 'material', 'number', 'enabled', 'form'] + fields = ['name', 'type', 'step', 'material', 'number', 'enabled', 'form', 'export_template'] # def validate(self, attrs): @@ -225,7 +225,7 @@ class RecordFormCreateSerializer(serializers.ModelSerializer): class RecordFormUpdateSerializer(serializers.ModelSerializer): class Meta: model = RecordForm - fields = ['name', 'type', 'number', 'enabled'] + fields = ['name', 'type', 'number', 'enabled', 'export_template'] # def validate(self, attrs): # if attrs['enabled']: diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index 0d653fd..a261748 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -2,7 +2,6 @@ from apps.mtm.models import RecordForm from apps.pm.models import ProductionPlan, SubProductionPlan, SubProductionProgress from rest_framework import serializers from apps.qm.models import TestRecord -from apps.qm.serializers import TestRecordShortSerializer from apps.sam.serializers import OrderSerializer, OrderSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, SubProductionSimpleSerializer from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer @@ -44,8 +43,6 @@ class SubProductionPlanListSerializer(DynamicFieldsSerializerMixin, serializers. leader_1_ = UserSimpleSerializer(source='leader_1', read_only=True) leader_2_ = UserSimpleSerializer(source='leader_2', read_only=True) leader_3_ = UserSimpleSerializer(source='leader_3', read_only=True) - first_test_ = TestRecordShortSerializer(source='first_test', read_only=True) - # first_test_ = serializers.SerializerMethodField() class Meta: model=SubProductionPlan fields = '__all__' @@ -53,10 +50,6 @@ class SubProductionPlanListSerializer(DynamicFieldsSerializerMixin, serializers. def get_plan_product_(self, obj): return MaterialSimpleSerializer(instance=obj.production_plan.product).data - # def get_first_test_(self, obj): - # if obj.first_test: - # return TestRecordShortSerializer(instance=obj.first_test).data - # return None class SubProductionPlanUpdateSerializer(serializers.ModelSerializer): diff --git a/hb_server/apps/qm/export.py b/hb_server/apps/qm/export.py new file mode 100644 index 0000000..127a2ba --- /dev/null +++ b/hb_server/apps/qm/export.py @@ -0,0 +1,41 @@ +from docxtpl import DocxTemplate, InlineImage +from apps.qm.models import TestRecord +from apps.qm.serializers import TestRecordDetailSerializer +from server.settings import BASE_DIR +from utils.tools import ranstr +from docx.shared import Mm +from apps.mtm.models import RecordFormField + + + +def exprot_test_record(tr:TestRecord, tm:str): + data = TestRecordDetailSerializer(instance=tr).data + doc = DocxTemplate(BASE_DIR + tm) + edata = {} + edata['formName'] = data['form_']['name'] + edata['glassSpec'] = data['wproduct_']['material_']['specification'] if data['wproduct_'] else '' + edata['glassNum'] = data['wproduct_']['number'] if data['wproduct_'] else '' + edata['testDate'] = data['update_time'][0:11] if data['update_time'] else data['create_time'][0:11] + tester_s = data['update_by_']['signature'] if data['update_by_'] else data['create_by_']['signature'] + if tester_s: # 签名 + edata['tester'] = InlineImage(doc, BASE_DIR + tester_s, height=Mm(10)) + + for i in data['record_data']: + if i['field_type'] == str(RecordFormField.FIELD_DRAW): + edata[i['field_key']] = { + 's': InlineImage(doc, BASE_DIR + i['field_value'], width=Mm(40)), + 'm': InlineImage(doc, BASE_DIR + i['field_value'], width=Mm(60)), + 'l': InlineImage(doc, BASE_DIR + i['field_value'], width=Mm(80)), + } + else: + edata[i['field_key']] = i['field_value'] + if i.get('origin_value', ''): + edata[i['field_key']] = '{}({})'.format(i['origin_value'] + i['field_value']) + + # 开始生成word + doc.render(edata) + filename = edata['formName'] + '_' + ranstr(6) + path = '/media/export/' + filename + '.docx' + filepath = BASE_DIR + path + doc.save(filepath) + return path \ No newline at end of file diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py index 93d5a76..0dd0def 100644 --- a/hb_server/apps/qm/serializers.py +++ b/hb_server/apps/qm/serializers.py @@ -1,7 +1,8 @@ from rest_framework import serializers from apps.mtm.models import RecordForm, RecordFormField from apps.mtm.serializers import RecordFormFieldSerializer, RecordFormSimpleSerializer -from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer +from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer, UserStandardSerializer +from apps.wpm.serializers import WProductBaseSerializer from .models import Standard, TestItem, TestRecord, TestRecordItem from django.db import transaction @@ -97,8 +98,9 @@ class TestRecordDetailSerializer(serializers.ModelSerializer): # record_data = TestRecordItemSerializer(source='item_test_record', read_only=True, many=True) record_data = serializers.SerializerMethodField() origin_test_ = TestRecordDetailBaseSerializer(source='origin_test', read_only=True) - create_by_ = UserSimpleSerializer(source='create_by', read_only=True) - update_by_ = UserSimpleSerializer(source='update_by', read_only=True) + create_by_ = UserStandardSerializer(source='create_by', read_only=True) + update_by_ = UserStandardSerializer(source='update_by', read_only=True) + wproduct_ = WProductBaseSerializer(source='wproduct', read_only=True) class Meta: model = TestRecord fields = '__all__' diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py index c980b01..374c2e0 100644 --- a/hb_server/apps/qm/views.py +++ b/hb_server/apps/qm/views.py @@ -1,5 +1,7 @@ from rest_framework import exceptions, serializers from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin +from apps.mtm.models import RecordFormField +from apps.qm.export import exprot_test_record from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer, TestRecordUpdateSerializer from apps.qm.models import Standard, TestItem, TestRecord, TestRecordItem from django.shortcuts import render @@ -13,6 +15,7 @@ from rest_framework.decorators import action from apps.wpm.models import WProduct from apps.wpm.services import WpmService +from rest_framework.exceptions import ParseError # Create your views here. class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet): """ @@ -98,6 +101,18 @@ class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, De WpmService.update_wproduct_by_test(obj, request.user) # 这里已经做了日志记录和进度计算 return Response() + @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer) + def export(self, request, pk=None): + """ + 按模板导出 + """ + instance = self.get_object() + tm = instance.form.export_template + if tm: + path = exprot_test_record(tr=instance, tm=tm) + return Response({'path':path}) + raise ParseError('未配置导出模板') + # def create(self, request, *args, **kwargs): # serializer = self.get_serializer(data=request.data) # serializer.is_valid(raise_exception=True) diff --git a/hb_server/apps/system/serializers.py b/hb_server/apps/system/serializers.py index 45d8c29..a8457ff 100644 --- a/hb_server/apps/system/serializers.py +++ b/hb_server/apps/system/serializers.py @@ -126,6 +126,16 @@ class UserSimpleSerializer(serializers.ModelSerializer): model = User fields = ['id', 'username', 'name'] +class UserStandardSerializer(serializers.ModelSerializer): + signature= serializers.SerializerMethodField() + class Meta: + model = User + fields = ['id', 'username', 'name', 'signature'] + + def get_signature(self, obj): + if hasattr(obj, 'employee_user'): + return obj.employee_user.signature + return None # class UserStandardSerializer(serializers.ModelSerializer): # dept_name = serializers.StringRelatedField(source='dept') # class Meta: diff --git a/hb_server/media/default/temp.docx b/hb_server/media/default/temp.docx new file mode 100644 index 0000000..4127f63 Binary files /dev/null and b/hb_server/media/default/temp.docx differ diff --git a/hb_server/media/default/test.png b/hb_server/media/default/test.png new file mode 100644 index 0000000..5455e93 Binary files /dev/null and b/hb_server/media/default/test.png differ diff --git a/hb_server/media/default/test1.png b/hb_server/media/default/test1.png new file mode 100644 index 0000000..45221ed Binary files /dev/null and b/hb_server/media/default/test1.png differ