From 1537da6bda80443fa40f7a9b413bb757f1c76698 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 4 Jul 2023 10:07:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0fim=20app;=20?= =?UTF-8?q?=E8=B4=B9=E7=94=A8=E5=8F=8A=E6=88=90=E6=9C=AC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/fim/__init__.py | 0 apps/fim/admin.py | 7 +++ apps/fim/apps.py | 7 +++ apps/fim/migrations/0001_initial.py | 71 +++++++++++++++++++++++++++++ apps/fim/migrations/__init__.py | 0 apps/fim/models.py | 26 +++++++++++ apps/fim/serializers.py | 26 +++++++++++ apps/fim/tests.py | 3 ++ apps/fim/urls.py | 14 ++++++ apps/fim/views.py | 26 +++++++++++ server/settings.py | 3 +- server/urls.py | 1 + 12 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 apps/fim/__init__.py create mode 100644 apps/fim/admin.py create mode 100644 apps/fim/apps.py create mode 100644 apps/fim/migrations/0001_initial.py create mode 100644 apps/fim/migrations/__init__.py create mode 100644 apps/fim/models.py create mode 100644 apps/fim/serializers.py create mode 100644 apps/fim/tests.py create mode 100644 apps/fim/urls.py create mode 100644 apps/fim/views.py diff --git a/apps/fim/__init__.py b/apps/fim/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/fim/admin.py b/apps/fim/admin.py new file mode 100644 index 00000000..6ba925f0 --- /dev/null +++ b/apps/fim/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from apps.fim.models import Fee +# Register your models here. + +@admin.register(Fee) +class FeeAdmin(admin.ModelAdmin): + list_display = ('id', 'name', 'cate', 'element') diff --git a/apps/fim/apps.py b/apps/fim/apps.py new file mode 100644 index 00000000..4daf5d3e --- /dev/null +++ b/apps/fim/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class FimConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.fim' + verbose_name = '财务管理' diff --git a/apps/fim/migrations/0001_initial.py b/apps/fim/migrations/0001_initial.py new file mode 100644 index 00000000..6eeac938 --- /dev/null +++ b/apps/fim/migrations/0001_initial.py @@ -0,0 +1,71 @@ +# Generated by Django 3.2.12 on 2023-07-04 01:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0003_mgroup_input_materials'), + ] + + operations = [ + migrations.CreateModel( + name='Fee', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, 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='删除标记')), + ('name', models.CharField(max_length=20, verbose_name='名称')), + ('cate', models.CharField(max_length=20, verbose_name='父名称')), + ('element', models.CharField(help_text='直接材料/直接人工/制造费用', max_length=20, verbose_name='要素')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PriceSet', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, 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='删除标记')), + ('year', models.PositiveSmallIntegerField(verbose_name='年份')), + ('month', models.PositiveSmallIntegerField(verbose_name='月份')), + ('price_unit', models.FloatField(blank=True, null=True, verbose_name='单价')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='priceset_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联物料')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='priceset_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='FeeSet', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, 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='删除标记')), + ('year', models.PositiveSmallIntegerField(verbose_name='年份')), + ('month', models.PositiveSmallIntegerField(verbose_name='月份')), + ('cost_unit', models.FloatField(verbose_name='单位成本')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='feeset_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('fee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fim.fee', verbose_name='关联费用')), + ('mgroup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.mgroup', verbose_name='关联工段')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='feeset_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/fim/migrations/__init__.py b/apps/fim/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/fim/models.py b/apps/fim/models.py new file mode 100644 index 00000000..a6608fbb --- /dev/null +++ b/apps/fim/models.py @@ -0,0 +1,26 @@ +from django.db import models +from apps.mtm.models import Mgroup, Material +from apps.utils.models import CommonADModel, BaseModel +from apps.mtm.models import Mgroup +from apps.wpm.models import SfLog +# Create your models here. + +class Fee(BaseModel): + name = models.CharField('名称', max_length=20) + cate = models.CharField('父名称', max_length=20) + element = models.CharField('要素', max_length=20, help_text='直接材料/直接人工/制造费用') + + +class FeeSet(CommonADModel): + year = models.PositiveSmallIntegerField('年份') + month = models.PositiveSmallIntegerField('月份') + mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE) + fee = models.ForeignKey(Fee, verbose_name='关联费用', on_delete=models.CASCADE) + cost_unit = models.FloatField('单位成本') + + +class PriceSet(CommonADModel): + year = models.PositiveSmallIntegerField('年份') + month = models.PositiveSmallIntegerField('月份') + material = models.ForeignKey('mtm.material', on_delete=models.CASCADE, verbose_name='关联物料') + price_unit = models.FloatField('单价', null=True, blank=True) \ No newline at end of file diff --git a/apps/fim/serializers.py b/apps/fim/serializers.py new file mode 100644 index 00000000..935a1f62 --- /dev/null +++ b/apps/fim/serializers.py @@ -0,0 +1,26 @@ +from rest_framework import serializers +from apps.utils.serializers import CustomModelSerializer +from apps.utils.constants import EXCLUDE_FIELDS +from apps.fim.models import PriceSet, FeeSet, Fee + +class FeeSerializer(CustomModelSerializer): + class Meta: + model = Fee + fields = '__all__' + + +class FeeSetSerializer(CustomModelSerializer): + mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) + fee_ = FeeSerializer(source='fee', read_only=True) + class Meta: + model = FeeSet + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS + + +class PriceSetSerializer(CustomModelSerializer): + material_name = serializers.CharField(source='material.name', read_only=True) + class Meta: + model = PriceSet + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS \ No newline at end of file diff --git a/apps/fim/tests.py b/apps/fim/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/fim/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/fim/urls.py b/apps/fim/urls.py new file mode 100644 index 00000000..ab13ce98 --- /dev/null +++ b/apps/fim/urls.py @@ -0,0 +1,14 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from apps.fim.views import (PriceSetViewSet, FeeSetViewSet, FeeViewSet) + +API_BASE_URL = 'api/fim/' +HTML_BASE_URL = 'fim/' + +router = DefaultRouter() +router.register('priceset', PriceSetViewSet, basename='priceset') +router.register('feeset', FeeSetViewSet, basename='feeset') +router.register('fee', FeeViewSet, basename='fee') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] \ No newline at end of file diff --git a/apps/fim/views.py b/apps/fim/views.py new file mode 100644 index 00000000..675393cc --- /dev/null +++ b/apps/fim/views.py @@ -0,0 +1,26 @@ +from apps.fim.models import PriceSet, FeeSet, Fee +from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet +from rest_framework.mixins import ListModelMixin, UpdateModelMixin +from apps.fim.serializers import (PriceSetSerializer, FeeSetSerializer, FeeSerializer) + +# Create your views here. +class FeeViewSet(ListModelMixin, CustomGenericViewSet): + perms_map = {'get': '*'} + serializer_class = FeeSerializer + queryset = Fee.objects.all() + + +class PriceSetViewSet(CustomModelViewSet): + queryset = PriceSet.objects.all() + serializer_class = PriceSetSerializer + select_related_fields = ['material'] + filterset_fields = ['material', 'year', 'month'] + search_fields = ['material__name'] + + +class FeeSetViewSet(CustomModelViewSet): + queryset = FeeSet.objects.all() + serializer_class = FeeSetSerializer + select_related_fields = ['fee', 'mgroup'] + filterset_fields = ['fee', 'mgroup', 'year', 'month'] + search_fields = ['fee__name', 'mgroup__name'] \ No newline at end of file diff --git a/server/settings.py b/server/settings.py index 5eee73ff..0b5cf7eb 100755 --- a/server/settings.py +++ b/server/settings.py @@ -101,7 +101,8 @@ INSTALLED_APPS = [ 'apps.mtm', 'apps.wpm', 'apps.qm', - 'apps.enm' + 'apps.enm', + 'apps.fim' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index ff35098e..c26af812 100755 --- a/server/urls.py +++ b/server/urls.py @@ -60,6 +60,7 @@ urlpatterns = [ path('', include('apps.wpm.urls')), path('', include('apps.qm.urls')), path('', include('apps.enm.urls')), + path('', include('apps.fim.urls')),