You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
5.8 KiB

  1. <?php
  2. namespace backend\modules\shop\logic\delivery;
  3. use backend\modules\shop\models\ars\Delivery;
  4. use backend\modules\shop\models\ars\DeliveryGoods;
  5. use backend\modules\shop\models\ars\Order;
  6. use backend\modules\shop\models\ars\OrderGoods;
  7. use Yii;
  8. use yii\db\Exception;
  9. use yii\helpers\ArrayHelper;
  10. class DeliveryManager
  11. {
  12. /**
  13. * @param Order $order
  14. * @param Delivery $delivery
  15. * @return array
  16. * 订单发货
  17. */
  18. public static function orderDelivery($order, $delivery)
  19. {
  20. $transaction = Yii::$app->db->beginTransaction();
  21. try {
  22. $data = Yii::$app->request->post();
  23. if (empty($data['deliveryGoods'])) {
  24. throw new Exception('缺少发货商品信息');
  25. }
  26. $delivery->load($data);
  27. $delivery->order_id = $order->id;
  28. if (!$delivery->save()) {
  29. throw new Exception('保存物流信息失败');
  30. }
  31. /*发货商品数据*/
  32. $orderStatus = self::saveDeliveryGoods($data['deliveryGoods'], $delivery->id);
  33. $order->status = $orderStatus;
  34. if (!$order->save()) {
  35. throw new Exception('order shipping_status update false');
  36. }
  37. if ($orderStatus == Order::STATUS_SHIPMENT_PORTION || Delivery::findOne(['!=', 'id', $delivery->id])) {
  38. $delivery->type = Delivery::TYPE_SHIPMENT_PORTION;
  39. } else {
  40. $delivery->type = Delivery::TYPE_SHIPMENT_ALL;
  41. }
  42. if (!$delivery->save()) {
  43. throw new Exception('保存物流信息失败');
  44. }
  45. $transaction->commit();
  46. return ['status' => true];
  47. } catch (Exception $e) {
  48. $transaction->rollBack();
  49. return ['status' => false, 'info' => $e->getMessage()];
  50. }
  51. }
  52. /**
  53. * @param $deliveryGoods
  54. * @param $delivery_id
  55. * @return int
  56. * @throws Exception
  57. * 保存发货商品信息
  58. */
  59. private static function saveDeliveryGoods($deliveryGoods, $delivery_id)
  60. {
  61. $status = Order::STATUS_SHIPMENT_ALL;
  62. foreach ($deliveryGoods as $id => $goodsCount) {
  63. if ($goodsCount < 0) {
  64. throw new Exception('操作异常,发货数量不能小于0');
  65. } elseif ($goodsCount == 0) {
  66. continue;
  67. }
  68. $orderGoods = OrderGoods::findOne($id);
  69. /*如果是发货数量不是全部,订单状态为部分发货*/
  70. $deliveryGoodsCount = DeliveryGoods::find()->where(['order_goods_id' => $id])->sum('goods_count');
  71. if (($deliveryGoodsCount + $goodsCount) < $orderGoods->goods_count) { //如果已发货数量未达到order_goods里的数量
  72. $status = Order::STATUS_SHIPMENT_PORTION;
  73. } elseif (($deliveryGoodsCount + $goodsCount) > $orderGoods->goods_count) {
  74. throw new Exception('操作异常,现发货数量超过之前缺少的发货数量');
  75. }
  76. $model = new DeliveryGoods();
  77. $model->delivery_id = $delivery_id;
  78. $model->order_goods_id = $orderGoods->id;
  79. $model->goods_id = $orderGoods->goods_id;
  80. $model->goods_name = $orderGoods->goods_name;
  81. $model->goods_count = $goodsCount;
  82. if (!$model->save()) {
  83. throw new Exception('delivery_goods save false');
  84. }
  85. }
  86. return $status;
  87. }
  88. /**
  89. * @param $order_id
  90. * @return array
  91. * 查询订单发货商品信息
  92. */
  93. public static function deliveryGoodsInfo($order_id)
  94. {
  95. $delivery = Delivery::findAll(['order_id' => $order_id]);
  96. /*如果该订单是首次发货*/
  97. if ($delivery) {
  98. /*获取订单已发的商品和未发的商品*/
  99. return self::getDeliveryGoodsInfo($delivery);
  100. } else {
  101. $unShippedGoods = OrderGoods::find()->where(['order_id' => $order_id])->all();
  102. return ['unShipped' => $unShippedGoods];
  103. }
  104. }
  105. /**
  106. * @param $delivery
  107. * @return array
  108. * 获取订单已发的商品和未发的商品
  109. */
  110. public static function getDeliveryGoodsInfo($delivery)
  111. {
  112. $data = [];
  113. $deliveryIds = [];
  114. foreach ($delivery as $k => $value) {
  115. $deliveryIds[] = $value->id;
  116. $orderGoodsIds = DeliveryGoods::find()
  117. ->select('order_goods_id')
  118. ->where(['delivery_id' => $value->id])
  119. ->andWhere(['>', 'goods_count', 0])
  120. ->column();
  121. $value->deliveryGoods = OrderGoods::findAll($orderGoodsIds);
  122. }
  123. $data['shipped'] = $delivery;
  124. $deliveryGoodsData = [];
  125. $deliveryGoods = DeliveryGoods::find()
  126. ->select(['order_goods_id', 'goods_count'])
  127. ->where(['delivery_id' => $deliveryIds])
  128. ->andWhere(['>', 'goods_count', 0])
  129. ->all();
  130. foreach ($deliveryGoods as $k => $value) {
  131. $orderGoods = $value->order_goods_id;
  132. if (isset($deliveryGoodsData[$orderGoods])) {
  133. $deliveryGoodsData[$orderGoods] += $value->goods_count;
  134. } else {
  135. $deliveryGoodsData[$orderGoods] = $value->goods_count;
  136. }
  137. }
  138. foreach ($deliveryGoodsData as $k => $value) { //键名为order_goods_id,键值为对应的已发货数量
  139. $orderGoods = OrderGoods::findOne($k); //通过orderGoods_id找到订单商品
  140. if ($value < $orderGoods->goods_count) { //如果已发货数量未达到order_goods里的数量
  141. $orderGoods->lack_number = $orderGoods->goods_count - $value;
  142. $data['unShipped'][] = $orderGoods;
  143. }
  144. }
  145. return $data;
  146. }
  147. }