feat: 调整

This commit is contained in:
Czw996 2021-12-20 00:30:37 +08:00
parent 9cf6e99adc
commit c551d09e52
8 changed files with 384 additions and 21 deletions

View file

@ -12,7 +12,7 @@ class Warehouse(Model):
phone = CharField(max_length=32, null=True, blank=True, verbose_name='电话')
address = CharField(max_length=256, null=True, blank=True, verbose_name='地址')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
order = IntegerField(default=100, verbose_name='')
order = IntegerField(default=100, verbose_name='')
is_active = BooleanField(default=True, verbose_name='激活状态')
is_locked = BooleanField(default=True, verbose_name='锁定状态')
team = ForeignKey('system.Team', on_delete=CASCADE, related_name='warehouses')
@ -65,7 +65,7 @@ class Client(Model):
email = CharField(max_length=256, null=True, blank=True, verbose_name='邮箱')
address = CharField(max_length=256, null=True, blank=True, verbose_name='地址')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
order = IntegerField(default=100, verbose_name='')
order = IntegerField(default=100, verbose_name='')
is_active = BooleanField(default=True, verbose_name='激活状态')
initial_arrears_amount = AmountField(default=0, verbose_name='初期欠款金额')
arrears_amount = AmountField(default=0, verbose_name='欠款金额')
@ -113,7 +113,7 @@ class Supplier(Model):
bank_account = CharField(max_length=64, null=True, blank=True, verbose_name='银行账户')
bank_name = CharField(max_length=64, null=True, blank=True, verbose_name='开户行')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
order = IntegerField(default=100, verbose_name='')
order = IntegerField(default=100, verbose_name='')
is_active = BooleanField(default=True, verbose_name='激活状态')
initial_arrears_amount = AmountField(default=0, verbose_name='初期欠款金额')
arrears_amount = AmountField(default=0, verbose_name='欠款金额')
@ -153,7 +153,7 @@ class Account(Model):
type = CharField(max_length=32, choices=Type.choices, verbose_name='账户类型')
holder = CharField(max_length=64, null=True, blank=True, verbose_name='开户人')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
order = IntegerField(default=100, verbose_name='')
order = IntegerField(default=100, verbose_name='')
is_active = BooleanField(default=True, verbose_name='激活状态')
initial_balance_amount = AmountField(default=0, verbose_name='初期余额')
balance_amount = AmountField(default=0, verbose_name='余额')

View file

@ -5,6 +5,14 @@ class NumberResponse(Serializer):
number = CharField(label='编号')
class DownloadResponse(Serializer):
file = FileField(label='Excel文件')
class UploadRequest(Serializer):
file = FileField(label='Excel文件')
__all__ = [
'NumberResponse',
'NumberResponse', 'DownloadResponse', 'UploadRequest',
]

View file

