diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 59406afa..b47c2529 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -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) return 25000 -# @lock_model_record_d_func(Mlog) + 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(): raise ParseError('操作开始时间不能晚于当前时间') if mlog.work_start_time and mlog.work_end_time and mlog.work_end_time < mlog.work_start_time: @@ -223,21 +224,21 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): # 需要判断领用数是否合理 # 优先使用工段库存 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: wm_qs = WMaterial.objects.filter(batch=mi_batch, material=mi_ma, mgroup=mgroup, state=WMaterial.WM_OK) if not wm_qs.exists(): wm_qs = WMaterial.objects.filter(batch=mi_batch, material=mi_ma, belong_dept=belong_dept, mgroup=None, state=WMaterial.WM_OK) - count_x = wm_qs.count() - if count_x == 1: - wm = wm_qs.first() - elif count_x == 0: - raise ParseError( - f'{str(mi_ma)}-{mi_batch}-批次库存不存在!') - else: - raise ParseError( - f'{str(mi_ma)}-{mi_batch}-存在多个相同批次!') + count_x = wm_qs.count() + if count_x == 1: + wm = WMaterial.objects.select_for_update().get(id=wm_qs.first().id) + elif count_x == 0: + raise ParseError( + f'{str(mi_ma)}-{mi_batch}-批次库存不存在!') + else: + raise ParseError( + f'{str(mi_ma)}-{mi_batch}-存在多个相同批次!') if mi_count > wm.count: raise ParseError( @@ -260,7 +261,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if count <= 0: raise ParseError('存在非正数!') 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 if is_create: wm.create_by = user @@ -343,7 +344,7 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): else: 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_eweight = mo_count_eweight wm.update_by = user @@ -405,12 +406,13 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): if wprIds: ana_wpr_thread(wprIds, mlog.mgroup) -# @lock_model_record_d_func(Mlog) + def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): """日志撤回 """ # if mlog.submit_time is None: # return + mlog = Mlog.objects.select_for_update().get(id=mlog.id) if now is None: now = timezone.now() @@ -506,6 +508,8 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): else: raise ParseError( f'{str(mo_ma)}-{mo_batch}-存在多个相同批次!') + + wm = WMaterial.objects.select_for_update().get(id=wm.id) wm.count = wm.count - mo_count if wm.count < 0: 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: raise ParseError('存在非正数!') 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: # 针对光子的情况,实际上必须需要wm_in 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: 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.update_by = user wm.save() @@ -579,7 +583,7 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]): lookup['mgroup'] = mgroup else: 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 if wm.count < 0: raise ParseError('加工前不良数量大于库存量')