test_pl_dibang_upsert_on_arrange.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """按段 upsert 的原业务策略回归,使用真实 SQLite 身份与历史关联。"""
  2. from datetime import date, datetime
  3. import pytest
  4. from test_pl_stop_dibang_differential import db, seed, sync, record, INTERNAL
  5. from app.models.db_models import DbInboundOutbound, DbPurchasePlan, DbWeighingSlip
  6. from app.models.pl_models import PlPlanDelivery
  7. from app.services.pl_dibang_bridge_service import StopDibangOption
  8. def add_slip(db, inv, month):
  9. slip = DbWeighingSlip(id='slip', tenant_no='t', inbound_outbound_id=inv.id,
  10. purchase_plan_id=month.id, vehicle_no='Old', business_type='出库', cargo_name='Product', supplier='S', consignee='C',
  11. tare_weight=18730, gross_weight=0, net_weight=-18730, gross_weight_time=datetime(2026,10,1), is_voided=0)
  12. db.add(slip); db.commit()
  13. return slip
  14. def test_cancel_generate_dibang_blocked_when_weighing_exists(db):
  15. rows=seed(db); sync(db,rows); db.commit(); link,inv,month=record(db)
  16. add_slip(db,inv,month)
  17. with pytest.raises(ValueError,match='已执行|已关联地磅'):
  18. sync(db,rows,[StopDibangOption('load','load',False)])
  19. assert link.del_flag==inv.del_flag==0 and month.planned_quantity==5
  20. assert rows[2].generate_dibang==1
  21. def test_upsert_reuses_existing_inventory_id(db):
  22. rows=seed(db); first=sync(db,rows); db.commit(); link,inv,month=record(db)
  23. identity=(link.id,inv.id,inv.batch_no)
  24. second=sync(db,rows)
  25. assert first==second and (link.id,inv.id,inv.batch_no)==identity
  26. assert db.query(DbInboundOutbound).count()==1 and month.planned_quantity==5
  27. def test_upsert_updates_inventory_and_weighing_plate_when_already_weighed(db):
  28. rows=seed(db); sync(db,rows); db.commit(); link,inv,month=record(db)
  29. slip=add_slip(db,inv,month); original_id=inv.id
  30. rows[1].license_plate='New'; rows[2].load_time=datetime(2026,10,6)
  31. # Caller pending fields must survive the bridge locks.
  32. results=sync(db,rows)
  33. assert results[0].db_inventory_id==original_id
  34. assert inv.vehicle_no==slip.vehicle_no=='New'
  35. assert slip.tare_weight==18730 and slip.net_weight==-18730
  36. assert inv.date==date(2026,10,6)
  37. def test_upsert_remounts_monthly_plan_when_partner_changes(db):
  38. rows=seed(db); sync(db,rows); db.commit(); link,inv,old=record(db)
  39. original_id=inv.id
  40. target=DbPurchasePlan(id='target',tenant_no='t',plan_no='SX-NEW',
  41. plan_date=date(2026,10,1),start_date=date(2026,10,1),end_date=date(2026,10,31),
  42. business_type='出库',product_id='sku',product='Product',specification='Spec',
  43. customer_name='New customer',planned_quantity=0)
  44. db.add(target)
  45. db.add(PlPlanDelivery(id='delivery',tenant_no='t',plan_id='p',seq=1,
  46. customer_name='New customer',generate_dibang=0)); db.commit()
  47. results=sync(db,rows)
  48. assert len(results)==1 and inv.id==original_id
  49. assert inv.partner_company=='New customer'
  50. assert inv.purchase_plan_id==link.db_purchase_plan_id==target.id
  51. assert inv.plan_no=='SX-NEW' and old.planned_quantity==0 and target.planned_quantity==5
  52. assert db.query(DbPurchasePlan).count()==2
  53. def test_arrange_transport_source_has_no_revoke_call():
  54. import inspect
  55. from app.api.pl import transport as transport_api
  56. src = inspect.getsource(transport_api.arrange_transport)
  57. assert "revoke_regeneratable_dibang_for_transport" not in src
  58. def test_arrange_transport_syncs_stop_dibang_even_when_all_unchecked():
  59. """全部取消勾选时仍应进入按段 sync,以便取消/已过磅阻断生效。"""
  60. import inspect
  61. from app.api.pl import transport as transport_api
  62. src = inspect.getsource(transport_api.arrange_transport)
  63. assert "bool(stop_dibang_options)" in src
  64. assert "item.generate_dibang for item in stop_dibang_options" not in src