diff --git a/apps/wpm/filters.py b/apps/wpm/filters.py index a4a17fc4..c698d8e4 100644 --- a/apps/wpm/filters.py +++ b/apps/wpm/filters.py @@ -178,9 +178,11 @@ class BatchStFilter(filters.FilterSet): model = BatchSt fields = { "batch": ["exact", "contains", "startswith"], + "first_time": ["exact", "gte", "lte"], "last_time": ["exact", "gte", "lte"], "update_time": ["exact", "gte", "lte"], "material_start": ["exact"], + "material_start__cate": ["exact"], "material_start__type": ["exact"], "material_start__process": ["exact"] } diff --git a/apps/wpm/models.py b/apps/wpm/models.py index f6e306dd..cc344e1a 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -609,6 +609,7 @@ class BatchSt(BaseModel): """ batch = models.TextField("批次号", db_index=True) version = models.IntegerField("版本号", default=1, db_index=True) + first_time = models.DateTimeField("首次操作时间", null=True, blank=True) last_time = models.DateTimeField("最后操作时间", null=True, blank=True) data = models.JSONField("数据", default=list, blank=True) material_start = models.ForeignKey(Material, verbose_name="起始物料", on_delete=models.SET_NULL, null=True, blank=True) diff --git a/apps/wpm/services_2.py b/apps/wpm/services_2.py index a1319b77..f965c7c5 100644 --- a/apps/wpm/services_2.py +++ b/apps/wpm/services_2.py @@ -12,27 +12,29 @@ import decimal import logging myLogger = logging.getLogger('log') -def get_alldata_with_batch_and_store(batch: str, need_update_time=True): +def get_alldata_with_batch_and_store(batch: str): """ 获取某个批次的整体生产数据并保存 """ - need_update = False + data = None + action = "get" BASE_PROJECT_CODE = getattr(settings, "BASE_PROJECT_CODE", None) if BASE_PROJECT_CODE == "gzerp": - need_update = True - last_time, data = get_alldata_with_batch(batch) + action = "get_or_create" + data, extra = get_alldata_with_batch(batch) elif BASE_PROJECT_CODE == "gxerp": - need_update = True from apps.wpm.scripts.batch_gxerp import main - last_time, data = main(batch) + data, extra = main(batch) - if need_update and last_time and data: - bobj, _ = BatchSt.objects.get_or_create(batch=batch, defaults={ - "last_time": last_time - }) - if need_update_time: - bobj.last_time = last_time + if data: + if action == "get_or_create": + bobj, _ = BatchSt.objects.get_or_create(batch=batch) + elif action == "get": + bobj = BatchSt.objects.get(batch=batch, version=1) bobj.data = json.loads(json.dumps(data, cls=MyJSONEncoder)) + for k, v in extra.items(): + if hasattr(bobj, k): + setattr(bobj, k, v) bobj.save() @@ -50,13 +52,19 @@ def get_alldata_with_batch(batch: str): mlog_count_fields = Mlog.count_fields() + first_time = None + material_start = None 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 + utime = item.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material_out data["产品规格"].append(item.material_out) # 对象 if item.handle_user: data["棒料成型_出料人"].append(item.handle_user) # 对象 @@ -82,7 +90,7 @@ def get_alldata_with_batch(batch: str): except ZeroDivisionError: data["棒料成型_合格率"] = 0 except decimal.InvalidOperation: - myLogger.error(f"棒料成型_合格率计算错误decimal.InvalidOperation-{data}") + # myLogger.error(f"棒料成型_合格率计算错误decimal.InvalidOperation-{data}") data["棒料成型_合格率"] = 0 # 管料成型数据 @@ -92,7 +100,11 @@ def get_alldata_with_batch(batch: str): data["产品规格"] = [] data["管料成型_备注"] = "" for item in mlogs_glcx_qs: - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material_out data["产品规格"].append(item.material_out) # 对象 if item.note: data["管料成型_备注"] = ";".join([data["管料成型_备注"], item.note]) @@ -115,7 +127,11 @@ def get_alldata_with_batch(batch: str): data["七车间入库_仓库执行人"] = [] data["七车间入库_检验备注"] = "" for item in mioitem_qs: - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.mio.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material data["七车间入库_日期"].append(item.mio.inout_date) if item.test_note: data["七车间入库_检验备注"] = ";".join([data["七车间入库_检验备注"], item.test_note]) @@ -149,7 +165,11 @@ def get_alldata_with_batch(batch: str): data["十车间入库_日期"] = [] data["十车间入库_检验备注"] = "" for item in mioitem10_qs: - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.mio.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material if item.test_note: data["十车间入库_检验备注"] = ";".join([data["十车间入库_检验备注"], item.test_note]) if item.mio.do_user: @@ -184,7 +204,15 @@ def get_alldata_with_batch(batch: str): data["产品规格"] = [] for item in mlogs_glth_qs: data["产品规格"].append(item.material_out) - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if first_time is None: + first_time = item.update_time + else: + first_time = item.update_time if item.update_time < first_time else first_time + if material_start is None: + material_start = item.material_out if item.note: data["管料退火_备注"] = ";".join([data["管料退火_备注"], item.note]) if item.handle_date: @@ -216,7 +244,11 @@ def get_alldata_with_batch(batch: str): data["产品规格"] = [] for item in mioitem6_qs: data["产品规格"].append(item.material) - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.mio.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material data["六车间领料_日期"].append(item.mio.inout_date) if item.mio.do_user: data["六车间领料_仓库执行人"].append(item.mio.do_user) @@ -248,11 +280,15 @@ def get_alldata_with_batch(batch: str): mgroups = Mgroup.objects.filter(name=mgroup_name) mlogs_qs = Mlog.objects.filter(submit_time__isnull=False, mgroup__in=mgroups, batch=batch) if mlogs_qs.exists(): - last_time = item.update_time if item.update_time > last_time else last_time data[f'六车间_{mgroup_name}_日期'] = [] data[f'六车间_{mgroup_name}_操作人'] = [] data[f'六车间_{mgroup_name}_备注'] = "" for item in mlogs_qs: + utime = item.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material_out if item.note: data[f'六车间_{mgroup_name}_备注'] = ";".join([data[f'六车间_{mgroup_name}_备注'], item.note]) if item.handle_date: @@ -272,7 +308,7 @@ def get_alldata_with_batch(batch: str): try: data[f'六车间_{mgroup_name}_合格率'] = round(data[f'六车间_{mgroup_name}_count_ok'] * 100/ data[f'六车间_{mgroup_name}_count_real'], 1) except decimal.InvalidOperation: - myLogger.error(f"六车间_{mgroup_name}_合格率decimal.InvalidOperation-{data}") + # myLogger.error(f"六车间_{mgroup_name}_合格率decimal.InvalidOperation-{data}") data[f'六车间_{mgroup_name}_合格率'] = 0 ftestwork_count_fields = FtestWork.count_fields() @@ -282,7 +318,11 @@ def get_alldata_with_batch(batch: str): data["六车间中检_日期"] = [] data['六车间中检_检验人'] = [] for item in ftestwork_qs: - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.update_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material if item.test_date: data["六车间中检_日期"].append(item.test_date) if item.test_user: @@ -314,6 +354,11 @@ def get_alldata_with_batch(batch: str): data["六车间生产入库_检验日期"] = [] data["六车间生产入库_检验人"] = [] for item in mioitem6_qs2: + utime = item.mio.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material data["六车间生产入库_日期"].append(item.mio.inout_date) if item.test_date: data["六车间生产入库_检验日期"].append(item.test_date) @@ -330,7 +375,7 @@ def get_alldata_with_batch(batch: str): try: data['六车间生产入库_合格率'] = round((data['六车间生产入库_count'] - data['六车间生产入库_count_notok']) * 100/ data['六车间生产入库_count'], 1) except decimal.InvalidOperation: - myLogger.error("六车间生产入库_合格率decimal.InvalidOperation-{data}") + # myLogger.error("六车间生产入库_合格率decimal.InvalidOperation-{data}") data['六车间生产入库_合格率'] = 0 # 成品检验数据 @@ -339,7 +384,11 @@ def get_alldata_with_batch(batch: str): data["成品检验_日期"] = [] data['成品检验_检验人'] = [] for item in ftestwork_qs: - last_time = item.update_time if item.update_time > last_time else last_time + utime = item.update_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material if item.test_date: data["成品检验_日期"].append(item.test_date) if item.test_user: @@ -374,7 +423,11 @@ def get_alldata_with_batch(batch: str): data['销售发货_仓库执行人'] = [] data['销售发货_count'] = 0 for item in mioitem_qs: - last_time = item.mio.update_time if item.mio.update_time > last_time else last_time + utime = item.mio.submit_time + last_time = utime if utime > last_time else last_time + first_time = utime if first_time is None else (utime if utime < first_time else first_time) + if material_start is None: + material_start = item.material if item.mio.inout_date: data["销售发货_日期"].append(item.mio.inout_date) if item.mio.do_user: @@ -386,5 +439,5 @@ def get_alldata_with_batch(batch: str): data["六车间_批次发货合格率"] = round(data["销售发货_count"] * 100/ data["六车间领料_count"], 1) data['销售发货_仓库执行人'] = ";".join([item.name for item in data['销售发货_仓库执行人']]) - return last_time, data + return data, {"material_start": material_start, "last_time": last_time, "first_time": first_time} \ No newline at end of file