diff --git a/hb_client/src/api/inm.js b/hb_client/src/api/inm.js index a4ff215..a4d721b 100644 --- a/hb_client/src/api/inm.js +++ b/hb_client/src/api/inm.js @@ -150,3 +150,11 @@ export function itemfiles(id, data) { data }) } +//其他出库 +export function outOther(data) { + return request({ + url: `/inm/fifo/out_other/`, + method: 'POST', + data + }) +} diff --git a/hb_client/src/views/em/monitoring.vue b/hb_client/src/views/em/monitoring.vue index 99d78d7..b406d44 100644 --- a/hb_client/src/views/em/monitoring.vue +++ b/hb_client/src/views/em/monitoring.vue @@ -393,8 +393,8 @@ ], state_: { 10: "合格", - - 40: "禁用", + 40: "禁用", + 50: "报废", }, options: [ { @@ -404,6 +404,11 @@ { value: 40, label: "禁用", + } + , + { + value: 50, + label: "报废", }, ], listQuery: { diff --git a/hb_client/src/views/inm/fifo.vue b/hb_client/src/views/inm/fifo.vue index 699ae25..f62acee 100644 --- a/hb_client/src/views/inm/fifo.vue +++ b/hb_client/src/views/inm/fifo.vue @@ -8,7 +8,7 @@ icon="el-icon-plus" @click="handlecgCreate" > - 新增采购入库 + 采购入库 - 新增其他入库 + 其他入库 + + + 其他出库 - - - + + @@ -73,12 +80,11 @@ 已审核 - - + diff --git a/hb_client/src/views/procurement/vendor.vue b/hb_client/src/views/procurement/vendor.vue index 5213d8b..85b6964 100644 --- a/hb_client/src/views/procurement/vendor.vue +++ b/hb_client/src/views/procurement/vendor.vue @@ -95,7 +95,7 @@ + + + @@ -88,6 +91,16 @@ export default { productionplan:"", orderdetail:"", + state_: { + 10: "制定中", + 20: "已下达", + 30: "已接受", + 40: "生产中", + 50: "已完成", + 60: "军检完成", + 70: "暂停", + 80: "终止", + }, }; }, diff --git a/hb_client/src/views/sam/salesdetail.vue b/hb_client/src/views/sam/salesdetail.vue index 08a5459..c643e72 100644 --- a/hb_client/src/views/sam/salesdetail.vue +++ b/hb_client/src/views/sam/salesdetail.vue @@ -76,7 +76,7 @@ - + diff --git a/hb_server/apps/develop/tasks.py b/hb_server/apps/develop/tasks.py index 398ad36..b9c1991 100644 --- a/hb_server/apps/develop/tasks.py +++ b/hb_server/apps/develop/tasks.py @@ -4,7 +4,7 @@ from rest_framework.response import Response from celery import shared_task import os import subprocess -from server.settings_pro import DATABASES, BACKUP_DATABASE_PATH +from server.settings_pro import DATABASES, BACKUP_PATH, SH_PATH @shared_task def backup_database(): @@ -17,14 +17,14 @@ def backup_database(): DATABASES['default']['USER'], DATABASES['default']['PASSWORD'], DATABASES['default']['NAME'], - BACKUP_DATABASE_PATH, + BACKUP_PATH + '/database', name) completed = subprocess.run(command, shell=True, capture_output=True, text=True) return completed @shared_task def reload_server(): - command = 'bash /home/lighthouse/hberp/hb_server/sh/git.sh' + command = 'bash {}/git.sh'.format(SH_PATH) completed = subprocess.run(command, shell=True, capture_output=True, text=True) return completed @@ -36,7 +36,7 @@ def reload_server_only(): @shared_task def backup_media(): - command = 'bash /home/lighthouse/hberp/hb_server/sh/backup_media.sh' + command = 'bash {}/backup_media.sh'.format(SH_PATH) completed = subprocess.run(command, shell=True, capture_output=True, text=True) return completed diff --git a/hb_server/apps/em/models.py b/hb_server/apps/em/models.py index 194474f..7a8e6c9 100644 --- a/hb_server/apps/em/models.py +++ b/hb_server/apps/em/models.py @@ -17,11 +17,13 @@ class Equipment(CommonAModel): EQUIP_STATE_LIMIT = 20 EQUIP_STATE_FIX = 30 EQUIP_STATE_DISABLE = 40 + EQUIP_STATE_scrap = 50 state_choices = ( (EQUIP_STATE_OK, '完好'), (EQUIP_STATE_LIMIT, '限用'), (EQUIP_STATE_FIX, '在修'), - (EQUIP_STATE_DISABLE, '禁用') + (EQUIP_STATE_DISABLE, '禁用'), + (EQUIP_STATE_scrap, '报废') ) state2_choices = ( diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index d8235ee..a9a2226 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -69,12 +69,14 @@ class FIFO(CommonADModel): FIFO_TYPE_PUR_IN = 3 FIFO_TYPE_DO_IN = 4 FIFO_TYPE_OTHER_IN = 5 + FIFO_TYPE_OTHER_OUT = 6 type_choices = ( (FIFO_TYPE_DO_OUT, '生产领料'), (FIFO_TYPE_SALE_OUT, '销售提货'), (FIFO_TYPE_PUR_IN, '采购入库'), (FIFO_TYPE_DO_IN, '生产入库'), - (FIFO_TYPE_OTHER_IN, '其他入库') + (FIFO_TYPE_OTHER_IN, '其他入库'), + (FIFO_TYPE_OTHER_OUT, '其他出库') ) number = models.CharField('记录编号', max_length=100) type = models.IntegerField('出入库类型', default=1) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 4c2374f..357084d 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -77,23 +77,31 @@ class FIFOListSerializer(serializers.ModelSerializer): fields = '__all__' class FIFOItemCreateSerializer(serializers.ModelSerializer): + material_batch = serializers.PrimaryKeyRelatedField(queryset=MaterialBatch.objects.all(), label="物料批次ID", required=False) class Meta: model = FIFOItem fields = ['warehouse', - 'material', 'batch', 'fifo', 'files', 'pu_order_item', 'count', 'expiration_date'] + 'material', 'batch', 'fifo', 'files', 'pu_order_item', 'count', 'expiration_date', 'material_batch'] def create(self, validated_data): fifo = validated_data['fifo'] if fifo.is_audited: raise ValidationError('该出入库记录已审核') pu_order_item = validated_data.get('pu_order_item', None) - if pu_order_item: + material_batch = validated_data.pop('material_batch', None) + if fifo.type == FIFO.FIFO_TYPE_PUR_IN and pu_order_item is None: + raise ValidationError('采购入库需关联采购项') + else: if fifo.pu_order != pu_order_item.pu_order: raise ValidationError('项目与采购订单不一致') validated_data['material']=pu_order_item.material + if fifo.type == FIFO.FIFO_TYPE_OTHER_OUT and material_batch is None: + raise ValidationError('其他出库需关联批次号') else: - if fifo.pu_order is not None: - raise ValidationError('非采购订单') + validated_data['material'] = material_batch.material + validated_data['batch'] = material_batch.batch + validated_data['warehouse'] = material_batch.warehouse + return super().create(validated_data) def validate_batch(self, value): @@ -106,7 +114,7 @@ class FIFOItemCreateSerializer(serializers.ModelSerializer): class FIFOItemUpdateSerializer(serializers.ModelSerializer): class Meta: model = FIFOItem - fields = ['warehouse', 'batch', 'files', 'count', 'expiration_date'] + fields = ['files', 'count', 'expiration_date'] class FIFOItemSerializer(serializers.ModelSerializer): warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) @@ -142,11 +150,41 @@ class MaterialBatchQuerySerializer(serializers.Serializer): warehouse = serializers.IntegerField(label="仓库ID", required=False) materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False) +class FIFODetailOutOtherSerializer(serializers.Serializer): + material_batch = serializers.PrimaryKeyRelatedField(queryset=MaterialBatch.objects.all(), label="物料批次ID") + count = serializers.IntegerField(label="数量", min_value=0) + +class FIFOOutOtherSerializer(serializers.ModelSerializer): + """ + 其他出库序列化 + """ + details = FIFODetailOutOtherSerializer(many=True, required=True) + + class Meta: + model = FIFO + fields = ['details'] + + def create(self, validated_data): + details = validated_data.pop('details') + with transaction.atomic(): + validated_data['type'] = FIFO.FIFO_TYPE_OTHER_OUT + validated_data['number'] = 'CK' + ranstr(7) + obj = FIFO(**validated_data) + obj.save() + for i in details: + mb = i.pop('material_batch') + i['material'] = mb.material + i['batch'] = mb.batch + i['warehouse'] = mb.warehouse + i['fifo'] = obj + FIFOItem.objects.create(**i) + return obj + class FIFOInOtherSerializer(serializers.ModelSerializer): """ 其他入库序列化 """ - details = FIFODetailInPurSerializer(many=True, required=False) + details = FIFODetailInPurSerializer(many=True, required=True) vendor = serializers.PrimaryKeyRelatedField(label='供应商ID', queryset=Vendor.objects.all()) class Meta: diff --git a/hb_server/apps/inm/services.py b/hb_server/apps/inm/services.py index 49c7c58..159f148 100644 --- a/hb_server/apps/inm/services.py +++ b/hb_server/apps/inm/services.py @@ -59,7 +59,7 @@ class InmService: pu_order_item.delivered_count = delivered_count pu_order_item.save() - elif instance.type in [FIFO.FIFO_TYPE_DO_OUT, FIFO.FIFO_TYPE_SALE_OUT]: # 生产领料 销售出库 + elif instance.type in [FIFO.FIFO_TYPE_DO_OUT, FIFO.FIFO_TYPE_SALE_OUT, FIFO.FIFO_TYPE_OTHER_OUT]: # 生产领料 销售出库 # 更新相关表 for i in FIFOItem.objects.filter(fifo=instance): material = i.material diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index ce7a72d..fcc454f 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -6,7 +6,7 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.filters import IProductFilterSet, MbFilterSet from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory -from apps.inm.serializers import FIFOInOtherSerializer, FIFOItemCreateSerializer, FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \ +from apps.inm.serializers import FIFOInOtherSerializer, FIFOItemCreateSerializer, FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, FIFOOutOtherSerializer, IProductListSerializer, \ InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \ WareHouseCreateUpdateSerializer, InventorySerializer from apps.inm.services import InmService @@ -183,6 +183,17 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): serializer.save(create_by=request.user) return Response() + @action(methods=['post'], detail=False, perms_map={'post': 'fifo_out_other'}, + serializer_class=FIFOOutOtherSerializer) + def out_other(self, request, pk=None): + """ + 其他出库 + """ + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save(create_by=request.user) + return Response() + @action(methods=['post'], detail=True, perms_map={'post': 'fifo_audit'}, serializer_class=serializers.Serializer) @transaction.atomic def audit(self, request, pk=None): diff --git a/hb_server/apps/system/permission.py b/hb_server/apps/system/permission.py index 7b218d3..397d906 100644 --- a/hb_server/apps/system/permission.py +++ b/hb_server/apps/system/permission.py @@ -44,7 +44,6 @@ class RbacPermission(BasePermission): perms = cache.get(request.user.username + '__perms') if not perms: perms = get_permission_list(request.user) - if 'admin' in perms: return True elif not hasattr(view, 'perms_map'):