Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop
This commit is contained in:
commit
74a9b44660
|
@ -3,6 +3,6 @@ ENV = 'production'
|
||||||
|
|
||||||
# base api
|
# base api
|
||||||
#VUE_APP_BASE_API = 'http://192.168.1.250/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'
|
#VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"fuse.js": "^6.4.6",
|
"fuse.js": "^6.4.6",
|
||||||
"html-docx-js": "^0.3.1",
|
"html-docx-js": "^0.3.1",
|
||||||
|
"html-docx-js-typescript": "^0.1.5",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"js-cookie": "^3.0.0",
|
"js-cookie": "^3.0.0",
|
||||||
"jspdf": "^2.5.1",
|
"jspdf": "^2.5.1",
|
||||||
|
|
|
@ -30,7 +30,7 @@ class HRMService:
|
||||||
face_datas = cache.get('face_datas')
|
face_datas = cache.get('face_datas')
|
||||||
face_users = cache.get('face_users')
|
face_users = cache.get('face_users')
|
||||||
results = face_recognition.compare_faces(face_datas,
|
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):
|
for index, value in enumerate(results):
|
||||||
if value:
|
if value:
|
||||||
# 识别成功
|
# 识别成功
|
||||||
|
|
|
@ -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值'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -139,6 +139,7 @@ class RecordForm(CommonAModel):
|
||||||
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)
|
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
enabled = models.BooleanField('是否启用', default=False)
|
enabled = models.BooleanField('是否启用', default=False)
|
||||||
number = models.CharField('编号', null=True, blank=True, max_length=32)
|
number = models.CharField('编号', null=True, blank=True, max_length=32)
|
||||||
|
export_template = models.CharField('导出模板', max_length=200, null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '记录表格'
|
verbose_name = '记录表格'
|
||||||
|
@ -212,7 +213,7 @@ class RecordFormField(CommonAModel):
|
||||||
parent = models.ForeignKey('self', verbose_name='父', on_delete=models.CASCADE, null=True, blank=True)
|
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)
|
draw_template = models.CharField('绘图模板', max_length=200, null=True, blank=True)
|
||||||
|
span = models.PositiveSmallIntegerField('span值', default=12)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '记录表格字段'
|
verbose_name = '记录表格字段'
|
||||||
|
|
|
@ -212,7 +212,7 @@ class RecordFormCreateSerializer(serializers.ModelSerializer):
|
||||||
queryset=RecordForm.objects.all(), label="复制表ID", required=False)
|
queryset=RecordForm.objects.all(), label="复制表ID", required=False)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RecordForm
|
model = RecordForm
|
||||||
fields = ['name', 'type', 'step', 'material', 'number', 'enabled', 'form']
|
fields = ['name', 'type', 'step', 'material', 'number', 'enabled', 'form', 'export_template']
|
||||||
|
|
||||||
|
|
||||||
# def validate(self, attrs):
|
# def validate(self, attrs):
|
||||||
|
@ -225,7 +225,7 @@ class RecordFormCreateSerializer(serializers.ModelSerializer):
|
||||||
class RecordFormUpdateSerializer(serializers.ModelSerializer):
|
class RecordFormUpdateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RecordForm
|
model = RecordForm
|
||||||
fields = ['name', 'type', 'number', 'enabled']
|
fields = ['name', 'type', 'number', 'enabled', 'export_template']
|
||||||
|
|
||||||
# def validate(self, attrs):
|
# def validate(self, attrs):
|
||||||
# if attrs['enabled']:
|
# if attrs['enabled']:
|
||||||
|
|
|
@ -2,7 +2,6 @@ from apps.mtm.models import RecordForm
|
||||||
from apps.pm.models import ProductionPlan, SubProductionPlan, SubProductionProgress
|
from apps.pm.models import ProductionPlan, SubProductionPlan, SubProductionProgress
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from apps.qm.models import TestRecord
|
from apps.qm.models import TestRecord
|
||||||
from apps.qm.serializers import TestRecordShortSerializer
|
|
||||||
from apps.sam.serializers import OrderSerializer, OrderSimpleSerializer
|
from apps.sam.serializers import OrderSerializer, OrderSimpleSerializer
|
||||||
from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, SubProductionSimpleSerializer
|
from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, SubProductionSimpleSerializer
|
||||||
from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer
|
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_1_ = UserSimpleSerializer(source='leader_1', read_only=True)
|
||||||
leader_2_ = UserSimpleSerializer(source='leader_2', read_only=True)
|
leader_2_ = UserSimpleSerializer(source='leader_2', read_only=True)
|
||||||
leader_3_ = UserSimpleSerializer(source='leader_3', 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:
|
class Meta:
|
||||||
model=SubProductionPlan
|
model=SubProductionPlan
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
@ -53,10 +50,6 @@ class SubProductionPlanListSerializer(DynamicFieldsSerializerMixin, serializers.
|
||||||
def get_plan_product_(self, obj):
|
def get_plan_product_(self, obj):
|
||||||
return MaterialSimpleSerializer(instance=obj.production_plan.product).data
|
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):
|
class SubProductionPlanUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
|
|
@ -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
|
|
@ -1,7 +1,8 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from apps.mtm.models import RecordForm, RecordFormField
|
from apps.mtm.models import RecordForm, RecordFormField
|
||||||
from apps.mtm.serializers import RecordFormFieldSerializer, RecordFormSimpleSerializer
|
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 .models import Standard, TestItem, TestRecord, TestRecordItem
|
||||||
from django.db import transaction
|
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 = TestRecordItemSerializer(source='item_test_record', read_only=True, many=True)
|
||||||
record_data = serializers.SerializerMethodField()
|
record_data = serializers.SerializerMethodField()
|
||||||
origin_test_ = TestRecordDetailBaseSerializer(source='origin_test', read_only=True)
|
origin_test_ = TestRecordDetailBaseSerializer(source='origin_test', read_only=True)
|
||||||
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
create_by_ = UserStandardSerializer(source='create_by', read_only=True)
|
||||||
update_by_ = UserSimpleSerializer(source='update_by', read_only=True)
|
update_by_ = UserStandardSerializer(source='update_by', read_only=True)
|
||||||
|
wproduct_ = WProductBaseSerializer(source='wproduct', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TestRecord
|
model = TestRecord
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from rest_framework import exceptions, serializers
|
from rest_framework import exceptions, serializers
|
||||||
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
|
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.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer, TestRecordUpdateSerializer
|
||||||
from apps.qm.models import Standard, TestItem, TestRecord, TestRecordItem
|
from apps.qm.models import Standard, TestItem, TestRecord, TestRecordItem
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
@ -13,6 +15,7 @@ from rest_framework.decorators import action
|
||||||
|
|
||||||
from apps.wpm.models import WProduct
|
from apps.wpm.models import WProduct
|
||||||
from apps.wpm.services import WpmService
|
from apps.wpm.services import WpmService
|
||||||
|
from rest_framework.exceptions import ParseError
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
"""
|
"""
|
||||||
|
@ -98,6 +101,18 @@ class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, De
|
||||||
WpmService.update_wproduct_by_test(obj, request.user) # 这里已经做了日志记录和进度计算
|
WpmService.update_wproduct_by_test(obj, request.user) # 这里已经做了日志记录和进度计算
|
||||||
return Response()
|
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):
|
# def create(self, request, *args, **kwargs):
|
||||||
# serializer = self.get_serializer(data=request.data)
|
# serializer = self.get_serializer(data=request.data)
|
||||||
# serializer.is_valid(raise_exception=True)
|
# serializer.is_valid(raise_exception=True)
|
||||||
|
|
|
@ -126,6 +126,16 @@ class UserSimpleSerializer(serializers.ModelSerializer):
|
||||||
model = User
|
model = User
|
||||||
fields = ['id', 'username', 'name']
|
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):
|
# class UserStandardSerializer(serializers.ModelSerializer):
|
||||||
# dept_name = serializers.StringRelatedField(source='dept')
|
# dept_name = serializers.StringRelatedField(source='dept')
|
||||||
# class Meta:
|
# 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 |
Loading…
Reference in New Issue