diff --git a/hb_client/src/api/pm.js b/hb_client/src/api/pm.js index f78b62f..7beed12 100644 --- a/hb_client/src/api/pm.js +++ b/hb_client/src/api/pm.js @@ -105,6 +105,23 @@ export function createConvert(data) { data }) } +//首件检查表初始化 +export function firstTestInit(id,data) { + return request({ + url: `/pm/subproduction_plan/${id}/first_test_init/`, + method: 'post', + data + }) +} +//首件检查责任人审核 +export function firstAudit(id,data) { + return request({ + url: `/pm/subproduction_plan/${id}/first_audit/`, + method: 'post', + data + }) +} + //任务终止 export function planstop(id) { return request({ @@ -120,4 +137,4 @@ export function plantoggle(id) { method: 'put', }) -} \ No newline at end of file +} diff --git a/hb_client/src/assets/beijing.jpg b/hb_client/src/assets/beijing.jpg deleted file mode 100644 index 2d1941c..0000000 Binary files a/hb_client/src/assets/beijing.jpg and /dev/null differ diff --git a/hb_client/src/assets/bg-login.png b/hb_client/src/assets/bg-login.png new file mode 100644 index 0000000..c7f85be Binary files /dev/null and b/hb_client/src/assets/bg-login.png differ diff --git a/hb_client/src/components/customForm/index.vue b/hb_client/src/components/customForm/index.vue index c809024..97a0760 100644 --- a/hb_client/src/components/customForm/index.vue +++ b/hb_client/src/components/customForm/index.vue @@ -239,13 +239,15 @@ let imag= this.formData.filter(item => { return item.field_type === 'draw'; }); - that.img = new Image(); - that.img.crossOrigin = 'anonymous'; - let value = imag[0].field_value?imag[0].field_value:imag[0].draw_template; - that.img = 'http://47.95.0.242:2222'+value; - setTimeout(function(){ - that.canvasInit(); - },500); + if(imag.length>0){ + that.img = new Image(); + that.img.crossOrigin = 'anonymous'; + let value = imag[0].field_value?imag[0].field_value:imag[0].draw_template; + that.img = 'http://47.95.0.242:2222'+value; + setTimeout(function(){ + that.canvasInit(); + },500); + } }, data(){ return{ @@ -695,7 +697,7 @@ that.field = []; //检查项目 let submit = isSubmit=='1'?false:true; that.formData.forEach((item) => { - let field_value = null; + let field_value; if(item.field_type==='int'){ field_value = parseInt(that.checkForm[item.field_key]) }else if(item.field_type==='float'){ diff --git a/hb_client/src/components/faceLogin/review.vue b/hb_client/src/components/faceLogin/review.vue new file mode 100644 index 0000000..2b357fa --- /dev/null +++ b/hb_client/src/components/faceLogin/review.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/hb_client/src/components/faceLogin/tracking.vue b/hb_client/src/components/faceLogin/tracking.vue index 98727da..b3557c1 100644 --- a/hb_client/src/components/faceLogin/tracking.vue +++ b/hb_client/src/components/faceLogin/tracking.vue @@ -1,16 +1,16 @@ 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 @@ + + + + + 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