feat: batchst添加字段并更新光子的统计

This commit is contained in:
caoqianming 2025-05-08 14:56:40 +08:00
parent 20384ca33c
commit c29d1e99d8
3 changed files with 82 additions and 26 deletions

View File

@ -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"]
}

View File

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

View File

@ -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}