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)
|
|
|
|
|
|
|
|
|
|
|
|
|