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

This commit is contained in:
shilixia 2022-03-15 09:27:46 +08:00
commit e6b1462231
6 changed files with 64 additions and 14 deletions

View File

@ -4,7 +4,7 @@ from rest_framework.response import Response
from celery import shared_task from celery import shared_task
import os import os
import subprocess import subprocess
from server.settings_pro import DATABASES, BACKUP_DATABASE_PATH from server.settings_pro import DATABASES, BACKUP_PATH, SH_PATH
@shared_task @shared_task
def backup_database(): def backup_database():
@ -17,14 +17,14 @@ def backup_database():
DATABASES['default']['USER'], DATABASES['default']['USER'],
DATABASES['default']['PASSWORD'], DATABASES['default']['PASSWORD'],
DATABASES['default']['NAME'], DATABASES['default']['NAME'],
BACKUP_DATABASE_PATH, BACKUP_PATH + '/database',
name) name)
completed = subprocess.run(command, shell=True, capture_output=True, text=True) completed = subprocess.run(command, shell=True, capture_output=True, text=True)
return completed return completed
@shared_task @shared_task
def reload_server(): 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) completed = subprocess.run(command, shell=True, capture_output=True, text=True)
return completed return completed
@ -36,7 +36,7 @@ def reload_server_only():
@shared_task @shared_task
def backup_media(): 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) completed = subprocess.run(command, shell=True, capture_output=True, text=True)
return completed return completed

View File

@ -69,12 +69,14 @@ class FIFO(CommonADModel):
FIFO_TYPE_PUR_IN = 3 FIFO_TYPE_PUR_IN = 3
FIFO_TYPE_DO_IN = 4 FIFO_TYPE_DO_IN = 4
FIFO_TYPE_OTHER_IN = 5 FIFO_TYPE_OTHER_IN = 5
FIFO_TYPE_OTHER_OUT = 6
type_choices = ( type_choices = (
(FIFO_TYPE_DO_OUT, '生产领料'), (FIFO_TYPE_DO_OUT, '生产领料'),
(FIFO_TYPE_SALE_OUT, '销售提货'), (FIFO_TYPE_SALE_OUT, '销售提货'),
(FIFO_TYPE_PUR_IN, '采购入库'), (FIFO_TYPE_PUR_IN, '采购入库'),
(FIFO_TYPE_DO_IN, '生产入库'), (FIFO_TYPE_DO_IN, '生产入库'),
(FIFO_TYPE_OTHER_IN, '其他入库') (FIFO_TYPE_OTHER_IN, '其他入库'),
(FIFO_TYPE_OTHER_OUT, '其他出库')
) )
number = models.CharField('记录编号', max_length=100) number = models.CharField('记录编号', max_length=100)
type = models.IntegerField('出入库类型', default=1) type = models.IntegerField('出入库类型', default=1)

View File

@ -77,23 +77,31 @@ class FIFOListSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
class FIFOItemCreateSerializer(serializers.ModelSerializer): class FIFOItemCreateSerializer(serializers.ModelSerializer):
material_batch = serializers.PrimaryKeyRelatedField(queryset=MaterialBatch.objects.all(), label="物料批次ID", required=False)
class Meta: class Meta:
model = FIFOItem model = FIFOItem
fields = ['warehouse', 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): def create(self, validated_data):
fifo = validated_data['fifo'] fifo = validated_data['fifo']
if fifo.is_audited: if fifo.is_audited:
raise ValidationError('该出入库记录已审核') raise ValidationError('该出入库记录已审核')
pu_order_item = validated_data.get('pu_order_item', None) 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: if fifo.pu_order != pu_order_item.pu_order:
raise ValidationError('项目与采购订单不一致') raise ValidationError('项目与采购订单不一致')
validated_data['material']=pu_order_item.material validated_data['material']=pu_order_item.material
if fifo.type == FIFO.FIFO_TYPE_OTHER_OUT and material_batch is None:
raise ValidationError('其他出库需关联批次号')
else: else:
if fifo.pu_order is not None: validated_data['material'] = material_batch.material
raise ValidationError('非采购订单') validated_data['batch'] = material_batch.batch
validated_data['warehouse'] = material_batch.warehouse
return super().create(validated_data) return super().create(validated_data)
def validate_batch(self, value): def validate_batch(self, value):
@ -106,7 +114,7 @@ class FIFOItemCreateSerializer(serializers.ModelSerializer):
class FIFOItemUpdateSerializer(serializers.ModelSerializer): class FIFOItemUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = FIFOItem model = FIFOItem
fields = ['warehouse', 'batch', 'files', 'count', 'expiration_date'] fields = ['files', 'count', 'expiration_date']
class FIFOItemSerializer(serializers.ModelSerializer): class FIFOItemSerializer(serializers.ModelSerializer):
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
@ -142,11 +150,41 @@ class MaterialBatchQuerySerializer(serializers.Serializer):
warehouse = serializers.IntegerField(label="仓库ID", required=False) warehouse = serializers.IntegerField(label="仓库ID", required=False)
materials = serializers.ListField(child=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): class FIFOInOtherSerializer(serializers.ModelSerializer):
""" """
其他入库序列化 其他入库序列化
""" """
details = FIFODetailInPurSerializer(many=True, required=False) details = FIFODetailInPurSerializer(many=True, required=True)
vendor = serializers.PrimaryKeyRelatedField(label='供应商ID', vendor = serializers.PrimaryKeyRelatedField(label='供应商ID',
queryset=Vendor.objects.all()) queryset=Vendor.objects.all())
class Meta: class Meta:

View File

@ -59,7 +59,7 @@ class InmService:
pu_order_item.delivered_count = delivered_count pu_order_item.delivered_count = delivered_count
pu_order_item.save() 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): for i in FIFOItem.objects.filter(fifo=instance):
material = i.material material = i.material

View File

@ -6,7 +6,7 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.inm.filters import IProductFilterSet, MbFilterSet from apps.inm.filters import IProductFilterSet, MbFilterSet
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory 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, \ InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \
WareHouseCreateUpdateSerializer, InventorySerializer WareHouseCreateUpdateSerializer, InventorySerializer
from apps.inm.services import InmService from apps.inm.services import InmService
@ -183,6 +183,17 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
serializer.save(create_by=request.user) serializer.save(create_by=request.user)
return Response() 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) @action(methods=['post'], detail=True, perms_map={'post': 'fifo_audit'}, serializer_class=serializers.Serializer)
@transaction.atomic @transaction.atomic
def audit(self, request, pk=None): def audit(self, request, pk=None):

View File

@ -44,7 +44,6 @@ class RbacPermission(BasePermission):
perms = cache.get(request.user.username + '__perms') perms = cache.get(request.user.username + '__perms')
if not perms: if not perms:
perms = get_permission_list(request.user) perms = get_permission_list(request.user)
if 'admin' in perms: if 'admin' in perms:
return True return True
elif not hasattr(view, 'perms_map'): elif not hasattr(view, 'perms_map'):