+
diff --git a/hb_client/src/views/wpm/firstCheck.vue b/hb_client/src/views/wpm/firstCheck.vue
new file mode 100644
index 0000000..28e7048
--- /dev/null
+++ b/hb_client/src/views/wpm/firstCheck.vue
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+ {{scope.row.number}}
+
+
+ {{ scope.row.product_.name }}
+
+
+ {{ scope.row.product_.specification }}
+
+
+
+ {{item.name}}
+
+
+
+
+ {{ scope.row.workshop_.name }}
+
+
+
+
+
+
+
+
+
+ 已完成
+ 未完成
+
+
+
+
+
+ 首件检验
+
+
+ 检验
+
+
+ 首件审批
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.field_name}}:
+ {{item.field_value}}
+
+
+
+
+ 工序负责人:
+ {{leader_1}}
+
+
+
+
+ 技术负责人:
+ {{leader_2}}
+
+
+
+
+ 总检:
+ {{leader_3}}
+
+
+
+
+ 首件检查时间:
+ {{update_time}}
+
+
+
+
+ 首件审批时间:
+ {{first_sign_time}}
+
+
+
+
+
{{item.field_name}}:
+
![]()
+
+
+
+
+
+
工序负责人:
+
{{leader_1}}
+
人脸验证
+
+
+
技术负责人:
+
{{leader_2}}
+
人脸验证
+
+
+
总检:
+
{{leader_3}}
+
人脸验证
+
+
+
+
+ 审核人员确认
+
+
+
+
+
+
+
+
+
+
diff --git a/hb_server/apps/hrm/services.py b/hb_server/apps/hrm/services.py
index bd2f6b4..8bb9ce8 100644
--- a/hb_server/apps/hrm/services.py
+++ b/hb_server/apps/hrm/services.py
@@ -30,7 +30,7 @@ class HRMService:
update_all_user_facedata_cache()
try:
results = face_recognition.compare_faces(face_datas,
- unknown_face_encoding, tolerance=0.5)
+ unknown_face_encoding, tolerance=0.48)
except:
return None, '人脸匹配失败'
for index, value in enumerate(results):
diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py
index e4f6409..377cb4d 100644
--- a/hb_server/apps/inm/filters.py
+++ b/hb_server/apps/inm/filters.py
@@ -29,4 +29,4 @@ class IProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet):
class Meta:
model = IProduct
fields = ['material', 'warehouse', 'batch', 'order', 'material__type', 'update_time_start', 'update_time_end',
- 'to_order', 'need_to_order']
+ 'to_order', 'need_to_order', 'state']
diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py
index a0d1014..1b14ae3 100644
--- a/hb_server/apps/inm/serializers.py
+++ b/hb_server/apps/inm/serializers.py
@@ -95,6 +95,13 @@ class FIFOItemCreateSerializer(serializers.ModelSerializer):
if fifo.pu_order is not None:
raise ValidationError('非采购订单')
return super().create(validated_data)
+
+ def validate_batch(self, value):
+ if value == '':
+ return value
+ elif len(value) > 6:
+ return value
+ raise ValidationError('批次号错误')
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
class Meta:
@@ -122,6 +129,13 @@ class FIFODetailInPurSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['material', 'count', 'batch', 'details', 'warehouse']
+
+ def validate_batch(self, value):
+ if value == '':
+ return value
+ elif len(value) > 6:
+ return value
+ raise ValidationError('批次号错误')
class MaterialBatchQuerySerializer(serializers.Serializer):
diff --git a/hb_server/apps/inm/services.py b/hb_server/apps/inm/services.py
index 1c3c743..b9df308 100644
--- a/hb_server/apps/inm/services.py
+++ b/hb_server/apps/inm/services.py
@@ -1,5 +1,10 @@
+from itertools import count
from rest_framework.exceptions import ValidationError
-from apps.inm.models import FIFOItemProduct, IProduct, Inventory, MaterialBatch, FIFO, FIFOItem
+from apps.inm.models import FIFOItemProduct, IProduct, Inventory, MaterialBatch, FIFO, FIFOItem, WareHouse
+from apps.mtm.models import Material
+from apps.sam.models import SalePack, SaleProduct
+from django.db.models import Count
+from django.db.models.aggregates import Sum
class InmService:
@classmethod
@@ -53,18 +58,19 @@ class InmService:
o1 = Inventory.objects.get(material=material, warehouse=warehouse)
temp_count = o1.count - i.count
if temp_count < 0:
- raise ValidationError('库存不足,操作失败')
+ raise ValidationError('仓库库存不足,操作失败')
o1.count = temp_count
o1.save()
+ print(i.batch)
o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch)
temp_count = o2.count - i.count
if temp_count < 0:
- raise ValidationError('库存不足,操作失败')
+ raise ValidationError('批次库存不足,操作失败')
o2.count = temp_count
o2.save()
temp_count = material.count - i.count
if temp_count < 0:
- raise ValidationError('库存不足,操作失败')
+ raise ValidationError('物料库存不足,操作失败')
material.count = temp_count
material.save()
@@ -72,4 +78,64 @@ class InmService:
if instance.type == FIFO.FIFO_TYPE_DO_OUT:
# 生产领料的情况直接从IProduct中删除
numbers = FIFOItemProduct.objects.filter(fifoitem=i).values_list('number', flat=True)
- IProduct.objects.filter(number__in=numbers).delete()
\ No newline at end of file
+ IProduct.objects.filter(number__in=numbers).delete()
+ # 销售的话已经处理了
+ # elif instance.type == FIFO.FIFO_TYPE_SALE_OUT:
+ # ips = FIFOItemProduct.objects.filter(fifoitem=i).values_list('iproduct', flat=True)
+ # IProduct.objects.filter(id__in=ips).update(state=IProduct.SALED)
+
+ @classmethod
+ def sale_out_audit(cls, fifo:FIFO):
+ sale = fifo.sale
+ saleps = SaleProduct.objects.filter(sale=sale, packnum__isnull=True, remark__isnull=True)
+ if saleps.exists():
+ raise ValidationError('存在未装箱的产品')
+ # 创建出库条目
+ ips = IProduct.objects.filter(sale_iproduct__sale=sale,
+ sale_iproduct__packnum__isnull=False)
+ ips.update(state=IProduct.SALED)
+ 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)
+
+ # 装箱附件处理
+ # ml = SalePack.objects.filter(sale_product__iproduct = ips
+ # ).values('packitem__material').annotate(count=Sum('count'))
+ # for i in ml:
+ # material = Material.objects.get(id=i['material'])
+
+
+ # 更新动态产品表情况
+ from apps.wpm.models import WProduct
+ WProduct.objects.filter(id__in=ips.values_list('wproduct', flat=True)).update(
+ act_state=WProduct.WPR_ACT_STATE_SELLED)
+
+ # 变更销售记录实际发货数
+ sale.count_real = ips.count()
+ sale.save()
+ # 变更订单状态
+ order = sale.order
+ if order:
+ order.delivered_count = IProduct.objects.filter(sale_iproduct__sale__order=order
+ , sale_iproduct__packnum__isnull=False).count()
+ order.save()
\ No newline at end of file
diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py
index fe4b69a..ce7a72d 100644
--- a/hb_server/apps/inm/views.py
+++ b/hb_server/apps/inm/views.py
@@ -184,24 +184,27 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
return Response()
@action(methods=['post'], detail=True, perms_map={'post': 'fifo_audit'}, serializer_class=serializers.Serializer)
+ @transaction.atomic
def audit(self, request, pk=None):
"""
审核通过
"""
obj = self.get_object()
- if not FIFOItem.objects.filter(fifo=obj).exists():
- raise ValidationError('出入库条目为空')
- for i in FIFOItem.objects.filter(fifo=obj, need_test=True):
- if not i.is_testok:
- raise APIException('未检验通过, 不可审核')
if obj.is_audited:
- raise APIException('该入库记录已审核通过')
- with transaction.atomic():
- obj.is_audited = True
- obj.auditor = request.user
- obj.inout_date = timezone.now() # 也是审核日期
- obj.save()
- InmService.update_inm(obj) # 更新库存
+ raise APIException('该入库记录已审核通过')
+ if obj.type == FIFO.FIFO_TYPE_SALE_OUT: # 如果是销售提货,需额外处理
+ InmService.sale_out_audit(obj)
+ else:
+ if not FIFOItem.objects.filter(fifo=obj).exists():
+ raise ValidationError('出入库条目为空')
+ for i in FIFOItem.objects.filter(fifo=obj, need_test=True):
+ if not i.is_testok:
+ raise APIException('未检验通过, 不可审核')
+ obj.is_audited = True
+ obj.auditor = request.user
+ obj.inout_date = timezone.now() # 也是审核日期
+ obj.save()
+ InmService.update_inm(obj) # 更新库存
return Response()
diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py
index 1398888..942ae3b 100644
--- a/hb_server/apps/mtm/serializers.py
+++ b/hb_server/apps/mtm/serializers.py
@@ -24,6 +24,8 @@ class MaterialDetailSerializer(serializers.ModelSerializer):
objs = Process.objects.filter(subproduction_process__product=obj, subproduction_process__is_deleted=False, is_deleted=False).distinct().order_by('number')
return ProcessSimpleSerializer(instance=objs, many=True).data
+
+
class PackItemSerializer(serializers.ModelSerializer):
class Meta:
model = PackItem
@@ -42,7 +44,13 @@ class PackItemUpdateSerializer(serializers.ModelSerializer):
class MaterialSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Material
- fields = ['id', 'name', 'number', 'unit','specification', 'type']
+ fields = ['id', 'name', 'number', 'unit','specification', 'type', 'count', 'count_safe']
+
+class PackItemDetailSerializer(serializers.ModelSerializer):
+ material_ = MaterialSimpleSerializer(source='material', read_only=True)
+ class Meta:
+ model = PackItem
+ fields = '__all__'
class ProcessSerializer(serializers.ModelSerializer):
instruction_ = FileSimpleSerializer(source='instruction', read_only=True)
diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py
index fd10382..cb02d67 100644
--- a/hb_server/apps/pm/views.py
+++ b/hb_server/apps/pm/views.py
@@ -272,6 +272,9 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=FirstTestAuditSerializer)
@transaction.atomic
def first_audit(self, request, pk=None):
+ """
+ 首件审核
+ """
obj = self.get_object()
if obj.leader_1 and obj.leader_2 and obj.leader_3:
raise ValidationError('首件确认已完成')
diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py
index 28a8829..93d5a76 100644
--- a/hb_server/apps/qm/serializers.py
+++ b/hb_server/apps/qm/serializers.py
@@ -97,6 +97,8 @@ 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)
class Meta:
model = TestRecord
fields = '__all__'
diff --git a/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py b/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py
new file mode 100644
index 0000000..8f72513
--- /dev/null
+++ b/hb_server/apps/sam/migrations/0014_auto_20220222_1530.py
@@ -0,0 +1,36 @@
+# Generated by Django 3.2.9 on 2022-02-22 07:30
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mtm', '0049_auto_20220222_0944'),
+ ('sam', '0013_auto_20220222_0941'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='saleproduct',
+ name='packnum',
+ field=models.CharField(blank=True, max_length=100, null=True, verbose_name='装箱单号'),
+ ),
+ migrations.CreateModel(
+ name='SalePack',
+ 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='删除标记')),
+ ('count', models.PositiveSmallIntegerField(verbose_name='打包数量')),
+ ('packitem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.packitem', verbose_name='打包项目')),
+ ('sale_product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sam.saleproduct', verbose_name='关联销售产品')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ ]
diff --git a/hb_server/apps/sam/models.py b/hb_server/apps/sam/models.py
index 65d230f..0477da0 100644
--- a/hb_server/apps/sam/models.py
+++ b/hb_server/apps/sam/models.py
@@ -94,7 +94,6 @@ class Sale(CommonADModel):
receiver_address = models.CharField('收获地址', null=True, blank=True, max_length=200)
remark = models.CharField('备注', null=True, blank=True, max_length=200)
-
class SaleProduct(BaseModel):
"""
具体产品
@@ -117,6 +116,7 @@ class SalePack(BaseModel):
on_delete=models.CASCADE)
packitem = models.ForeignKey(PackItem, verbose_name='打包项目',
on_delete=models.CASCADE)
+ count = models.PositiveSmallIntegerField('打包数量')
diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py
index 4aeaeb9..8b3df60 100644
--- a/hb_server/apps/sam/serializers.py
+++ b/hb_server/apps/sam/serializers.py
@@ -21,7 +21,7 @@ class CustomerCreateUpdateSerializer(serializers.ModelSerializer):
class CustomerSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
- fields = ['id', 'name']
+ fields = ['id', 'name', 'address', 'contact', 'contact_phone']
class ContractSerializer(serializers.ModelSerializer):
customer_ = CustomerSimpleSerializer(source='customer', read_only=True)
diff --git a/hb_server/apps/sam/serializers_sale.py b/hb_server/apps/sam/serializers_sale.py
index 4acdbf2..4fb7589 100644
--- a/hb_server/apps/sam/serializers_sale.py
+++ b/hb_server/apps/sam/serializers_sale.py
@@ -2,8 +2,9 @@ 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.mtm.models import Material, PackItem
+from apps.mtm.serializers import MaterialSimpleSerializer, PackItemDetailSerializer
+from apps.sam.models import Sale, SalePack, SaleProduct
from apps.sam.serializers import CustomerSimpleSerializer, OrderSimpleSerializer
from django.db import transaction
from rest_framework.exceptions import ValidationError
@@ -60,4 +61,39 @@ class SaleProductCreateSerializer(serializers.ModelSerializer):
if order:
if sale.count+order.delivered_count>order.count:
raise exceptions.APIException('超过订单所需数量')
- return instance
\ No newline at end of file
+ return instance
+
+class SPackItemSerializer(serializers.ModelSerializer):
+ name = serializers.CharField(source='packitem.name', read_only=True)
+ specification = serializers.CharField(source='packitem.specification', read_only=True)
+ unit = serializers.CharField(source='packitem.unit', read_only=True)
+ material_ = MaterialSimpleSerializer(source='packitem.material', read_only=True)
+
+ class Meta:
+ model = SalePack
+ fields = '__all__'
+
+class SaleProductPackDetailSerializer(serializers.ModelSerializer):
+ detail = serializers.SerializerMethodField()
+ class Meta:
+ model = SaleProduct
+ fields = ['packnum', 'detail', 'remark']
+
+ def get_detail(self, obj):
+ return SPackItemSerializer(instance=SalePack.objects.filter(sale_product=obj)
+ , many=True).data
+
+class SPackItemCreateSerializer(serializers.Serializer):
+ id = serializers.PrimaryKeyRelatedField(queryset=SalePack.objects.all())
+ count = serializers.IntegerField()
+
+class SaleProductPackSerializer(serializers.ModelSerializer):
+ detail = SPackItemCreateSerializer(many=True)
+ packnum = serializers.CharField(min_length=6)
+ class Meta:
+ model = SaleProduct
+ fields = ['packnum', 'detail', 'remark']
+
+
+class SRemarkItemCreateSerializer(serializers.Serializer):
+ remark = serializers.CharField(min_length=6)
diff --git a/hb_server/apps/sam/views_sale.py b/hb_server/apps/sam/views_sale.py
index 9997346..a97b37f 100644
--- a/hb_server/apps/sam/views_sale.py
+++ b/hb_server/apps/sam/views_sale.py
@@ -1,11 +1,12 @@
+
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.inm.services import InmService
-from apps.mtm.models import Material
-from apps.sam.models import Sale, SaleProduct
-from apps.sam.serializers_sale import SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer
+from apps.mtm.models import Material, PackItem
+from apps.sam.models import Sale, SalePack, SaleProduct
+from apps.sam.serializers_sale import SRemarkItemCreateSerializer, SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer, SaleProductPackDetailSerializer, SaleProductPackSerializer
from rest_framework import exceptions
from django.db import transaction
from rest_framework.decorators import action
@@ -41,7 +42,8 @@ class SaleViewSet(CreateUpdateModelAMixin, ListModelMixin, RetrieveModelMixin, C
if obj.is_audited:
raise exceptions.APIException('该销售记录已审核,不可删除')
obj.delete()
- IProduct.objects.filter(sale_iproduct__sale=obj).update()
+ IProduct.objects.filter(sale_iproduct__sale=obj).update(state=IProduct.SALE_OK)
+ return Response()
def create(self, request, *args, **kwargs):
data = request.data
@@ -88,46 +90,10 @@ class SaleViewSet(CreateUpdateModelAMixin, ListModelMixin, RetrieveModelMixin, C
fifo.create_by = request.user
fifo.number = 'CK' + ranstr(7)
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)
-
- # 更新动态产品表情况
- # from apps.wpm.models import WProduct
- # WProduct.objects.filter(iproduct_wproduct__sale_iproduct__sale=obj).update(
- # act_state=WProduct.WPR_ACT_STATE_SELLED)
- # 更新库存
- # InmService.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()
@@ -157,4 +123,54 @@ class SaleProductViewSet(ListModelMixin, DestroyModelMixin, CreateModelMixin, Ge
obj.delete()
sale.count = SaleProduct.objects.filter(sale=obj.sale).count()
sale.save()
+ return Response()
+
+ def create(self, request, *args, **kwargs):
+ obj = self.get_object()
+ sale = obj.sale
+ if sale.is_audited:
+ raise exceptions.APIException('该销售记录已审核,不可添加产品')
+ return super().create(request, *args, **kwargs)
+
+ @action(methods=['get', 'post'], detail=True, perms_map={'post':'sale_pack', 'get':'*'}, serializer_class=SaleProductPackSerializer)
+ @transaction.atomic
+ def pack(self, request, pk=None):
+ """
+ 打包装箱
+ """
+ obj = self.get_object()
+ if request.method == 'GET':
+ for i in PackItem.objects.filter(product=obj.iproduct.material, is_deleted=False):
+ SalePack.objects.get_or_create(sale_product=obj, packitem=i,
+ defaults={
+ "sale_product":obj,
+ "packitem":i,
+ "count":i.count
+ })
+ return Response(SaleProductPackDetailSerializer(instance=obj).data)
+ elif request.method == 'POST':
+ serializer = SaleProductPackSerializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ vdata = serializer.validated_data
+ obj.packnum = vdata['packnum']
+ obj.remark = vdata.get('remark', '')
+ for i in vdata['detail']:
+ pi = i['id']
+ pi.count = i['count']
+ pi.save()
+ obj.save()
+ return Response()
+
+ @action(methods=['post'], detail=True, perms_map={'post':'sale_pack'}, serializer_class=SRemarkItemCreateSerializer)
+ @transaction.atomic
+ def remark(self, request, pk=None):
+ """
+ 不装箱备注
+ """
+ obj = self.get_object()
+ serializer = self.get_serializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ vdata = serializer.validated_data
+ obj.remark = vdata['remark']
+ obj.save()
return Response()
\ No newline at end of file