feat: mlog 并发优化

This commit is contained in:
caoqianming 2026-01-12 11:16:04 +08:00
parent def22f6b18
commit 70563a6c02
1 changed files with 21 additions and 17 deletions

View File

@ -150,11 +150,12 @@ def get_pcoal_heat(year_s: int, month_s: int, day_s: int):
myLogger.error(f'获取煤粉热值失败,{e}, {year_s}, {month_s}, {day_s}', exc_info=True) myLogger.error(f'获取煤粉热值失败,{e}, {year_s}, {month_s}, {day_s}', exc_info=True)
return 25000 return 25000
# @lock_model_record_d_func(Mlog)
def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
""" """
生产日志提交后需要执行的操作 生产日志提交后需要执行的操作
""" """
mlog = Mlog.objects.select_for_update().get(id=mlog.id)
if mlog.work_start_time and mlog.work_start_time > timezone.now(): if mlog.work_start_time and mlog.work_start_time > timezone.now():
raise ParseError('操作开始时间不能晚于当前时间') raise ParseError('操作开始时间不能晚于当前时间')
if mlog.work_start_time and mlog.work_end_time and mlog.work_end_time < mlog.work_start_time: if mlog.work_start_time and mlog.work_end_time and mlog.work_end_time < mlog.work_start_time:
@ -223,7 +224,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
# 需要判断领用数是否合理 # 需要判断领用数是否合理
# 优先使用工段库存 # 优先使用工段库存
if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in: if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in:
wm_qs = WMaterial.objects.filter(id=mlog_or_b.wm_in.id) wm = WMaterial.objects.select_for_update().get(id=mlog_or_b.wm_in.id)
else: else:
wm_qs = WMaterial.objects.filter(batch=mi_batch, material=mi_ma, mgroup=mgroup, state=WMaterial.WM_OK) wm_qs = WMaterial.objects.filter(batch=mi_batch, material=mi_ma, mgroup=mgroup, state=WMaterial.WM_OK)
if not wm_qs.exists(): if not wm_qs.exists():
@ -231,7 +232,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
belong_dept=belong_dept, mgroup=None, state=WMaterial.WM_OK) belong_dept=belong_dept, mgroup=None, state=WMaterial.WM_OK)
count_x = wm_qs.count() count_x = wm_qs.count()
if count_x == 1: if count_x == 1:
wm = wm_qs.first() wm = WMaterial.objects.select_for_update().get(id=wm_qs.first().id)
elif count_x == 0: elif count_x == 0:
raise ParseError( raise ParseError(
f'{str(mi_ma)}-{mi_batch}-批次库存不存在!') f'{str(mi_ma)}-{mi_batch}-批次库存不存在!')
@ -260,7 +261,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if count <= 0: if count <= 0:
raise ParseError('存在非正数!') raise ParseError('存在非正数!')
lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK} lookup = {'batch': batch, 'material': material, 'mgroup': mgroup, 'defect': defect, 'state': WMaterial.WM_NOTOK}
wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={"belong_dept": belong_dept}) wm, is_create = WMaterial.locked_get_or_create(**lookup, defaults={"belong_dept": belong_dept})
wm.count = wm.count + count wm.count = wm.count + count
if is_create: if is_create:
wm.create_by = user wm.create_by = user
@ -343,7 +344,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
else: else:
lookup['belong_dept'] = belong_dept lookup['belong_dept'] = belong_dept
wm, is_create2 = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept}) wm, is_create2 = WMaterial.locked_get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
wm.count = wm.count + mo_count wm.count = wm.count + mo_count
wm.count_eweight = mo_count_eweight wm.count_eweight = mo_count_eweight
wm.update_by = user wm.update_by = user
@ -405,12 +406,13 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if wprIds: if wprIds:
ana_wpr_thread(wprIds, mlog.mgroup) ana_wpr_thread(wprIds, mlog.mgroup)
# @lock_model_record_d_func(Mlog)
def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
"""日志撤回 """日志撤回
""" """
# if mlog.submit_time is None: # if mlog.submit_time is None:
# return # return
mlog = Mlog.objects.select_for_update().get(id=mlog.id)
if now is None: if now is None:
now = timezone.now() now = timezone.now()
@ -506,6 +508,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
else: else:
raise ParseError( raise ParseError(
f'{str(mo_ma)}-{mo_batch}-存在多个相同批次!') f'{str(mo_ma)}-{mo_batch}-存在多个相同批次!')
wm = WMaterial.objects.select_for_update().get(id=wm.id)
wm.count = wm.count - mo_count wm.count = wm.count - mo_count
if wm.count < 0: if wm.count < 0:
raise ParseError(f'{wm.batch} 车间库存不足, 产物无法回退') raise ParseError(f'{wm.batch} 车间库存不足, 产物无法回退')
@ -547,7 +551,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
if mi_count <= 0: if mi_count <= 0:
raise ParseError('存在非正数!') raise ParseError('存在非正数!')
if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in: if isinstance(mlog_or_b, Mlogb) and mlog_or_b.wm_in:
wm = WMaterial.objects.get(id=mlog_or_b.wm_in.id) wm = WMaterial.objects.select_for_update().get(id=mlog_or_b.wm_in.id)
else: else:
# 针对光子的情况实际上必须需要wm_in # 针对光子的情况实际上必须需要wm_in
lookup = {'batch': mi_batch, 'material': mi_ma, 'mgroup': None, 'state': WMaterial.WM_OK} lookup = {'batch': mi_batch, 'material': mi_ma, 'mgroup': None, 'state': WMaterial.WM_OK}
@ -557,7 +561,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
else: else:
lookup['belong_dept'] = belong_dept lookup['belong_dept'] = belong_dept
wm, _ = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept}) wm, _ = WMaterial.locked_get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
wm.count = wm.count + mi_count wm.count = wm.count + mi_count
wm.update_by = user wm.update_by = user
wm.save() wm.save()
@ -579,7 +583,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
lookup['mgroup'] = mgroup lookup['mgroup'] = mgroup
else: else:
lookup['belong_dept'] = belong_dept lookup['belong_dept'] = belong_dept
wm, is_create = WMaterial.objects.get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept}) wm, is_create = WMaterial.locked_get_or_create(**lookup, defaults={**lookup, "belong_dept": belong_dept})
wm.count = wm.count - count wm.count = wm.count - count
if wm.count < 0: if wm.count < 0:
raise ParseError('加工前不良数量大于库存量') raise ParseError('加工前不良数量大于库存量')