feat:光芯科技 主要修改采购功能

This commit is contained in:
TianyangZhang 2026-04-21 16:05:07 +08:00
parent 159b644126
commit 949620809a
5 changed files with 95 additions and 3 deletions

View File

@ -0,0 +1,46 @@
# Generated by Django 3.2.12 on 2026-04-21 06:27
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0007_alter_dept_create_by_alter_dept_third_info_and_more'),
('mpr', '0005_warehousestock_status'),
]
operations = [
migrations.CreateModel(
name='WareHouse',
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='删除标记')),
('number', models.CharField(max_length=20, verbose_name='库房编号')),
('name', models.CharField(max_length=20, verbose_name='库房名称')),
('place', models.CharField(max_length=50, verbose_name='具体地点')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpr_warehouse_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpr_warehouse_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpr_warehouse_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
migrations.AlterField(
model_name='warehouseentry',
name='warehouse',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entries', to='mpr.warehouse', verbose_name='库房'),
),
migrations.AlterField(
model_name='warehousestock',
name='warehouse',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mpr_stocks', to='mpr.warehouse', verbose_name='库房'),
),
]

View File

@ -1,9 +1,27 @@
from django.db import models from django.db import models
from apps.utils.models import BaseModel, CommonBDModel from apps.utils.models import BaseModel, CommonBDModel, CommonBModel
from datetime import datetime from datetime import datetime
from django.db.models import Max, Sum from django.db.models import Max, Sum
class WareHouse(CommonBModel):
"""
TN:库房信息
"""
number = models.CharField('库房编号', max_length=20)
name = models.CharField('库房名称', max_length=20)
place = models.CharField('具体地点', max_length=50)
create_by = models.ForeignKey(
'system.user', null=True, blank=True, on_delete=models.SET_NULL,
verbose_name='创建人', related_name='mpr_warehouse_create_by')
update_by = models.ForeignKey(
'system.user', null=True, blank=True, on_delete=models.SET_NULL,
verbose_name='最后编辑人', related_name='mpr_warehouse_update_by')
belong_dept = models.ForeignKey(
'system.dept', null=True, blank=True, on_delete=models.SET_NULL,
verbose_name='所属部门', related_name='mpr_warehouse_belong_dept')
def _get_number(model_cls): def _get_number(model_cls):
today_str = datetime.now().strftime('%Y%m%d') today_str = datetime.now().strftime('%Y%m%d')
prefix = model_cls.PREFIX prefix = model_cls.PREFIX
@ -77,7 +95,7 @@ class WarehouseEntry(CommonBDModel):
number = models.CharField('编号', max_length=20, unique=True) number = models.CharField('编号', max_length=20, unique=True)
warehouse = models.ForeignKey( warehouse = models.ForeignKey(
'inm.WareHouse', verbose_name='', WareHouse, verbose_name='',
on_delete=models.CASCADE, related_name='entries') on_delete=models.CASCADE, related_name='entries')
entry_date = models.DateField('入库日期', null=True, blank=True) entry_date = models.DateField('入库日期', null=True, blank=True)
entry_type = models.CharField('入库类型', max_length=20, choices=ENTRY_TYPE_CHOICES, default='raw_normal') entry_type = models.CharField('入库类型', max_length=20, choices=ENTRY_TYPE_CHOICES, default='raw_normal')
@ -123,7 +141,7 @@ class WarehouseStock(BaseModel):
) )
warehouse = models.ForeignKey( warehouse = models.ForeignKey(
'inm.WareHouse', verbose_name='', WareHouse, verbose_name='',
on_delete=models.CASCADE, related_name='mpr_stocks') on_delete=models.CASCADE, related_name='mpr_stocks')
entry = models.ForeignKey( entry = models.ForeignKey(
WarehouseEntry, verbose_name='来源入库单', WarehouseEntry, verbose_name='来源入库单',

View File

@ -7,10 +7,20 @@ from apps.mpr.models import (
PurchaseRequisition, PurchaseRequisitionItem, PurchaseRequisition, PurchaseRequisitionItem,
WarehouseEntry, WarehouseEntryItem, WarehouseStock, WarehouseEntry, WarehouseEntryItem, WarehouseStock,
MaterialRequisition, MaterialRequisitionItem, MaterialRequisition, MaterialRequisitionItem,
WareHouse,
) )
from apps.wf.serializers import TicketSimpleSerializer from apps.wf.serializers import TicketSimpleSerializer
# ========== 库房 ==========
class WareHouseSerializer(CustomModelSerializer):
class Meta:
model = WareHouse
fields = '__all__'
read_only_fields = ['create_time', 'update_time', 'is_deleted']
# ========== 物资申购单 ========== # ========== 物资申购单 ==========
class PurchaseRequisitionItemSerializer(CustomModelSerializer): class PurchaseRequisitionItemSerializer(CustomModelSerializer):

View File

@ -1,6 +1,7 @@
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.mpr.views import ( from apps.mpr.views import (
WareHouseViewSet,
PurchaseRequisitionViewSet, PurchaseRequisitionItemViewSet, PurchaseRequisitionViewSet, PurchaseRequisitionItemViewSet,
WarehouseEntryViewSet, WarehouseEntryItemViewSet, WarehouseEntryViewSet, WarehouseEntryItemViewSet,
WarehouseStockViewSet, WarehouseStockViewSet,
@ -10,6 +11,7 @@ from apps.mpr.views import (
API_BASE_URL = 'api/mpr/' API_BASE_URL = 'api/mpr/'
router = DefaultRouter() router = DefaultRouter()
router.register('warehouse', WareHouseViewSet, basename='mpr_warehouse')
router.register('requisition', PurchaseRequisitionViewSet, basename='requisition') router.register('requisition', PurchaseRequisitionViewSet, basename='requisition')
router.register('requisition_item', PurchaseRequisitionItemViewSet, basename='requisition_item') router.register('requisition_item', PurchaseRequisitionItemViewSet, basename='requisition_item')
router.register('warehouse_entry', WarehouseEntryViewSet, basename='warehouse_entry') router.register('warehouse_entry', WarehouseEntryViewSet, basename='warehouse_entry')

View File

@ -8,8 +8,10 @@ from apps.mpr.models import (
PurchaseRequisition, PurchaseRequisitionItem, PurchaseRequisition, PurchaseRequisitionItem,
WarehouseEntry, WarehouseEntryItem, WarehouseStock, WarehouseEntry, WarehouseEntryItem, WarehouseStock,
MaterialRequisition, MaterialRequisitionItem, MaterialRequisition, MaterialRequisitionItem,
WareHouse,
) )
from apps.mpr.serializers import ( from apps.mpr.serializers import (
WareHouseSerializer,
PurchaseRequisitionListSerializer, PurchaseRequisitionListSerializer,
PurchaseRequisitionDetailSerializer, PurchaseRequisitionDetailSerializer,
PurchaseRequisitionCreateSerializer, PurchaseRequisitionCreateSerializer,
@ -30,6 +32,20 @@ from apps.mpr.filters import (
) )
class WareHouseViewSet(CustomModelViewSet):
"""
库房管理
"""
queryset = WareHouse.objects.all()
serializer_class = WareHouseSerializer
search_fields = ['number', 'name', 'place']
ordering = '-create_time'
perms_map = {
'get': '*', 'post': 'warehouse.create',
'put': 'warehouse.update', 'delete': 'warehouse.delete',
}
class PurchaseRequisitionViewSet(TicketMixin, CustomModelViewSet): class PurchaseRequisitionViewSet(TicketMixin, CustomModelViewSet):
""" """
物资申购单 物资申购单