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.'; | ||||
|             END IF; | ||||
|         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. | ||||
|     """ | ||||
|     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: | ||||
|  |  | |||
|  | @ -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 | ||||
|     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 | ||||
|         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"]) | ||||
|         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"]) | ||||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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="新编号") | ||||
|  | @ -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 | ||||
|  | @ -42,6 +42,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu | |||
|             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): | ||||
|         """获取新的编号""" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue