from apps.wpm.models import Mlog, BatchSt from apps.mtm.models import Mgroup from apps.system.models import Dept from apps.inm.models import MIOItem from apps.qm.models import FtestWork from django.utils import timezone from datetime import datetime def get_alldata_with_batch_and_store(batch: str): """ 获取某个批次某个仓库的整体生产数据并保存 """ last_time, data = get_alldata_with_batch(batch) bobj, _ = BatchSt.objects.get_or_create(batch=batch, defaults={ "last_time": last_time }) bobj.last_time = last_time bobj.data = data bobj.save() def get_alldata_with_batch(batch: str): """ 获取某个批次的整体生产数据 """ last_time = timezone.make_aware(datetime(1990, 4, 4, 0, 0, 0)) data = {"产品批次编号": batch} dept7 = Dept.objects.get(name='7车间') dept6 = Dept.objects.get(name='6车间') mgroup_blcx = Mgroup.objects.get(name="棒料成型") mlogs_blcx_qs = Mlog.objects.filter(submit_time__isnull=False, mgroup=mgroup_blcx, batch=batch) mlog_count_fields = Mlog.count_fields() if mlogs_blcx_qs.exists(): data["产品规格"] = [] data["棒料成型-出料人"] = [] data["棒料成型-切料人"] = [] data["棒料成型-备注"] = "" for item in mlogs_blcx_qs: last_time = item.update_time if item.update_time > last_time else last_time data["产品规格"].append(item.material_out) # 对象 if item.handle_user: data["棒料成型-出料人"].append(item.handle_user) # 对象 if item.handle_user_2: data["棒料成型-切料人"].append(item.handle_user_2) # 对象 if item.note: data["棒料成型-备注"] = ";".join([data["棒料成型-备注"], item.note]) for field in mlog_count_fields: if getattr(item, field) > 0 or field in ["count_real", "count_ok"]: if f'棒料成型-{field}' not in data: data[f'棒料成型-{field}'] = getattr(item, field) else: data[f'棒料成型-{field}'] += getattr(item, field) # 整理棒料成型数据 data["产品规格"] = list(set(data["产品规格"])) data["产品规格"] = ";".join([item.specification for item in data["产品规格"]]) data["棒料成型-出料人"] = list(set(data["棒料成型-出料人"])) data["棒料成型-出料人"] = ";".join([item.name for item in data["棒料成型-出料人"]]) data["棒料成型-切料人"] = list(set(data["棒料成型-切料人"])) data["棒料成型-切料人"] = ";".join([item.name for item in data["棒料成型-切料人"]]) data["棒料成型-合格率"] = round((data["棒料成型-count_ok"] * 100/ data["棒料成型-count_real"]), 1) # 7车间生产入库数据/ 8车间中检数据 mioitem_count_fields = MIOItem.count_fields() mioitem_qs = MIOItem.objects.filter(mio__belong_dept=dept7, mio__type="do_in", batch=batch, mio__submit_time__isnull=False) if mioitem_qs.exists(): last_time = item.update_time if item.update_time > last_time else last_time data["7车间入库-日期"] = [] data["7车间入库-车间执行人"] = [] data["7车间入库-仓库执行人"] = [] for item in mioitem_qs: data["7车间入库-日期"].append(item.mio.inout_date) if item.mio.mio_user: data["7车间入库-车间执行人"].append(item.mio.mio_user) if item.mio.do_user: data["7车间入库-仓库执行人"].append(item.mio.do_user) for field in mioitem_count_fields: if getattr(item, field) > 0 or field in ["count", "count_notok"]: if f'7车间入库-{field}' not in data: data[f'7车间入库-{field}'] = int(getattr(item, field)) else: data[f'7车间入库-{field}'] += int(getattr(item, field)) data["7车间入库-合格率"] = round((data["7车间入库-count"] - data["7车间入库-count_notok"]) * 100/ data["7车间入库-count"], 1) data["7车间入库-日期"] = list(set(data["7车间入库-日期"])) data["7车间入库-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["7车间入库-日期"]]) data["7车间入库-车间执行人"] = list(set(data["7车间入库-车间执行人"])) data["7车间入库-车间执行人"] = ";".join([item.name for item in data["7车间入库-车间执行人"]]) data["7车间入库-仓库执行人"] = list(set(data["7车间入库-仓库执行人"])) data["7车间入库-仓库执行人"] = ";".join([item.name for item in data["7车间入库-仓库执行人"]]) # 6车间生产领料数据 mioitem6_qs = MIOItem.objects.filter(mio__belong_dept=dept6, mio__type="do_out", batch=batch, mio__submit_time__isnull=False) if mioitem6_qs.exists(): data["6车间生产领料-日期"] = [] for item in mioitem6_qs: last_time = item.update_time if item.update_time > last_time else last_time data["6车间生产领料-日期"].append(item.mio.inout_date) for field in mioitem_count_fields: if getattr(item, field) > 0: if f'6车间生产领料-{field}' not in data: data[f'6车间生产领料-{field}'] = int(getattr(item, field)) else: data[f'6车间生产领料-{field}'] += int(getattr(item, field)) data["6车间生产领料-日期"] = list(set(data["6车间生产领料-日期"])) data["6车间生产领料-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["6车间生产领料-日期"]]) # 6车间工段生产数据 mgroup_list = ["平头", "粘铁头", "粗中细磨", "抛光", "开槽"] for mgroup_name in mgroup_list: mgroup = Mgroup.objects.get(name=mgroup_name) mlogs_qs = Mlog.objects.filter(submit_time__isnull=False, mgroup=mgroup, batch=batch) if mlogs_qs.exists(): last_time = item.update_time if item.update_time > last_time else last_time data[f'6车间-{mgroup_name}-日期'] = [] data[f'6车间-{mgroup_name}-操作人'] = [] for item in mlogs_qs: if item.handle_date: data[f'6车间-{mgroup_name}-日期'].append(item.handle_date) if item.handle_user: data[f'6车间-{mgroup_name}-操作人'].append(item.handle_user) for field in mlog_count_fields: if getattr(item, field) > 0 or field in ["count_ok", "count_real"]: if f'6车间-{mgroup_name}-{field}' not in data: data[f'6车间-{mgroup_name}-{field}'] = getattr(item, field) else: data[f'6车间-{mgroup_name}-{field}'] += getattr(item, field) data[f'6车间-{mgroup_name}-日期'] = list(set(data[f'6车间-{mgroup_name}-日期'])) data[f'6车间-{mgroup_name}-日期'] = ";".join([item.strftime("%Y-%m-%d") for item in data[f'6车间-{mgroup_name}-日期']]) data[f'6车间-{mgroup_name}-操作人'] = list(set(data[f'6车间-{mgroup_name}-操作人'])) data[f'6车间-{mgroup_name}-操作人'] = ";".join([item.name for item in data[f'6车间-{mgroup_name}-操作人']]) data[f'6车间-{mgroup_name}-合格率'] = round(data[f'6车间-{mgroup_name}-count_ok'] * 100/ data[f'6车间-{mgroup_name}-count_real'], 1) # 6车间入库/检验数据 # mioitem6_qs2 = MIOItem.objects.filter(mio__belong_dept=dept6, mio__type="do_in", # batch=batch, # mio__submit_time__isnull=False) # if mioitem6_qs2.exists(): # data["6车间生产入库-日期"] = [] # for item in mioitem6_qs: # data["6车间生产入库-日期"].append(item.mio.inout_date) # for field in mioitem_count_fields: # if getattr(item, field) > 0: # if f'6车间生产入库-{field}' not in data: # data[f'6车间生产入库-{field}'] = getattr(item, field) # else: # data[f'6车间生产入库-{field}'] += getattr(item, field) # data["6车间生产入库-日期"] = list(set(data["6车间生产入库-日期"])) # data["6车间生产入库-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["6车间生产入库-日期"]]) # 成品检验数据 ftestwork_count_fields = FtestWork.count_fields() ftestwork_qs = FtestWork.objects.filter(batch=batch) if ftestwork_qs.exists(): data["成品检验-日期"] = [] data['成品检验-检验人'] = [] for item in ftestwork_qs: last_time = item.update_time if item.update_time > last_time else last_time if item.test_date: data["成品检验-日期"].append(item.test_date) if item.test_user: data['成品检验-检验人'].append(item.test_user) for field in ftestwork_count_fields: if field == 'count_notok_json': for k, v in getattr(item, field).items(): if f'成品检验-{k}' not in data: data[f'成品检验-{k}'] = v else: data[f'成品检验-{k}'] += v else: if getattr(item, field) > 0 or field in ["count", "count_ok"]: if f'成品检验-{field}' not in data: data[f'成品检验-{field}'] = getattr(item, field) else: data[f'成品检验-{field}'] += getattr(item, field) data["成品检验-日期"] = list(set(data["成品检验-日期"])) data["成品检验-日期"] = ";".join([item.strftime("%Y-%m-%d") for item in data["成品检验-日期"]]) data['成品检验-检验人'] = list(set(data['成品检验-检验人'])) data['成品检验-检验人'] = ";".join([item.name for item in data['成品检验-检验人']]) data['成品检验-合格率'] = round(data['成品检验-count_ok'] * 100/ data['成品检验-count'], 1) return last_time, data