test_move copy.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import os
  2. import django
  3. import sys
  4. from decimal import Decimal
  5. from django.db import transaction
  6. from django.db.models import F
  7. import unittest
  8. from datetime import datetime, timedelta
  9. def setup_django():
  10. """设置Django环境"""
  11. project_path = "D:/code/vue/greater_wms"
  12. sys.path.append(project_path)
  13. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
  14. django.setup()
  15. print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Django环境已设置")
  16. def reconcile_material_history():
  17. """从后往前修复物料变动历史记录"""
  18. from container.models import MaterialStatistics, MaterialChangeHistory
  19. # 获取所有物料统计
  20. all_materials = MaterialStatistics.objects.all()
  21. for material in all_materials:
  22. # 获取该物料的所有变动历史记录(按时间倒序)
  23. print(f"处理物料 {material.goods_code} 的变动历史记录...")
  24. print(f"获取物料 {material.goods_code} 的所有变动历史记录...")
  25. history_records = MaterialChangeHistory.objects.filter(
  26. goods_code = material.goods_code
  27. ).order_by('-change_time')
  28. if not history_records.exists():
  29. continue
  30. print(f"总计获取到 {history_records.count()} 条{material.goods_code}历史记录")
  31. # 从物料统计中获取当前库存作为最后一个记录的期末数量
  32. current_quantity = material.total_quantity
  33. # 从后往前处理每个历史记录
  34. for i, record in enumerate(history_records):
  35. # 最后一个记录:使用当前库存作为期末数量
  36. if i == 0:
  37. record.closing_quantity = current_quantity
  38. else:
  39. # 前一个记录的期末数量就是当前记录的期初数量
  40. record.closing_quantity = history_records[i-1].opening_quantity
  41. # 计算期初数量(期末 + 出库 - 入库)
  42. record.opening_quantity = (
  43. record.closing_quantity
  44. + record.out_quantity
  45. - record.in_quantity
  46. )
  47. print(f"更新记录 {record.id},条目时间{record.change_time}: 期初 {record.opening_quantity}, 期末 {record.closing_quantity}, 入库 {record.in_quantity}, 出库 {record.out_quantity}")
  48. # 更新记录
  49. record.save()
  50. # 更新当前数量为当前记录的期初数量(用于下一个记录)
  51. current_quantity = record.opening_quantity
  52. # 验证第一个记录的期初数量是否合理
  53. first_record = history_records.last()
  54. if first_record.opening_quantity < 0:
  55. print(f"警告:物料 {material.goods_code} 的期初库存为负值: {first_record.opening_quantity}")
  56. # # 更新物料统计的总库存(应该与最后一个记录的期末数量一致)
  57. # material.total_quantity = history_records.first().closing_quantity
  58. # material.save()
  59. print("物料变动历史记录修复完成")
  60. def main():
  61. """主测试函数"""
  62. setup_django()
  63. print("\n===== 开始物料历史记录修复测试 =====")
  64. try:
  65. reconcile_material_history()
  66. except Exception as e:
  67. print(f"\n❌ 测试异常: {e}")
  68. import traceback
  69. traceback.print_exc()
  70. finally:
  71. # 清理测试数据
  72. print("\n===== 测试结束 =====")
  73. if __name__ == "__main__":
  74. main()