OrderPackageService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace app\backend\modules\order\services;
  3. use app\common\exceptions\AppException;
  4. use app\common\exceptions\ShopException;
  5. use app\common\models\order\OrderPackage;
  6. use app\frontend\models\OrderGoods;
  7. use Illuminate\Support\Collection;
  8. class OrderPackageService
  9. {
  10. /**
  11. * 过滤商品数量
  12. * @param Collection $orderGoodsCollect
  13. * @param Collection $orderPackageCollect
  14. * @return Collection
  15. */
  16. public static function filterGoods(Collection $orderGoodsCollect, Collection $orderPackageCollect)
  17. {
  18. if ($orderGoodsCollect->isEmpty()) {
  19. return $orderGoodsCollect;
  20. }
  21. if ($orderPackageCollect->isEmpty()) {
  22. return $orderGoodsCollect;
  23. }
  24. return $orderGoodsCollect->filter(function (&$item, $key) use ($orderPackageCollect) {
  25. $item['total'] -= $orderPackageCollect->where('order_id', $item['order_id'])
  26. ->where('order_goods_id', $item['id'])
  27. ->sum('total');
  28. if ($item['total'] <= 0) {
  29. return false;
  30. }
  31. return true;
  32. });
  33. }
  34. /**
  35. * 校验单包裹商品
  36. * @param Collection $orderPackageCollect
  37. * @param Collection $orderGoodsCollect
  38. * @return bool
  39. * @throws AppException
  40. */
  41. public static function checkGoodsPackage(Collection $orderPackageCollect, Collection $orderGoodsCollect)
  42. {
  43. $orderPackageCollect->each(function (&$item, $key) use ($orderPackageCollect, $orderGoodsCollect) {
  44. $goods = $orderGoodsCollect->where('id', $item['order_goods_id']);
  45. if ($goods->isEmpty()) {
  46. throw new ShopException('商品id:' . $item['order_goods_id'] . '不存在或已全部发货');
  47. }
  48. $num = $goods->sum('total') - $orderPackageCollect->where('order_goods_id', $item['order_goods_id'])->sum('total');
  49. if ($num < 0) {
  50. throw new ShopException('商品id:' . $item['order_goods_id'] . '超发数量' . abs($num));
  51. }
  52. });
  53. return true;
  54. }
  55. /**
  56. * 单包裹发货(一个物流)
  57. * @param int $order_id
  58. * @param int $express_id
  59. * @param Collection $orderGoodsCollect
  60. * @return \app\common\models\BaseModel|false
  61. */
  62. public static function saveOneOrderPackage(int $order_id, int $express_id, $orderGoods)
  63. {
  64. if (!$order_id or !$express_id) {
  65. return false;
  66. }
  67. $data = array();
  68. foreach ($orderGoods as $v) {
  69. $data[] = [
  70. 'uniacid' => \YunShop::app()->uniacid,
  71. 'order_id' => $order_id,
  72. 'order_goods_id' => $v['order_goods_id'] ?: $v['id'],
  73. 'total' => $v['total'],
  74. 'order_express_id' => $express_id,
  75. 'created_at' => time()
  76. ];
  77. }
  78. return OrderPackage::insert($data);
  79. }
  80. /**
  81. * 获取剩余未发货的商品
  82. * @param $order_id
  83. * @return Collection
  84. */
  85. public static function getNotDeliverGoods($order_id)
  86. {
  87. $order_goods = OrderGoods::uniacid()->where('order_id',$order_id)->whereNull('order_express_id')->get()->makeVisible('order_id');
  88. $order_package = OrderPackage::getOrderPackage($order_id)->where('order_express_id','!=',false);
  89. return static::filterGoods($order_goods,$order_package);
  90. }
  91. }