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
FROM wpm_batchst batch,
WHERE batch ~ %s CAST(substring(batch FROM LENGTH(%s) + 2) AS INTEGER) AS batch_num
ORDER BY FROM wpm_batchst
-- 先按前缀部分排序例如 'A' WHERE batch LIKE %s AND translate(
SUBSTRING(batch FROM '^(.*)-') DESC, substring(batch FROM LENGTH(%s) + 2),
-- 再按后缀的数值部分排序 '2', '11' 转为整数 '0123456789',
CAST(SUBSTRING(batch FROM '-([0-9]+)$') AS INTEGER) DESC ''
""" # 排序可在sql层处理 ) = ''
query_ = """SELECT batch FROM wpm_batchst WHERE batch ~ %s""" ORDER BY batch_num DESC
pattern = f'^{batch}-[0-9]+$' """
"""可以用如下方法直接查询 prefix = batch
""" params = (
# batches = BatchLog.objects.filter(source__batch=batch, relation_type="split").values_list("target__batch", flat=True).distinct() prefix,
# batches = sorted(list(batches), key=custom_key) f"{prefix}-%",
batches_r = query_all_dict(query_, params=(pattern,)) prefix
batches = [b["batch"] for b in batches_r] )
batches = sorted(list(batches), key=custom_key)
last_batch_num = None try:
if batches: rows = query_all_dict(query, params=params)
last_batch = batches[-1] except Exception as e:
last_batch_list = last_batch.split("-") myLogger.error(f"BatchLog.batches_to error: {(str(e), query, params)}")
if last_batch_list: raise
try:
last_batch_num = int(last_batch_list[-1]) if not rows:
except Exception: return {
pass "batches": [],
return {"batches": batches, "last_batch_num": last_batch_num, "last_batch": last_batch} "last_batch_num": None,
return {"batches": [], "last_batch_num": None, "last_batch": 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: