90 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
from rest_framework.views import APIView
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
from drf_yasg.utils import swagger_auto_schema
 | 
						|
from apps.mtm.models import Mgroup
 | 
						|
from apps.wpm.serializers import BatchMgroupSerializer
 | 
						|
from apps.wpm.models import WMaterial, Mlogb
 | 
						|
from django.db.models import Q, Sum, F, ExpressionWrapper
 | 
						|
from collections import defaultdict
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class BatchWorkView(APIView):
 | 
						|
    perms_map = {"post": "*"}
 | 
						|
 | 
						|
    @swagger_auto_schema(
 | 
						|
        operation_summary='工段批次加工进度',
 | 
						|
        request_body=BatchMgroupSerializer,
 | 
						|
        responses={200: []},
 | 
						|
    )
 | 
						|
    def post(self, request):
 | 
						|
        sr = BatchMgroupSerializer(data=request.data)
 | 
						|
        sr.is_valid(raise_exception=True)
 | 
						|
        vdata = sr.validated_data
 | 
						|
        try:
 | 
						|
            mgroup:Mgroup = Mgroup.objects.get(name=vdata['mgroup_name'])
 | 
						|
        except Exception:
 | 
						|
            raise ParseError(f"获取工段信息失败-{vdata['mgroup_name']}")
 | 
						|
        matoutIds = mgroup.process.get_canout_mat_ids()
 | 
						|
 | 
						|
 | 
						|
        # 待加工的批次
 | 
						|
        wm_qs = WMaterial.objects.filter(mgroup=mgroup, count__gt=0)
 | 
						|
        wm_todo_qs = wm_qs.filter(state=WMaterial.WM_OK).exclude(material__id__in=matoutIds)|wm_qs.filter(state=WMaterial.WM_REPAIR)
 | 
						|
        wm_v = wm_todo_qs.order_by("batch").values("count", "batch", wmid=F("id"))
 | 
						|
 | 
						|
        # 对应的操作子日志投入
 | 
						|
        mlogb_qs = Mlogb.objects.filter(mlog__mgroup=mgroup, wm_in__in=wm_todo_qs)
 | 
						|
        mlogb_qs_v = mlogb_qs.values("count_use", "mlog__submit_time", wmid=F("wm_in__id"))
 | 
						|
 | 
						|
        # 对应的操作子日志产出
 | 
						|
        mlogb_qs2 = Mlogb.objects.filter(mlogb_from__in=mlogb_qs)
 | 
						|
        mlogb_qs2_v = mlogb_qs2.values("count_real", "count_ok", "mlog__submit_time", wmid=F("mlogb_from__wm_in__id"))
 | 
						|
 | 
						|
        # 1. 处理wm_v - 原始物料数据
 | 
						|
        wm_dict = {item['wmid']: {'count': item['count'], 'batch': item['batch']} for item in wm_v}
 | 
						|
 | 
						|
        # 2. 处理mlogb_qs_v - 物料使用数据
 | 
						|
        use_dict = defaultdict(lambda: {'count_use': 0, 'count_use_submit': 0, 'count_use_unsubmit': 0})
 | 
						|
        for item in mlogb_qs_v:
 | 
						|
            wmid = item['wmid']
 | 
						|
            if item['mlog__submit_time']:
 | 
						|
                use_dict[wmid]['count_use_submit'] += item['count_use']
 | 
						|
            else:
 | 
						|
                use_dict[wmid]['count_use_unsubmit'] += item['count_use']
 | 
						|
            use_dict[wmid]['count_use'] += item['count_use']
 | 
						|
 | 
						|
        # 3. 处理mlogb_qs2_v - 物料产出数据
 | 
						|
        output_dict = defaultdict(lambda: {'count_real': 0, 'count_ok': 0})
 | 
						|
        for item in mlogb_qs2_v:
 | 
						|
            if item['mlog__submit_time']:  # 只统计已提交的记录
 | 
						|
                wmid = item['wmid']
 | 
						|
                output_dict[wmid]['count_real'] += item['count_real']
 | 
						|
                output_dict[wmid]['count_ok'] += item['count_ok']
 | 
						|
 | 
						|
        # 合并所有数据
 | 
						|
        result = []
 | 
						|
        for wmid, wm_data in wm_dict.items():
 | 
						|
            use_data = use_dict.get(wmid, {})
 | 
						|
            output_data = output_dict.get(wmid, {})
 | 
						|
            
 | 
						|
            count = wm_data['count']
 | 
						|
            
 | 
						|
            row = {
 | 
						|
                'wmid': wmid,
 | 
						|
                'batch': wm_data['batch'],
 | 
						|
                'count_todo': count - use_data.get('count_use_unsubmit', 0),
 | 
						|
                'count_working': use_data.get('count_use_unsubmit', 0),
 | 
						|
                'count_real': output_data.get('count_real', 0),
 | 
						|
                'count_ok': output_data.get('count_ok', 0),
 | 
						|
                'count': count
 | 
						|
            }
 | 
						|
            result.append(row)
 | 
						|
        return Response(result)
 | 
						|
 | 
						|
        
 | 
						|
        
 | 
						|
        
 | 
						|
            
 | 
						|
             |