feat: 尝试从个号追踪到历史记录的个号
This commit is contained in:
parent
76a48d46ee
commit
849e63da3e
|
@ -118,6 +118,7 @@ class WMaterial(CommonBDModel):
|
||||||
count_xtest = models.DecimalField('已检数量', null=True, blank=True, max_digits=11, decimal_places=1)
|
count_xtest = models.DecimalField('已检数量', null=True, blank=True, max_digits=11, decimal_places=1)
|
||||||
batch_ofrom = models.TextField('原料批次号', null=True, blank=True)
|
batch_ofrom = models.TextField('原料批次号', null=True, blank=True)
|
||||||
material_ofrom = models.ForeignKey(Material, verbose_name='原料物料', on_delete=models.SET_NULL, null=True, blank=True, related_name='wm_mofrom')
|
material_ofrom = models.ForeignKey(Material, verbose_name='原料物料', on_delete=models.SET_NULL, null=True, blank=True, related_name='wm_mofrom')
|
||||||
|
number_from = models.TextField("来源于个号", null=True, blank=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def count_working(self):
|
def count_working(self):
|
||||||
|
@ -382,6 +383,7 @@ class Mlogb(BaseModel):
|
||||||
test_user = models.ForeignKey(
|
test_user = models.ForeignKey(
|
||||||
User, verbose_name='抽检人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlogb_test_user')
|
User, verbose_name='抽检人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlogb_test_user')
|
||||||
need_inout = models.BooleanField('是否需要出入库', default=True)
|
need_inout = models.BooleanField('是否需要出入库', default=True)
|
||||||
|
number_from = models.TextField('来源个编号', null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
def get_tracking(self):
|
def get_tracking(self):
|
||||||
|
|
|
@ -340,6 +340,10 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
elif isinstance(mlog_or_b, Mlogb):
|
elif isinstance(mlog_or_b, Mlogb):
|
||||||
wm.batch_ofrom = mlog_or_b.batch_ofrom
|
wm.batch_ofrom = mlog_or_b.batch_ofrom
|
||||||
wm.material_ofrom = mlog_or_b.material_ofrom
|
wm.material_ofrom = mlog_or_b.material_ofrom
|
||||||
|
if isinstance(mlog_or_b, Mlogb):
|
||||||
|
if mlog_or_b.number_from and wm.number_from is not None:
|
||||||
|
raise ParseError(f'{wm.batch}-该批号现有库存来源于个号{wm.number_from}')
|
||||||
|
wm.number_from = mlog_or_b.number_from
|
||||||
wm.save()
|
wm.save()
|
||||||
if mo_ma.tracking == Material.MA_TRACKING_SINGLE:
|
if mo_ma.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
if notok_sign_or_defect:
|
if notok_sign_or_defect:
|
||||||
|
@ -356,9 +360,11 @@ def mlog_submit(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
wpr_from = None
|
wpr_from = None
|
||||||
if item.mlogbw_from:
|
if item.mlogbw_from:
|
||||||
wpr_from = item.mlogbw_from.wpr
|
wpr_from = item.mlogbw_from.wpr
|
||||||
|
number_from = item.mlogb.number_from
|
||||||
|
batch_from = item.mlogb.batch if number_from else None
|
||||||
wpr = Wpr.change_or_new(number=item.number,
|
wpr = Wpr.change_or_new(number=item.number,
|
||||||
wm=wm, ftest=item.ftest,
|
wm=wm, ftest=item.ftest,
|
||||||
wpr_from=wpr_from, batch_from=item.mlogb.batch)
|
wpr_from=wpr_from, batch_from=batch_from, number_from=number_from)
|
||||||
item.wpr = wpr
|
item.wpr = wpr
|
||||||
item.save()
|
item.save()
|
||||||
|
|
||||||
|
@ -481,6 +487,9 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
|
||||||
if wm.count < 0:
|
if wm.count < 0:
|
||||||
raise ParseError('车间库存不足, 产物无法回退')
|
raise ParseError('车间库存不足, 产物无法回退')
|
||||||
elif wm.count >= 0:
|
elif wm.count >= 0:
|
||||||
|
if isinstance(mlog_or_b, Mlogb):
|
||||||
|
if mlog_or_b.number_from == wm.number_from:
|
||||||
|
wm.number_from = None
|
||||||
wm.update_by = user
|
wm.update_by = user
|
||||||
wm.save()
|
wm.save()
|
||||||
if mo_ma.tracking == Material.MA_TRACKING_SINGLE:
|
if mo_ma.tracking == Material.MA_TRACKING_SINGLE:
|
||||||
|
|
|
@ -618,8 +618,10 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust
|
||||||
mlogbwin = Mlogbw.objects.filter(mlogb=mlogbin).first()
|
mlogbwin = Mlogbw.objects.filter(mlogb=mlogbin).first()
|
||||||
mlogbout, _ = Mlogb.objects.get_or_create(mlogbw_from=mlogbwin, mlogb_from=mlogbin, defaults=update_dict(m_dict,{"count_real": div_number, "count_ok": div_number}))
|
mlogbout, _ = Mlogb.objects.get_or_create(mlogbw_from=mlogbwin, mlogb_from=mlogbin, defaults=update_dict(m_dict,{"count_real": div_number, "count_ok": div_number}))
|
||||||
mlogbout.count_json_from = mlogbin.count_json_from
|
mlogbout.count_json_from = mlogbin.count_json_from
|
||||||
|
mlogbout.number_from = mlogbwin.number
|
||||||
mlogbout.save(update_fields=["count_json_from"])
|
mlogbout.save(update_fields=["count_json_from"])
|
||||||
else:
|
else:
|
||||||
|
# 用个号做批号是用于后续在复用个号可以追踪到原先的个
|
||||||
for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"):
|
for mlogbwin in Mlogbw.objects.filter(mlogb=mlogbin).order_by("number"):
|
||||||
m_dict["batch"] = mlogbwin.number
|
m_dict["batch"] = mlogbwin.number
|
||||||
Mlogb.objects.get_or_create(mlogbw_from=mlogbwin, defaults=update_dict(m_dict, {"count_real": div_number, "count_ok": div_number}))
|
Mlogb.objects.get_or_create(mlogbw_from=mlogbwin, defaults=update_dict(m_dict, {"count_real": div_number, "count_ok": div_number}))
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Wpr(BaseModel):
|
||||||
wpr_from = models.ForeignKey("self", verbose_name="来源于", on_delete=models.CASCADE, null=True, blank=True)
|
wpr_from = models.ForeignKey("self", verbose_name="来源于", on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None, batch_from=None):
|
def change_or_new(cls, wpr=None, number=None, mb=None, wm=None, old_mb=None, old_wm=None, ftest=None, wpr_from=None, batch_from=None, number_from=None):
|
||||||
if wpr is None and number is None:
|
if wpr is None and number is None:
|
||||||
raise ParseError("id和number不能同时为空")
|
raise ParseError("id和number不能同时为空")
|
||||||
if mb and wm:
|
if mb and wm:
|
||||||
|
@ -66,6 +66,16 @@ class Wpr(BaseModel):
|
||||||
raise ParseError(f"该物料编号{number}-已存在不可使用")
|
raise ParseError(f"该物料编号{number}-已存在不可使用")
|
||||||
elif wpr_from is None:
|
elif wpr_from is None:
|
||||||
raise ParseError(f"该物料编号{number}-尝试从批号追踪来源失败")
|
raise ParseError(f"该物料编号{number}-尝试从批号追踪来源失败")
|
||||||
|
elif number_from: # 尝试从编号追踪来源
|
||||||
|
ins_from = cls.objects.filter(number=number_from).order_by("-version").first()
|
||||||
|
if ins_from:
|
||||||
|
if ins_from.wm is None and ins_from.mb is None:
|
||||||
|
if ins_from.version > 1: # 说明被复用了
|
||||||
|
wpr_from = ins_from
|
||||||
|
else:
|
||||||
|
raise ParseError(f"该物料编号{number}-已存在不可使用")
|
||||||
|
elif wpr_from is None:
|
||||||
|
raise ParseError(f"该物料编号{number}-尝试历史编号追踪来源失败")
|
||||||
|
|
||||||
if old_mb and ins.mb != old_mb:
|
if old_mb and ins.mb != old_mb:
|
||||||
raise ParseError(f"请检查-{ins.number}-所属仓库批次")
|
raise ParseError(f"请检查-{ins.number}-所属仓库批次")
|
||||||
|
|
Loading…
Reference in New Issue