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, |          | ||||||
|                                     ftest__mlogbw_ftest__mlogb__mlog__mgroup=mgroup, |         ftestdefects = FtestDefect.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 ftestdefect in ftestdefects: |                                         ftest__mlogbw_ftest__mlogb__mlog__is_fix=False) | ||||||
|         data[f"{mgroup_name}_缺陷项_{ftestdefect.defect.name}"] = 1 if ftestdefect.has is True else 0 |         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: |         old_data:dict = wpr.data | ||||||
|         for item in list(old_data.keys()): |         if old_data: | ||||||
|             if f'{mgroup_name}_' in item: |             for item in list(old_data.keys()): | ||||||
|                 del old_data[item] |                 if f'{mgroup_name}_' in item: | ||||||
|     old_data.update(data) |                     del old_data[item] | ||||||
|     wpr.data = old_data |         old_data.update(data) | ||||||
|     wpr.save(update_fields=["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') | 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 | ||||||
|  | @ -41,6 +41,26 @@ class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, Cu | ||||||
|         else: |         else: | ||||||
|             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