Compare commits
2 Commits
cafecd4d4a
...
48305ed6fb
| Author | SHA1 | Date |
|---|---|---|
|
|
48305ed6fb | |
|
|
949620809a |
|
|
@ -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='库房'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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='来源入库单',
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
物资申购单
|
物资申购单
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue