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 model = BatchSt
fields = { fields = {
"batch": ["exact", "contains", "startswith"], "batch": ["exact", "contains", "startswith"],
"first_time": ["exact", "gte", "lte"],
"last_time": ["exact", "gte", "lte"], "last_time": ["exact", "gte", "lte"],
"update_time": ["exact", "gte", "lte"], "update_time": ["exact", "gte", "lte"],
"material_start": ["exact"], "material_start": ["exact"],
"material_start__cate": ["exact"],
"material_start__type": ["exact"], "material_start__type": ["exact"],
"material_start__process": ["exact"] "material_start__process": ["exact"]
} }

View File

@ -609,6 +609,7 @@ class BatchSt(BaseModel):
""" """
batch = models.TextField("批次号", db_index=True) batch = models.TextField("批次号", db_index=True)
version = models.IntegerField("版本号", default=1, 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) last_time = models.DateTimeField("最后操作时间", null=True, blank=True)
data = models.JSONField("数据", default=list, 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) 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 import logging
myLogger = logging.getLogger('log') 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) BASE_PROJECT_CODE = getattr(settings, "BASE_PROJECT_CODE", None)
if BASE_PROJECT_CODE == "gzerp": if BASE_PROJECT_CODE == "gzerp":
need_update = True action = "get_or_create"
last_time, data = get_alldata_with_batch(batch) data, extra = get_alldata_with_batch(batch)
elif BASE_PROJECT_CODE == "gxerp": elif BASE_PROJECT_CODE == "gxerp":
need_update = True
from apps.wpm.scripts.batch_gxerp import main 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: if data:
bobj, _ = BatchSt.objects.get_or_create(batch=batch, defaults={ if action == "get_or_create":
"last_time": last_time bobj, _ = BatchSt.objects.get_or_create(batch=batch)
}) elif action == "get":
if need_update_time: bobj = BatchSt.objects.get(batch=batch, version=1)
bobj.last_time = last_time
bobj.data = json.loads(json.dumps(data, cls=MyJSONEncoder)) 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() bobj.save()
@ -50,13 +52,19 @@ def get_alldata_with_batch(batch: str):
mlog_count_fields = Mlog.count_fields() mlog_count_fields = Mlog.count_fields()
first_time = None
material_start = None
if mlogs_blcx_qs.exists(): if mlogs_blcx_qs.exists():
data["产品规格"] = [] data["产品规格"] = []
data["棒料成型_出料人"] = [] data["棒料成型_出料人"] = []
data["棒料成型_切料人"] = [] data["棒料成型_切料人"] = []
data["棒料成型_备注"] = "" data["棒料成型_备注"] = ""
for item in mlogs_blcx_qs: 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) # 对象 data["产品规格"].append(item.material_out) # 对象
if item.handle_user: if item.handle_user:
data["棒料成型_出料人"].append(item.handle_user) # 对象 data["棒料成型_出料人"].append(item.handle_user) # 对象
@ -82,7 +90,7 @@ def get_alldata_with_batch(batch: str):
except ZeroDivisionError: except ZeroDivisionError:
data["棒料成型_合格率"] = 0 data["棒料成型_合格率"] = 0
except decimal.InvalidOperation: except decimal.InvalidOperation:
myLogger.error(f"棒料成型_合格率计算错误decimal.InvalidOperation-{data}") # myLogger.error(f"棒料成型_合格率计算错误decimal.InvalidOperation-{data}")
data["棒料成型_合格率"] = 0 data["棒料成型_合格率"] = 0
# 管料成型数据 # 管料成型数据
@ -92,7 +100,11 @@ def get_alldata_with_batch(batch: str):
data["产品规格"] = [] data["产品规格"] = []
data["管料成型_备注"] = "" data["管料成型_备注"] = ""
for item in mlogs_glcx_qs: 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) # 对象 data["产品规格"].append(item.material_out) # 对象
if item.note: if item.note:
data["管料成型_备注"] = ";".join([data["管料成型_备注"], item.note]) data["管料成型_备注"] = ";".join([data["管料成型_备注"], item.note])
@ -115,7 +127,11 @@ def get_alldata_with_batch(batch: str):
data["七车间入库_仓库执行人"] = [] data["七车间入库_仓库执行人"] = []
data["七车间入库_检验备注"] = "" data["七车间入库_检验备注"] = ""
for item in mioitem_qs: 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) data["七车间入库_日期"].append(item.mio.inout_date)
if item.test_note: if item.test_note:
data["七车间入库_检验备注"] = ";".join([data["七车间入库_检验备注"], item.test_note]) data["七车间入库_检验备注"] = ";".join([data["七车间入库_检验备注"], item.test_note])
@ -149,7 +165,11 @@ def get_alldata_with_batch(batch: str):
data["十车间入库_日期"] = [] data["十车间入库_日期"] = []
data["十车间入库_检验备注"] = "" data["十车间入库_检验备注"] = ""
for item in mioitem10_qs: 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: if item.test_note:
data["十车间入库_检验备注"] = ";".join([data["十车间入库_检验备注"], item.test_note]) data["十车间入库_检验备注"] = ";".join([data["十车间入库_检验备注"], item.test_note])
if item.mio.do_user: if item.mio.do_user:
@ -184,7 +204,15 @@ def get_alldata_with_batch(batch: str):
data["产品规格"] = [] data["产品规格"] = []
for item in mlogs_glth_qs: for item in mlogs_glth_qs:
data["产品规格"].append(item.material_out) 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: if item.note:
data["管料退火_备注"] = ";".join([data["管料退火_备注"], item.note]) data["管料退火_备注"] = ";".join([data["管料退火_备注"], item.note])
if item.handle_date: if item.handle_date:
@ -216,7 +244,11 @@ def get_alldata_with_batch(batch: str):
data["产品规格"] = [] data["产品规格"] = []
for item in mioitem6_qs: for item in mioitem6_qs:
data["产品规格"].append(item.material) 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) data["六车间领料_日期"].append(item.mio.inout_date)
if item.mio.do_user: if item.mio.do_user:
data["六车间领料_仓库执行人"].append(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) mgroups = Mgroup.objects.filter(name=mgroup_name)
mlogs_qs = Mlog.objects.filter(submit_time__isnull=False, mgroup__in=mgroups, batch=batch) mlogs_qs = Mlog.objects.filter(submit_time__isnull=False, mgroup__in=mgroups, batch=batch)
if mlogs_qs.exists(): 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}_操作人'] = [] data[f'六车间_{mgroup_name}_操作人'] = []
data[f'六车间_{mgroup_name}_备注'] = "" data[f'六车间_{mgroup_name}_备注'] = ""
for item in mlogs_qs: 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: if item.note:
data[f'六车间_{mgroup_name}_备注'] = ";".join([data[f'六车间_{mgroup_name}_备注'], item.note]) data[f'六车间_{mgroup_name}_备注'] = ";".join([data[f'六车间_{mgroup_name}_备注'], item.note])
if item.handle_date: if item.handle_date:
@ -272,7 +308,7 @@ def get_alldata_with_batch(batch: str):
try: try:
data[f'六车间_{mgroup_name}_合格率'] = round(data[f'六车间_{mgroup_name}_count_ok'] * 100/ data[f'六车间_{mgroup_name}_count_real'], 1) data[f'六车间_{mgroup_name}_合格率'] = round(data[f'六车间_{mgroup_name}_count_ok'] * 100/ data[f'六车间_{mgroup_name}_count_real'], 1)
except decimal.InvalidOperation: except decimal.InvalidOperation:
myLogger.error(f"六车间_{mgroup_name}_合格率decimal.InvalidOperation-{data}") # myLogger.error(f"六车间_{mgroup_name}_合格率decimal.InvalidOperation-{data}")
data[f'六车间_{mgroup_name}_合格率'] = 0 data[f'六车间_{mgroup_name}_合格率'] = 0
ftestwork_count_fields = FtestWork.count_fields() ftestwork_count_fields = FtestWork.count_fields()
@ -282,7 +318,11 @@ def get_alldata_with_batch(batch: str):
data["六车间中检_日期"] = [] data["六车间中检_日期"] = []
data['六车间中检_检验人'] = [] data['六车间中检_检验人'] = []
for item in ftestwork_qs: 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: if item.test_date:
data["六车间中检_日期"].append(item.test_date) data["六车间中检_日期"].append(item.test_date)
if item.test_user: if item.test_user:
@ -314,6 +354,11 @@ def get_alldata_with_batch(batch: str):
data["六车间生产入库_检验日期"] = [] data["六车间生产入库_检验日期"] = []
data["六车间生产入库_检验人"] = [] data["六车间生产入库_检验人"] = []
for item in mioitem6_qs2: 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) data["六车间生产入库_日期"].append(item.mio.inout_date)
if item.test_date: if item.test_date:
data["六车间生产入库_检验日期"].append(item.test_date) data["六车间生产入库_检验日期"].append(item.test_date)
@ -330,7 +375,7 @@ def get_alldata_with_batch(batch: str):
try: try:
data['六车间生产入库_合格率'] = round((data['六车间生产入库_count'] - data['六车间生产入库_count_notok']) * 100/ data['六车间生产入库_count'], 1) data['六车间生产入库_合格率'] = round((data['六车间生产入库_count'] - data['六车间生产入库_count_notok']) * 100/ data['六车间生产入库_count'], 1)
except decimal.InvalidOperation: except decimal.InvalidOperation:
myLogger.error("六车间生产入库_合格率decimal.InvalidOperation-{data}") # myLogger.error("六车间生产入库_合格率decimal.InvalidOperation-{data}")
data['六车间生产入库_合格率'] = 0 data['六车间生产入库_合格率'] = 0
# 成品检验数据 # 成品检验数据
@ -339,7 +384,11 @@ def get_alldata_with_batch(batch: str):
data["成品检验_日期"] = [] data["成品检验_日期"] = []
data['成品检验_检验人'] = [] data['成品检验_检验人'] = []
for item in ftestwork_qs: 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: if item.test_date:
data["成品检验_日期"].append(item.test_date) data["成品检验_日期"].append(item.test_date)
if item.test_user: if item.test_user:
@ -374,7 +423,11 @@ def get_alldata_with_batch(batch: str):
data['销售发货_仓库执行人'] = [] data['销售发货_仓库执行人'] = []
data['销售发货_count'] = 0 data['销售发货_count'] = 0
for item in mioitem_qs: 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: if item.mio.inout_date:
data["销售发货_日期"].append(item.mio.inout_date) data["销售发货_日期"].append(item.mio.inout_date)
if item.mio.do_user: 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["六车间_批次发货合格率"] = round(data["销售发货_count"] * 100/ data["六车间领料_count"], 1)
data['销售发货_仓库执行人'] = ";".join([item.name for item in data['销售发货_仓库执行人']]) 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}