Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop

This commit is contained in:
shijing 2022-04-21 14:08:34 +08:00
commit 74a9b44660
14 changed files with 101 additions and 15 deletions

View File

@ -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'

View File

@ -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",

View File

@ -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:
# 识别成功

View File

@ -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值'),
),
]

View File

@ -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 = '记录表格字段'

View File

@ -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']:

View File

@ -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):

View File

@ -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

View File

@ -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__'

View File

@ -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)

View File

@ -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:

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB