1
0
forked from erp-dev/erp

feat: added mdy stagging upload to tiia, and change outgoing_date to datetime type

This commit is contained in:
2026-01-22 17:06:23 +08:00
parent 49ac17cf37
commit 7fd44c64aa
18 changed files with 661 additions and 11 deletions

View File

@@ -7,14 +7,18 @@ from rest_framework.response import Response
from rest_framework.permissions import BasePermission
from rest_framework.permissions import DjangoModelPermissions
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from django.core.exceptions import ValidationError
from django.db.models import CharField, Prefetch
from django.db.models.functions import Cast, Coalesce
from django.views.decorators.cache import cache_page
from django.views.decorators.http import condition
from django.utils.decorators import method_decorator
from django.utils import timezone
from django.utils.dateparse import parse_date, parse_datetime
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as django_filters
from django_filters import IsoDateTimeFilter
from datetime import datetime, time, timedelta
from flower.viewsets import LimitedModelViewSet
from printing import models
@@ -75,8 +79,8 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
is_fabric_received = django_filters.BooleanFilter()
is_invalid = django_filters.BooleanFilter()
area = django_filters.CharFilter(lookup_expr='icontains')
outgoing_date_from = django_filters.DateFilter(field_name='outgoing_date', lookup_expr='gte')
outgoing_date_to = django_filters.DateFilter(field_name='outgoing_date', lookup_expr='lte')
outgoing_date_from = django_filters.CharFilter(method='filter_outgoing_date_from')
outgoing_date_to = django_filters.CharFilter(method='filter_outgoing_date_to')
created_date_from = django_filters.DateFilter(field_name='created_at', lookup_expr='gte')
created_date_to = django_filters.DateFilter(field_name='created_at', method='filter_created_date_to')
@@ -84,6 +88,58 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
model = models.PrintingOrder
fields = ['customer', 'is_urgent', 'is_fabric_received', 'is_invalid']
@staticmethod
def _parse_date_or_datetime(value: str | None) -> tuple[datetime | None, bool]:
"""
解析日期/日期时间字符串为“当前时区”的 aware datetime。
返回:
- (dt, has_time)
- has_time=True输入包含时间datetime
- has_time=False输入为纯日期date-only
"""
s = (value or '').strip()
if not s:
return None, False
tz = timezone.get_current_timezone()
# 注意Django 的 parse_datetime 在某些版本会把纯日期YYYY-MM-DD也解析成 00:00:00
# 这会让“to=日期”语义从“包含整天”退化为“<= 当天 00:00:00”。因此这里先尝试 parse_date。
d = parse_date(s)
if d is not None:
dt0 = timezone.make_aware(datetime.combine(d, time.min), tz)
return dt0, False
dt = parse_datetime(s)
if dt is not None:
if timezone.is_naive(dt):
dt = timezone.make_aware(dt, tz)
else:
dt = timezone.localtime(dt, tz)
return dt, True
return None, False
def filter_outgoing_date_from(self, queryset, name, value):
dt, _has_time = self._parse_date_or_datetime(value)
if dt is None:
# 与 DRF/DjangoFilterBackend 行为保持一致:参数非法返回 400
raise ValidationError('outgoing_date_from 必须是日期或日期时间')
return queryset.filter(outgoing_date__gte=dt)
def filter_outgoing_date_to(self, queryset, name, value):
dt, has_time = self._parse_date_or_datetime(value)
if dt is None:
raise ValidationError('outgoing_date_to 必须是日期或日期时间')
# 纯日期:包含整天 => outgoing_date < 次日 00:00:00
if not has_time:
return queryset.filter(outgoing_date__lt=dt + timedelta(days=1))
# 日期时间:按“<=”包含到秒
return queryset.filter(outgoing_date__lte=dt)
def filter_created_date_to(self, queryset, name, value):
"""
过滤 created_at <= 指定日期的 23:59:59.999999