This commit is contained in:
TianyangZhang 2025-10-28 16:56:27 +08:00
commit 95037d2f49
7 changed files with 67 additions and 28 deletions

View File

@ -74,4 +74,4 @@ def clean_timescaledb_job_his(num: int = 30):
RAISE NOTICE 'Table _timescaledb_internal.bgw_job_stat_history not found.';
END IF;
END$$;
""", timeout=300)
""", timeout=None)

View File

@ -10,7 +10,8 @@ def execute_raw_sql(sql: str, params=None, timeout=30):
params (_type_, optional): 参数列表. Defaults to None.
"""
with connection.cursor() as cursor:
cursor.execute(f"SET statement_timeout TO '{int(timeout*1000)}ms';")
if timeout:
cursor.execute(f"SET statement_timeout TO '{int(timeout*1000)}ms';")
if params:
cursor.execute(sql, params=params)
else:

View File

@ -9,27 +9,28 @@ def main(wprId, mgroup:Mgroup):
data = {}
mgroup_name = mgroup.name
mlogbw = Mlogbw.objects.filter(wpr=wpr, mlogb__mlog__submit_time__isnull=False).order_by("-update_time").first()
data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch
data[f"{mgroup_name}_日期"] = mlogbw.mlogb.mlog.handle_date.strftime("%Y-%m-%d")
ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
for ftestitem in ftestitems:
data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json
ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
for ftestdefect in ftestdefects:
data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0
old_data:dict = wpr.data
if old_data:
for item in list(old_data.keys()):
if f'{mgroup_name}_' in item:
del old_data[item]
old_data.update(data)
wpr.data = old_data
wpr.save(update_fields=["data"])
if mlogbw:
data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch
data[f"{mgroup_name}_日期"] = mlogbw.mlogb.mlog.handle_date.strftime("%Y-%m-%d")
ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
for ftestitem in ftestitems:
data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json
ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
for ftestdefect in ftestdefects:
data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0
old_data:dict = wpr.data
if old_data:
for item in list(old_data.keys()):
if f'{mgroup_name}_' in item:
del old_data[item]
old_data.update(data)
wpr.data = old_data
wpr.save(update_fields=["data"])

View File

@ -28,6 +28,11 @@ from apps.utils.lock import lock_model_record_d_func
myLogger = logging.getLogger('log')
def check_wpr_number(number: str):
return (len(number) >= 5 and
number[-4:].isdigit() and
not any(char.islower() for char in number))
def generate_new_batch(old_batch: str, mlog: Mlog):
new_batch = old_batch
supplier = mlog.supplier
@ -372,6 +377,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if item.wpr:
Wpr.change_or_new(wpr=item.wpr, wm=wm, ftest=item.ftest)
else:
if not check_wpr_number(item.number):
raise ParseError(f'{item.number} 该编号格式有误')
wpr_from = None
if item.mlogbw_from:
wpr_from = item.mlogbw_from.wpr

View File

@ -65,6 +65,7 @@ from django.db.models import Prefetch
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from django.db import connection
from django.db.models.functions import Substr, Length
# Create your views here.
@ -948,6 +949,10 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode
c_year2 = str(c_year)[-2:]
c_month = handle_date.month
m_model = material_out.model
if m_model is None:
raise ParseError("生成编号出错:产品型号不能为空")
elif m_model and m_model.islower():
raise ParseError("生成编号出错:产品型号不能为小写")
# 按生产日志查询
wpr = (
Wpr.objects.filter(
@ -958,7 +963,8 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode
wpr_mlogbw__mlogb__mlog__handle_date__year=c_year,
wpr_mlogbw__mlogb__mlog__handle_date__month=c_month,
)
.order_by("number")
.annotate(last_four=Substr("number", Length("number")-3))
.order_by("last_four")
.last()
)
cq_w = 4

View File

@ -51,3 +51,7 @@ class WproutSerializer(serializers.Serializer):
class WproutListSerializer(serializers.Serializer):
items = WproutSerializer(many=True)
class WprChangeNumberSerializer(serializers.Serializer):
old_number = serializers.CharField(label="原编号")
new_number = serializers.CharField(label="新编号")

View File

@ -3,7 +3,7 @@ from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin
from apps.wpmw.models import Wpr, WprDefect
from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer
from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer, WprChangeNumberSerializer
from rest_framework.response import Response
from apps.mtm.models import Material
from rest_framework.exceptions import ParseError
@ -41,6 +41,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
else:
qs.exclude(mb=None, wm=None)
return qs
@action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprChangeNumberSerializer)
@transaction.atomic
def change_number(self, request, *args, **kwargs):
"""修改编号"""
sr = WprChangeNumberSerializer(data=request.data)
sr.is_valid(raise_exception=True)
vdata = sr.validated_data
new_number = vdata["new_number"]
old_number = vdata["old_number"]
if Wpr.objects.filter(number=new_number).exists():
raise ParseError("新编号已存在,不可使用")
wpr = Wpr.objects.get(number=old_number)
from apps.wpm.models import Mlogbw, Handoverbw
from apps.inm.models import MIOItemw
Wpr.objects.filter(id=wpr.id).update(number=new_number)
Mlogbw.objects.filter(wpr=wpr).update(number=new_number)
Handoverbw.objects.filter(wpr=wpr).update(number=new_number)
MIOItemw.objects.filter(wpr=wpr).update(number=new_number)
return Response()
@action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprNewSerializer)
def new_number(self, request, *args, **kwargs):