@ -29,6 +29,51 @@ class WarehouseSerializer(BaseSerializer):
return instance
class WarehouseExportSerializer(BaseSerializer):
number = CharField(label='仓库编号')
name = CharField(label='仓库名称')
manager_username = CharField(source='manager.username', label='管理员用户名')
manager_name = CharField(source='manager.name', label='管理员名称')
phone = CharField(label='电话')
address = CharField(label='地址')
remark = CharField(label='备注')
order = IntegerField(label='排序')
is_active = BooleanField(label='激活状态[TRUE/FALSE]')
class Meta:
model = Warehouse
fields = ['number', 'name', 'manager_username', 'manager_name', 'phone', 'address',
'remark', 'order', 'is_active']
class WarehouseImportSerializer(BaseSerializer):
number = CharField(label='仓库编号(必填)')
name = CharField(label='仓库名称(必填)')
manager_username = CharField(required=False, label='管理员用户名')
phone = CharField(required=False, label='电话')
address = CharField(required=False, label='地址')
remark = CharField(required=False, label='备注')
order = IntegerField(required=False, label='排序(默认: 100)')
is_active = BooleanField(required=False, label='激活状态[TRUE/FALSE](默认: TRUE)')
class Meta:
model = Warehouse
fields = ['number', 'name', 'manager_username', 'phone', 'address', 'remark',
'order', 'is_active']
def validate(self, attrs):
if manager_username := attrs.pop('manager_username', None):
manager = User.objects.filter(username=manager_username, team=self.team).first()
if not manager:
raise ValidationError(f'管理员[{manager_username}]不存在')
attrs['manager'] = manager
else:
attrs['manager'] = None
return super().validate(attrs)
class ClientCategorySerializer(BaseSerializer):
class Meta:
@ -40,6 +85,25 @@ class ClientCategorySerializer(BaseSerializer):
self.validate_unique({'name': value}, message=f'名称[{value}]已存在')
return value
class ClientCategoryExportSerializer(BaseSerializer):
name = CharField(label='客户分类名称')
remark = CharField(label='备注')
class Meta:
model = ClientCategory
fields = ['name', 'remark']
class ClientCategoryImportSerializer(BaseSerializer):
name = CharField(label='客户分类名称(必填)')
remark = CharField(required=False, label='备注')
class Meta:
model = ClientCategory
fields = ['name', 'remark']
class ClientSerializer(BaseSerializer):
level_display = CharField(source='get_level_display', read_only=True, label='等级')
category_name = CharField(source='category.name', read_only=True, label='分类名称')
@ -74,6 +138,7 @@ class ClientSerializer(BaseSerializer):
return super().update(instance, validated_data)
class SupplierCategorySerializer(BaseSerializer):
class Meta:
@ -86,6 +151,24 @@ class SupplierCategorySerializer(BaseSerializer):
return value
class SupplierCategoryExportSerializer(BaseSerializer):
name = CharField(label='供应商分类名称')
remark = CharField(label='备注')
class Meta:
model = SupplierCategory
fields = ['name', 'remark']
class SupplierCategoryImportSerializer(BaseSerializer):
name = CharField(label='供应商分类名称(必填)')
remark = CharField(required=False, label='备注')
class Meta:
model = SupplierCategory
fields = ['name', 'remark']
class SupplierSerializer(BaseSerializer):
category_name = CharField(source='category.name', read_only=True, label='分类名称')
@ -163,12 +246,32 @@ class ChargeItemSerializer(BaseSerializer):
return value
class ChargeItemExportSerializer(BaseSerializer):
name = CharField(label='收支项目名称')
type_display = CharField(source='get_type_display', label='收支项目名称')
remark = CharField(label='备注')
class Meta:
model = ChargeItem
fields = ['name', 'remark']
class ChargeItemImportSerializer(BaseSerializer):
name = CharField(label='收支项目名称(必填)')
type = CharField(label='收支类型[income/expenditure](必填)')
remark = CharField(required=False, label='备注')
class Meta:
model = ChargeItem
fields = ['name', 'type', 'remark']
__all__ = [
'WarehouseSerializer',
'ClientCategorySerializer', 'ClientSerializer',
'SupplierCategorySerializer','SupplierSerializer',
'AccountSerializer', 'ChargeItemSerializer',
'ClientCategorySerializer', 'ClientCategoryExportSerializer', 'ClientCategoryImportSerializer',
'ClientSerializer',
'SupplierCategorySerializer', 'SupplierCategoryExportSerializer', 'SupplierCategoryImportSerializer',
'SupplierSerializer',
'AccountSerializer',
'ChargeItemSerializer', 'ChargeItemExportSerializer', 'ChargeItemImportSerializer',
]

View file

@ -11,7 +11,7 @@ from apps.data.models import *
from apps.goods.models import *
class WarehouseViewSet(ModelViewSet, DataProtectMixin):
class WarehouseViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
"""仓库"""
serializer_class = WarehouseSerializer
@ -64,7 +64,7 @@ class WarehouseViewSet(ModelViewSet, DataProtectMixin):
return Response(data=serializer.data, status=status.HTTP_200_OK)
class ClientCategoryViewSet(ModelViewSet):
class ClientCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
"""客户分类"""
serializer_class = ClientCategorySerializer
@ -73,8 +73,49 @@ class ClientCategoryViewSet(ModelViewSet):
ordering_fields = ['id', 'name']
queryset = ClientCategory.objects.all()
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def export(self, request, *args, **kwargs):
"""导出"""
class ClientViewSet(ModelViewSet, DataProtectMixin):
return self.get_export_response(ClientCategoryExportSerializer)
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def import_template(self, request, *args, **kwargs):
"""导入模板"""
return self.get_template_response(ClientCategoryImportSerializer)
@extend_schema(request=UploadRequest, responses={200: ClientCategorySerializer(many=True)})
@action(detail=False, methods=['post'])
@transaction.atomic
def import_data(self, request, *args, **kwargs):
"""导入数据"""
request_serializer = UploadRequest(data=request.data)
request_serializer.is_valid(raise_exception=True)
validated_data = request_serializer.validated_data
client_categories = []
for import_serializer in self.load_data(validated_data['file'], ClientCategoryImportSerializer):
validated_data = import_serializer.validated_data
if client_category := ClientCategory.objects.filter(name=validated_data['name'],
team=self.team).first():
serializer = ClientCategorySerializer(instance=client_category, data=validated_data,
context=self.context)
else:
serializer = ClientCategorySerializer(data=validated_data, context=self.context)
serializer.is_valid(raise_exception=True)
client_category = serializer.save()
client_categories.append(client_category)
serializer = ClientCategorySerializer(instance=client_categories, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
class ClientViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
"""客户"""
serializer_class = ClientSerializer
@ -95,7 +136,7 @@ class ClientViewSet(ModelViewSet, DataProtectMixin):
return Response(data={'number': number}, status=status.HTTP_200_OK)
class SupplierCategoryViewSet(ModelViewSet):
class SupplierCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
"""供应商分类"""
serializer_class = SupplierCategorySerializer
@ -104,8 +145,49 @@ class SupplierCategoryViewSet(ModelViewSet):
ordering_fields = ['id', 'name']
queryset = SupplierCategory.objects.all()
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def export(self, request, *args, **kwargs):
"""导出"""
class SupplierViewSet(ModelViewSet, DataProtectMixin):
return self.get_export_response(SupplierCategoryExportSerializer)
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def import_template(self, request, *args, **kwargs):
"""导入模板"""
return self.get_template_response(SupplierCategoryImportSerializer)
@extend_schema(request=UploadRequest, responses={200: SupplierCategorySerializer(many=True)})
@action(detail=False, methods=['post'])
@transaction.atomic
def import_data(self, request, *args, **kwargs):
"""导入数据"""
request_serializer = UploadRequest(data=request.data)
request_serializer.is_valid(raise_exception=True)
validated_data = request_serializer.validated_data
supplier_categories = []
for import_serializer in self.load_data(validated_data['file'], SupplierCategoryImportSerializer):
validated_data = import_serializer.validated_data
if supplier_category := SupplierCategory.objects.filter(name=validated_data['name'],
team=self.team).first():
serializer = SupplierCategorySerializer(instance=supplier_category, data=validated_data,
context=self.context)
else:
serializer = SupplierCategorySerializer(data=validated_data, context=self.context)
serializer.is_valid(raise_exception=True)
supplier_category = serializer.save()
supplier_categories.append(supplier_category)
serializer = SupplierCategorySerializer(instance=supplier_categories, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
class SupplierViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
"""供应商"""
serializer_class = SupplierSerializer
@ -126,7 +208,7 @@ class SupplierViewSet(ModelViewSet, DataProtectMixin):
return Response(data={'number': number}, status=status.HTTP_200_OK)
class AccountViewSet(ModelViewSet, DataProtectMixin):
class AccountViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
"""结算账户"""
serializer_class = AccountSerializer
@ -146,7 +228,7 @@ class AccountViewSet(ModelViewSet, DataProtectMixin):
return Response(data={'number': number}, status=status.HTTP_200_OK)
class ChargeItemViewSet(ModelViewSet):
class ChargeItemViewSet(ModelViewSet, ExportMixin, ImportMixin):
"""收支项目"""
serializer_class = ChargeItemSerializer
@ -156,6 +238,47 @@ class ChargeItemViewSet(ModelViewSet):
ordering_fields = ['id', 'name']
queryset = ChargeItem.objects.all()
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def export(self, request, *args, **kwargs):
"""导出"""
return self.get_export_response(ChargeItemExportSerializer)
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def import_template(self, request, *args, **kwargs):
"""导入模板"""
return self.get_template_response(ChargeItemImportSerializer)
@extend_schema(request=UploadRequest, responses={200: ChargeItemSerializer(many=True)})
@action(detail=False, methods=['post'])
@transaction.atomic
def import_data(self, request, *args, **kwargs):
"""导入数据"""
request_serializer = UploadRequest(data=request.data)
request_serializer.is_valid(raise_exception=True)
validated_data = request_serializer.validated_data
charge_items = []
for import_serializer in self.load_data(validated_data['file'], ChargeItemImportSerializer):
validated_data = import_serializer.validated_data
if charge_item := ChargeItem.objects.filter(name=validated_data['name'],
team=self.team).first():
serializer = ChargeItemSerializer(instance=charge_item, data=validated_data,
context=self.context)
else:
serializer = ChargeItemSerializer(data=validated_data, context=self.context)
serializer.is_valid(raise_exception=True)
charge_item = serializer.save()
charge_items.append(charge_item)
serializer = ChargeItemSerializer(instance=charge_items, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
__all__ = [
'WarehouseViewSet',

View file

@ -48,7 +48,7 @@ class Goods(Model):
level_price3 = FloatField(verbose_name='等级价三')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
order = IntegerField(default=100, verbose_name='')
order = IntegerField(default=100, verbose_name='')
is_active = BooleanField(default=True, verbose_name='激活状态')
team = ForeignKey('system.Team', on_delete=CASCADE, related_name='goods_set')

View file

@ -5,6 +5,14 @@ class NumberResponse(Serializer):
number = CharField(label='编号')
class DownloadResponse(Serializer):
file = FileField(label='Excel文件')
class UploadRequest(Serializer):
file = FileField(label='Excel文件')
__all__ = [
'NumberResponse',
'NumberResponse', 'DownloadResponse', 'UploadRequest',
]

View file

@ -17,6 +17,24 @@ class GoodsCategorySerializer(BaseSerializer):
return value
class GoodsCategoryExportSerializer(BaseSerializer):
name = CharField(label='商品分类名称')
remark = CharField(label='备注')
class Meta:
model = GoodsCategory
fields = ['name', 'remark']
class GoodsCategoryImportSerializer(BaseSerializer):
name = CharField(label='商品分类名称(必填)')
remark = CharField(required=False, label='备注')
class Meta:
model = GoodsCategory
fields = ['name', 'remark']
class GoodsUnitSerializer(BaseSerializer):
class Meta:
@ -29,6 +47,24 @@ class GoodsUnitSerializer(BaseSerializer):
return value
class GoodsUnitExportSerializer(BaseSerializer):
name = CharField(label='商品单位名称')
remark = CharField(label='备注')
class Meta:
model = GoodsUnit
fields = ['name', 'remark']
class GoodsUnitImportSerializer(BaseSerializer):
name = CharField(label='商品单位名称(必填)')
remark = CharField(required=False, label='备注')
class Meta:
model = GoodsUnit
fields = ['name', 'remark']
class GoodsSerializer(BaseSerializer):
class InventoryItemSerializer(BaseSerializer):
@ -301,6 +337,9 @@ class InventorySerializer(BaseSerializer):
__all__ = [
'GoodsCategorySerializer', 'GoodsUnitSerializer', 'GoodsSerializer', 'GoodsImageSerializer',
'GoodsCategorySerializer', 'GoodsCategoryExportSerializer', 'GoodsCategoryImportSerializer',
'GoodsUnitSerializer', 'GoodsUnitExportSerializer', 'GoodsUnitImportSerializer',
'GoodsSerializer',
'GoodsImageSerializer',
'BatchSerializer', 'InventorySerializer',
]

View file

@ -11,7 +11,7 @@ from apps.goods.models import *
from apps.data.models import *
class GoodsCategoryViewSet(ModelViewSet):
class GoodsCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
"""商品分类"""
serializer_class = GoodsCategorySerializer
@ -20,8 +20,49 @@ class GoodsCategoryViewSet(ModelViewSet):
ordering_fields = ['id', 'name']
queryset = GoodsCategory.objects.all()
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def export(self, request, *args, **kwargs):
"""导出"""
class GoodsUnitViewSet(ModelViewSet):
return self.get_export_response(GoodsCategoryExportSerializer)
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def import_template(self, request, *args, **kwargs):
"""导入模板"""
return self.get_template_response(GoodsCategoryImportSerializer)
@extend_schema(request=UploadRequest, responses={200: GoodsCategorySerializer(many=True)})
@action(detail=False, methods=['post'])
@transaction.atomic
def import_data(self, request, *args, **kwargs):
"""导入数据"""
request_serializer = UploadRequest(data=request.data)
request_serializer.is_valid(raise_exception=True)
validated_data = request_serializer.validated_data
goods_categories = []
for import_serializer in self.load_data(validated_data['file'], GoodsCategoryImportSerializer):
validated_data = import_serializer.validated_data
if goods_category := GoodsCategory.objects.filter(name=validated_data['name'],
team=self.team).first():
serializer = GoodsCategorySerializer(instance=goods_category, data=validated_data,
context=self.context)
else:
serializer = GoodsCategorySerializer(data=validated_data, context=self.context)
serializer.is_valid(raise_exception=True)
goods_category = serializer.save()
goods_categories.append(goods_category)
serializer = GoodsCategorySerializer(instance=goods_categories, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
class GoodsUnitViewSet(ModelViewSet, ExportMixin, ImportMixin):
"""商品单位"""
serializer_class = GoodsUnitSerializer
@ -30,8 +71,49 @@ class GoodsUnitViewSet(ModelViewSet):
ordering_fields = ['id', 'name']
queryset = GoodsUnit.objects.all()
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def export(self, request, *args, **kwargs):
"""导出"""
class GoodsViewSet(ModelViewSet, DataProtectMixin):
return self.get_export_response(GoodsUnitExportSerializer)
@extend_schema(responses={200: DownloadResponse})
@action(detail=False, methods=['get'])
def import_template(self, request, *args, **kwargs):
"""导入模板"""
return self.get_template_response(GoodsUnitImportSerializer)
@extend_schema(request=UploadRequest, responses={200: GoodsUnitSerializer(many=True)})
@action(detail=False, methods=['post'])
@transaction.atomic
def import_data(self, request, *args, **kwargs):
"""导入数据"""
request_serializer = UploadRequest(data=request.data)
request_serializer.is_valid(raise_exception=True)
validated_data = request_serializer.validated_data
goods_units = []
for import_serializer in self.load_data(validated_data['file'], GoodsUnitImportSerializer):
validated_data = import_serializer.validated_data
if goods_unit := GoodsUnit.objects.filter(name=validated_data['name'],
team=self.team).first():
serializer = GoodsUnitSerializer(instance=goods_unit, data=validated_data,
context=self.context)
else:
serializer = GoodsUnitSerializer(data=validated_data, context=self.context)
serializer.is_valid(raise_exception=True)
goods_unit = serializer.save()
goods_units.append(goods_unit)
serializer = GoodsUnitSerializer(instance=goods_units, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
class GoodsViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
"""商品"""
serializer_class = GoodsSerializer