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.

229 lines
8.0 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\ExpressTemplate;
  6. use backend\modules\shop\models\ars\Order;
  7. use backend\modules\shop\models\ars\OrderGoods;
  8. use Yii;
  9. use yii\db\Exception;
  10. class DeliveryManager
  11. {
  12. /**
  13. * @param $order
  14. * @param $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. $deliveryGoods = json_decode($data['deliveryGoods']);
  27. $delivery->load($data);
  28. $delivery->order_id = $order->id;
  29. if (!$delivery->save()) {
  30. throw new Exception('保存物流信息失败');
  31. }
  32. $order->status = Order::STATUS_SHIPMENT_ALL;
  33. /*发货商品数据*/
  34. foreach ($deliveryGoods as $k => $value) {
  35. $model = new DeliveryGoods();
  36. $model->delivery_id = $delivery->id;
  37. $model->order_goods_id = $value->id;
  38. $model->goods_id = $value->goods_id;
  39. $model->goods_name = $value->goods_name;
  40. $model->goods_count = $value->goods_count;
  41. /*如果是部分发货*/
  42. if ($model->goods_count < $value->lack_number) {
  43. $order->status = Order::STATUS_SHIPMENT_PORTION;
  44. }
  45. if (!$model->save()) {
  46. throw new Exception('delivery_goods save false');
  47. }
  48. }
  49. if (!$order->save()) {
  50. throw new Exception('order shipping_status update false');
  51. }
  52. if ($order->status == Order::STATUS_SHIPMENT_PORTION|| Delivery::findOne(['!=', 'id', $delivery->id])) {
  53. $delivery->type = Delivery::TYPE_SHIPMENT_PORTION;
  54. } else {
  55. $delivery->type = Delivery::TYPE_SHIPMENT_ALL;
  56. }
  57. if (!$delivery->save()) {
  58. throw new Exception('保存物流信息失败');
  59. }
  60. $transaction->commit();
  61. return ['status' => true];
  62. } catch (Exception $e) {
  63. $transaction->rollBack();
  64. return ['status' => false, 'info' => $e->getMessage()];
  65. }
  66. }
  67. /**
  68. * @param $order_id
  69. * @return array
  70. * @throws Exception
  71. * 获取发货全部商品信息
  72. */
  73. public static function deliveryGoodsInfo($order_id)
  74. {
  75. $delivery = Delivery::find()->select('id')->where(['order_id' => $order_id])->all();
  76. /*如果该订单是首次发货*/
  77. if (!$delivery) {
  78. $unShippend = self::firstDelivery($order_id);
  79. return ['unShipped' => $unShippend];
  80. }
  81. $deliveryIds = [];
  82. foreach ($delivery as $value) {
  83. $deliveryIds[] = $value->id;
  84. }
  85. $filter = [];
  86. $deliveryGoods = DeliveryGoods::find()->where(['delivery_id' => $deliveryIds])->all();
  87. for ($i = 0; $i < count($deliveryGoods); $i++) {
  88. $orderGoodsId = $deliveryGoods[$i]['order_goods_id'];
  89. //以orderGoods的id为键名,以orderGoods的数量为键值,先保存到filter数组中
  90. $filter[$orderGoodsId] = $deliveryGoods[$i]['goods_count'];
  91. for ($j = 0; $j < count($deliveryGoods); $j++) {
  92. //如果发货商品中有其他相同orderGoods的商品
  93. if ($orderGoodsId == $deliveryGoods[$j]['order_goods_id'] && $i !== $j) {
  94. //商品数量叠加起来并保存
  95. $filter[$orderGoodsId] += $deliveryGoods[$j]['goods_count'];
  96. }
  97. }
  98. }
  99. /*获取订单已发的商品和未发的商品*/
  100. return self::getDeliveryGoodsInfo($filter, $order_id);
  101. }
  102. /**
  103. * @param $order_id
  104. * @return array
  105. * 首次发货直接获取orderGoods的内容
  106. */
  107. private static function firstDelivery($order_id)
  108. {
  109. $unShippedGoods = [];
  110. $orderGoods = OrderGoods::find()->where(['order_id' => $order_id])->all();
  111. foreach ($orderGoods as $k => $v) {
  112. $unShippedGoods[] = [
  113. 'id' => $v->id,
  114. 'goods_id' => $v->goods_id,
  115. 'goods_img' => $v->goods_img,
  116. 'goods_name' => $v->goods_name,
  117. 'goods_count' => $v->goods_count,
  118. 'lack_number' => $v->goods_count,
  119. 'sku_value' => $v->sku_value,
  120. ];
  121. }
  122. return $unShippedGoods;
  123. }
  124. /**
  125. * @param $filter
  126. * @param $order_id
  127. * @return array
  128. * @throws Exception
  129. * 获取订单已发的商品和未发的商品
  130. */
  131. public static function getDeliveryGoodsInfo($filter, $order_id)
  132. {
  133. $unShipped = []; //未发货商品
  134. foreach ($filter as $k => $value) { //键名为order_goods_id,键值为对应的已发货数量
  135. $goodsData = self::getOrderGoodsInfo($k);
  136. if ($value < $goodsData['goods_count']) { //如果已发货数量未达到order_goods里的数量
  137. $lack_number = $goodsData['goods_count'] - $value;
  138. $goodsData['lack_number'] = $lack_number;
  139. $goodsData['goods_count'] = $lack_number;
  140. $unShipped[] = $goodsData;
  141. }
  142. }
  143. $shipped = self::getDeliveryInfo($order_id); //已发货商品信息
  144. return ['shipped' => $shipped, 'unShipped' => $unShipped];
  145. }
  146. /**
  147. * @param $order_id
  148. * @return array
  149. * @throws Exception
  150. * 通过订单id获取发货信息
  151. */
  152. public static function getDeliveryInfo($order_id)
  153. {
  154. $deliveryInfo = [];
  155. $delivery = Delivery::findAll(['order_id' => $order_id]);
  156. foreach ($delivery as $k => $value) {
  157. // $expressTemplate = ExpressTemplate::find()
  158. // ->select('name')
  159. // ->where(['id' => $value->shipping_id])
  160. // ->one();
  161. // $deliveryInfo[$k]['logisticInfo'] = [
  162. // 'exp_name'=> $expressTemplate ? $expressTemplate->name : '',
  163. // 'invoice_no'=> $value->invoice_no
  164. // ]; //物流公司和运单号
  165. $deliveryInfo[$k]['goodsInfo'] = self::getDeliverGoodsInfo($value->id); //获取商品信息
  166. }
  167. return $deliveryInfo;
  168. }
  169. /**
  170. * @param $delivery_id
  171. * @return array
  172. * @throws Exception
  173. * 通过获取订单已发货的商品信息
  174. */
  175. public static function getDeliverGoodsInfo($delivery_id)
  176. {
  177. $goodsInfo = [];
  178. $deliveryGoods = DeliveryGoods::find()
  179. ->where(['delivery_id' => $delivery_id])
  180. ->andWhere(['>', 'goods_count', 0])
  181. ->all();
  182. foreach ($deliveryGoods as $value) {
  183. $goodsData = self::getOrderGoodsInfo($value->order_goods_id);
  184. $goodsData['delivery_number'] = $value->goods_count;
  185. $goodsInfo[] = $goodsData;
  186. }
  187. return $goodsInfo;
  188. }
  189. /**
  190. * @param $order_goods_id
  191. * @return array
  192. * @throws Exception
  193. * 获取订单商品信息
  194. */
  195. private static function getOrderGoodsInfo($order_goods_id)
  196. {
  197. $orderGoods = OrderGoods::findOne($order_goods_id); //通过orderGoods_id找到订单商品
  198. if ($orderGoods) {
  199. $goodsData = [
  200. 'id' => $orderGoods->id,
  201. 'goods_id' => $orderGoods->goods_id,
  202. 'goods_name' => $orderGoods->goods_name,
  203. 'goods_count' => $orderGoods->goods_count,
  204. 'goods_img' => $orderGoods->goods_img,
  205. 'sku_value' => $orderGoods->sku_value,
  206. ];
  207. return $goodsData;
  208. } else {
  209. throw new Exception('order_goods not found');
  210. }
  211. }
  212. }