Merge branch 'master' of http://gitea.xxhhcty.xyz:8080/zcdsj/factory
This commit is contained in:
commit
95037d2f49
|
|
@ -74,4 +74,4 @@ def clean_timescaledb_job_his(num: int = 30):
|
||||||
RAISE NOTICE 'Table _timescaledb_internal.bgw_job_stat_history not found.';
|
RAISE NOTICE 'Table _timescaledb_internal.bgw_job_stat_history not found.';
|
||||||
END IF;
|
END IF;
|
||||||
END$$;
|
END$$;
|
||||||
""", timeout=300)
|
""", timeout=None)
|
||||||
|
|
@ -10,7 +10,8 @@ def execute_raw_sql(sql: str, params=None, timeout=30):
|
||||||
params (_type_, optional): 参数列表. Defaults to None.
|
params (_type_, optional): 参数列表. Defaults to None.
|
||||||
"""
|
"""
|
||||||
with connection.cursor() as cursor:
|
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:
|
if params:
|
||||||
cursor.execute(sql, params=params)
|
cursor.execute(sql, params=params)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -9,27 +9,28 @@ def main(wprId, mgroup:Mgroup):
|
||||||
data = {}
|
data = {}
|
||||||
mgroup_name = mgroup.name
|
mgroup_name = mgroup.name
|
||||||
mlogbw = Mlogbw.objects.filter(wpr=wpr, mlogb__mlog__submit_time__isnull=False).order_by("-update_time").first()
|
mlogbw = Mlogbw.objects.filter(wpr=wpr, mlogb__mlog__submit_time__isnull=False).order_by("-update_time").first()
|
||||||
data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch
|
if mlogbw:
|
||||||
data[f"{mgroup_name}_日期"] = mlogbw.mlogb.mlog.handle_date.strftime("%Y-%m-%d")
|
data[f"{mgroup_name}_批次号"] = mlogbw.mlogb.batch
|
||||||
ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
|
data[f"{mgroup_name}_日期"] = mlogbw.mlogb.mlog.handle_date.strftime("%Y-%m-%d")
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
|
ftestitems = FtestItem.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
|
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
|
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
|
||||||
for ftestitem in ftestitems:
|
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
|
||||||
data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json
|
for ftestitem in ftestitems:
|
||||||
|
data[f"{mgroup_name}_检测项_{ftestitem.testitem.name}"] = ftestitem.test_val_json
|
||||||
|
|
||||||
ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
|
ftestdefects = FtestDefect.objects.filter(ftest__mlogbw_ftest__wpr=wpr,
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
|
ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup,
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
|
ftest__mlogbw_ftest__mlogb__mlog__submit_time__isnull=False,
|
||||||
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
|
ftest__mlogbw_ftest__mlogb__mlog__is_fix=False)
|
||||||
for ftestdefect in ftestdefects:
|
for ftestdefect in ftestdefects:
|
||||||
data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0
|
data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0
|
||||||
|
|
||||||
old_data:dict = wpr.data
|
old_data:dict = wpr.data
|
||||||
if old_data:
|
if old_data:
|
||||||
for item in list(old_data.keys()):
|
for item in list(old_data.keys()):
|
||||||
if f'{mgroup_name}_' in item:
|
if f'{mgroup_name}_' in item:
|
||||||
del old_data[item]
|
del old_data[item]
|
||||||
old_data.update(data)
|
old_data.update(data)
|
||||||
wpr.data = old_data
|
wpr.data = old_data
|
||||||
wpr.save(update_fields=["data"])
|
wpr.save(update_fields=["data"])
|
||||||
|
|
@ -28,6 +28,11 @@ from apps.utils.lock import lock_model_record_d_func
|
||||||
|
|
||||||
myLogger = logging.getLogger('log')
|
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):
|
def generate_new_batch(old_batch: str, mlog: Mlog):
|
||||||
new_batch = old_batch
|
new_batch = old_batch
|
||||||
supplier = mlog.supplier
|
supplier = mlog.supplier
|
||||||
|
|
@ -372,6 +377,8 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
if item.wpr:
|
if item.wpr:
|
||||||
Wpr.change_or_new(wpr=item.wpr, wm=wm, ftest=item.ftest)
|
Wpr.change_or_new(wpr=item.wpr, wm=wm, ftest=item.ftest)
|
||||||
else:
|
else:
|
||||||
|
if not check_wpr_number(item.number):
|
||||||
|
raise ParseError(f'{item.number} 该编号格式有误')
|
||||||
wpr_from = None
|
wpr_from = None
|
||||||
if item.mlogbw_from:
|
if item.mlogbw_from:
|
||||||
wpr_from = item.mlogbw_from.wpr
|
wpr_from = item.mlogbw_from.wpr
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,7 @@ from django.db.models import Prefetch
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
|
from django.db.models.functions import Substr, Length
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
@ -948,6 +949,10 @@ class MlogbInViewSet(BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyMode
|
||||||
c_year2 = str(c_year)[-2:]
|
c_year2 = str(c_year)[-2:]
|
||||||
c_month = handle_date.month
|
c_month = handle_date.month
|
||||||
m_model = material_out.model
|
m_model = material_out.model
|
||||||
|
if m_model is None:
|
||||||
|
raise ParseError("生成编号出错:产品型号不能为空")
|
||||||
|
elif m_model and m_model.islower():
|
||||||
|
raise ParseError("生成编号出错:产品型号不能为小写")
|
||||||
# 按生产日志查询
|
# 按生产日志查询
|
||||||
wpr = (
|
wpr = (
|
||||||
Wpr.objects.filter(
|
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__year=c_year,
|
||||||
wpr_mlogbw__mlogb__mlog__handle_date__month=c_month,
|
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()
|
.last()
|
||||||
)
|
)
|
||||||
cq_w = 4
|
cq_w = 4
|
||||||
|
|
|
||||||
|
|
@ -51,3 +51,7 @@ class WproutSerializer(serializers.Serializer):
|
||||||
class WproutListSerializer(serializers.Serializer):
|
class WproutListSerializer(serializers.Serializer):
|
||||||
items = WproutSerializer(many=True)
|
items = WproutSerializer(many=True)
|
||||||
|
|
||||||
|
|
||||||
|
class WprChangeNumberSerializer(serializers.Serializer):
|
||||||
|
old_number = serializers.CharField(label="原编号")
|
||||||
|
new_number = serializers.CharField(label="新编号")
|
||||||
|
|
@ -3,7 +3,7 @@ from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
|
||||||
from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin
|
from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin
|
||||||
|
|
||||||
from apps.wpmw.models import Wpr, WprDefect
|
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 rest_framework.response import Response
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
|
|
@ -42,6 +42,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu
|
||||||
qs.exclude(mb=None, wm=None)
|
qs.exclude(mb=None, wm=None)
|
||||||
return qs
|
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)
|
@action(methods=["post"], detail=False, perms_map={"post": "*"}, serializer_class=WprNewSerializer)
|
||||||
def new_number(self, request, *args, **kwargs):
|
def new_number(self, request, *args, **kwargs):
|
||||||
"""获取新的编号"""
|
"""获取新的编号"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue