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.urls import reverse
|
||||
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 import authenticate, login, logout
|
||||
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.db.models import Q
|
||||
|
||||
from .models import *
|
||||
|
||||
@@ -573,25 +572,60 @@ def stores(request):
|
||||
data = {'all_store': all_store}
|
||||
return render(request, 'admin_panel/stores.html', data)
|
||||
|
||||
|
||||
@login_required(login_url='/panel/p_login/')
|
||||
def store(request, s_id):
|
||||
productCategory = ProductCategory.objects.all()
|
||||
storeO = StoreRoom.objects.get(id=s_id)
|
||||
searchStatus = False
|
||||
searchQS = request.POST.get('searchQS', '')
|
||||
|
||||
# استفاده از .strip() برای پاکسازی فضاهای خالی احتمالی
|
||||
searchQS = request.POST.get('searchQS', '').strip()
|
||||
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') ))
|
||||
if mojodi == "0":
|
||||
productSum = productSum.filter(mojodi__lte=0)
|
||||
|
||||
# ۱. سابکوئری برای دریافت آخرین موجودی در لحظه تراکنش
|
||||
# اضافه کردن '-id' به عنوان کلید دوم برای مواقعی که زمانها دقیقاً برابرند
|
||||
latest_stock_subquery = ProductInStore.objects.filter(
|
||||
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
|
||||
else:
|
||||
productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ))
|
||||
if mojodi == "0":
|
||||
searchStatus = True
|
||||
productSum = productSum.filter(mojodi__lte=0)
|
||||
data = {'storeO': storeO,'productSum': productSum, 's_id': s_id, 'searchStatus': searchStatus, "mojodi": mojodi, 'djsearchQS':searchQS, 'productCategory': productCategory}
|
||||
productSum = products_qs
|
||||
|
||||
# ۴. فیلتر وضعیت موجودی (حالا با خیال راحت روی عدد 0 فیلتر میشود)
|
||||
if mojodi == "0":
|
||||
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)
|
||||
|
||||
@login_required(login_url='/panel/p_login/')
|
||||
|
||||
Reference in new issue
Block a user