view
This commit is contained in:
1 parent
3b26ee3f93
commit
f6454c8ae5
1 file changed
+48
-14
+48
-14
@@ -9,13 +9,12 @@ from django.views.decorators.csrf import csrf_exempt
|
|||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.http import Http404, HttpResponseRedirect
|
from django.http import Http404, HttpResponseRedirect
|
||||||
from django.db.models import Count, Sum
|
from django.db.models import Count, Sum, Q, OuterRef, Subquery, Exists
|
||||||
from django.contrib.auth.models import Permission, User
|
from django.contrib.auth.models import Permission, User
|
||||||
from django.contrib.auth import authenticate, login, logout
|
from django.contrib.auth import authenticate, login, logout
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
|
from django.db.models.functions import Coalesce
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.db.models import Q
|
|
||||||
|
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
@@ -573,25 +572,60 @@ def stores(request):
|
|||||||
data = {'all_store': all_store}
|
data = {'all_store': all_store}
|
||||||
return render(request, 'admin_panel/stores.html', data)
|
return render(request, 'admin_panel/stores.html', data)
|
||||||
|
|
||||||
|
|
||||||
@login_required(login_url='/panel/p_login/')
|
@login_required(login_url='/panel/p_login/')
|
||||||
def store(request, s_id):
|
def store(request, s_id):
|
||||||
productCategory = ProductCategory.objects.all()
|
productCategory = ProductCategory.objects.all()
|
||||||
storeO = StoreRoom.objects.get(id=s_id)
|
storeO = StoreRoom.objects.get(id=s_id)
|
||||||
searchStatus = False
|
searchStatus = False
|
||||||
searchQS = request.POST.get('searchQS', '')
|
|
||||||
|
# استفاده از .strip() برای پاکسازی فضاهای خالی احتمالی
|
||||||
|
searchQS = request.POST.get('searchQS', '').strip()
|
||||||
mojodi = request.POST.get('mojodi', '')
|
mojodi = request.POST.get('mojodi', '')
|
||||||
#return HttpResponse(mojodi)
|
|
||||||
if searchQS !='':
|
# ۱. سابکوئری برای دریافت آخرین موجودی در لحظه تراکنش
|
||||||
productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400,product_name__contains=searchQS).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ))
|
# اضافه کردن '-id' به عنوان کلید دوم برای مواقعی که زمانها دقیقاً برابرند
|
||||||
if mojodi == "0":
|
latest_stock_subquery = ProductInStore.objects.filter(
|
||||||
productSum = productSum.filter(mojodi__lte=0)
|
StoreRoom=storeO,
|
||||||
|
Product=OuterRef('pk'),
|
||||||
|
year=1400
|
||||||
|
).order_by('-createdDT', '-id').values('current_stock_at_time')[:1]
|
||||||
|
|
||||||
|
# ۲. کوئری اصلی بهینهسازی شده با Exists (بدون JOIN سنگین و بدون نیاز به distinct)
|
||||||
|
products_qs = Product.objects.filter(
|
||||||
|
Exists(
|
||||||
|
ProductInStore.objects.filter(
|
||||||
|
StoreRoom=storeO,
|
||||||
|
Product=OuterRef('pk'),
|
||||||
|
year=1400
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).annotate(
|
||||||
|
# اگر سابکوئری NULL بود، به صورت پیشفرض مقدار 0 قرار داده میشود
|
||||||
|
mojodi=Coalesce(Subquery(latest_stock_subquery), 0)
|
||||||
|
)
|
||||||
|
|
||||||
|
# ۳. اعمال فیلتر جستجوی نام محصول
|
||||||
|
if searchQS != '':
|
||||||
|
productSum = products_qs.filter(product_name__contains=searchQS)
|
||||||
searchStatus = True
|
searchStatus = True
|
||||||
else:
|
else:
|
||||||
productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ))
|
productSum = products_qs
|
||||||
if mojodi == "0":
|
|
||||||
searchStatus = True
|
# ۴. فیلتر وضعیت موجودی (حالا با خیال راحت روی عدد 0 فیلتر میشود)
|
||||||
productSum = productSum.filter(mojodi__lte=0)
|
if mojodi == "0":
|
||||||
data = {'storeO': storeO,'productSum': productSum, 's_id': s_id, 'searchStatus': searchStatus, "mojodi": mojodi, 'djsearchQS':searchQS, 'productCategory': productCategory}
|
productSum = productSum.filter(mojodi__lte=0)
|
||||||
|
searchStatus = True
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'storeO': storeO,
|
||||||
|
'productSum': productSum,
|
||||||
|
's_id': s_id,
|
||||||
|
'searchStatus': searchStatus,
|
||||||
|
"mojodi": mojodi,
|
||||||
|
'djsearchQS': searchQS,
|
||||||
|
'productCategory': productCategory
|
||||||
|
}
|
||||||
return render(request, 'admin_panel/store.html', data)
|
return render(request, 'admin_panel/store.html', data)
|
||||||
|
|
||||||
@login_required(login_url='/panel/p_login/')
|
@login_required(login_url='/panel/p_login/')
|
||||||
|
|||||||
Reference in new issue
Block a user