feat: 查询-n批次从正则改用like以优化性能

This commit is contained in:
caoqianming 2026-01-09 15:55:56 +08:00
parent e2a92b6faa
commit 43abcbaa48
2 changed files with 61 additions and 39 deletions

View File

@ -17,6 +17,8 @@ import re
from django.db.models import Q from django.db.models import Q
import django.utils.timezone as timezone import django.utils.timezone as timezone
from apps.utils.sql import query_all_dict from apps.utils.sql import query_all_dict
import logging
myLogger = logging.getLogger('log')
# Create your models here. # Create your models here.
class SfLog(CommonADModel): class SfLog(CommonADModel):
@ -837,41 +839,46 @@ class BatchLog(BaseModel):
@classmethod @classmethod
def batches_to(cls, batch:str): def batches_to(cls, batch:str):
# query = """
# SELECT batch FROM wpm_batchst
# WHERE batch ~ %s
# """
query = """ query = """
SELECT batch SELECT
batch,
CAST(substring(batch FROM LENGTH(%s) + 2) AS INTEGER) AS batch_num
FROM wpm_batchst FROM wpm_batchst
WHERE batch ~ %s WHERE batch LIKE %s AND translate(
ORDER BY substring(batch FROM LENGTH(%s) + 2),
-- 先按前缀部分排序例如 'A' '0123456789',
SUBSTRING(batch FROM '^(.*)-') DESC, ''
-- 再按后缀的数值部分排序 '2', '11' 转为整数 ) = ''
CAST(SUBSTRING(batch FROM '-([0-9]+)$') AS INTEGER) DESC ORDER BY batch_num DESC
""" # 排序可在sql层处理
query_ = """SELECT batch FROM wpm_batchst WHERE batch ~ %s"""
pattern = f'^{batch}-[0-9]+$'
"""可以用如下方法直接查询
""" """
# batches = BatchLog.objects.filter(source__batch=batch, relation_type="split").values_list("target__batch", flat=True).distinct()
# batches = sorted(list(batches), key=custom_key) prefix = batch
batches_r = query_all_dict(query_, params=(pattern,)) params = (
batches = [b["batch"] for b in batches_r] prefix,
batches = sorted(list(batches), key=custom_key) f"{prefix}-%",
last_batch_num = None prefix
if batches: )
last_batch = batches[-1]
last_batch_list = last_batch.split("-")
if last_batch_list:
try: try:
last_batch_num = int(last_batch_list[-1]) rows = query_all_dict(query, params=params)
except Exception: except Exception as e:
pass myLogger.error(f"BatchLog.batches_to error: {(str(e), query, params)}")
return {"batches": batches, "last_batch_num": last_batch_num, "last_batch": last_batch} raise
return {"batches": [], "last_batch_num": None, "last_batch": None}
if not rows:
return {
"batches": [],
"last_batch_num": None,
"last_batch": None,
}
batches = [r["batch"] for r in rows]
last = rows[0]
return {
"batches": batches,
"last_batch_num": last["batch_num"],
"last_batch": last["batch"],
}

View File

@ -92,11 +92,20 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
# 使用原始sql # 使用原始sql
query = """ query = """
SELECT id, number_out FROM wpmw_wpr SELECT id, number_out FROM wpmw_wpr
WHERE number_out ~ %s order by number_out desc limit 1 WHERE number_out LIKE %s
AND translate(
substring(number_out FROM LENGTH(%s) + 2),
'0123456789',
''
) = ''
order by number_out desc limit 1
""" """
pattern = f"^{prefix}[0-9]+$" params = (
f"{prefix}-%",
prefix
)
number_outs = [] number_outs = []
wpr_qs_last = query_one_dict(query, [pattern]) wpr_qs_last = query_one_dict(query, [params])
if wpr_qs_last: if wpr_qs_last:
number_outs.append(wpr_qs_last["number_out"]) number_outs.append(wpr_qs_last["number_out"])
# 查找未出库的记录 # 查找未出库的记录
@ -106,9 +115,15 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
query2 = """ query2 = """
select mioitemw.id, mioitemw.number_out from inm_mioitemw mioitemw left join inm_mioitem mioitem on mioitem.id = mioitemw.mioitem_id select mioitemw.id, mioitemw.number_out from inm_mioitemw mioitemw left join inm_mioitem mioitem on mioitem.id = mioitemw.mioitem_id
left join inm_mio mio on mio.id = mioitem.mio_id left join inm_mio mio on mio.id = mioitem.mio_id
where mio.submit_time is null and mioitemw.number_out ~ %s order by mioitemw.number_out desc limit 1 where mio.submit_time is null and mioitemw.number_out LIKE %s
AND translate(
substring(mioitemw.number_out FROM LENGTH(%s) + 2),
'0123456789',
''
) = ''
order by mioitemw.number_out desc limit 1
""" """
mioitemw_last = query_one_dict(query2, [pattern]) mioitemw_last = query_one_dict(query2, [params])
if mioitemw_last: if mioitemw_last:
number_outs.append(mioitemw_last["number_out"]) number_outs.append(mioitemw_last["number_out"])
if number_outs: if number_outs: