Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop
This commit is contained in:
commit
e6b1462231
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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'):
|
||||||
|
|
Loading…
Reference in New Issue