WangDianTongLogic.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace addons\CloudStock\common\logic\order;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\models\CloudStockAgentOrder;
  5. use common\enums\OrderStatusEnum;
  6. use common\enums\ShippingTypeEnum;
  7. use common\enums\StatusEnum;
  8. use common\models\common\Express;
  9. use common\models\common\Region;
  10. use common\models\goods\Goods;
  11. use common\models\goods\GoodsAttr;
  12. class WangDianTongLogic
  13. {
  14. /**
  15. * @param CloudStockAgentOrder $order
  16. * @return array
  17. */
  18. public static function packMallOrder(CloudStockAgentOrder $order)
  19. {
  20. // 以为之前的逻辑,这里只处理一个订单。并且之前子订单ID和主订单ID一致 导致订单提交会报错
  21. $goodsIds = array_column($order->details, 'goods_id');
  22. // 因为自提订单没有属性选择。所以默认获取第一个商品属性
  23. $goodsAttr = GoodsAttr::find()
  24. ->where(['goods_id' => $goodsIds, 'status' => StatusEnum::ENABLED])
  25. ->select(['id', 'goods_id', 'price', 'original_price', 'cost_price', 'sign_id', 'pic_url'])
  26. ->with(['goods' => function ($query) {
  27. $query->select(['id', 'goods_name', 'original_price', 'cost_price', 'cover_pic']);
  28. }])->asArray()->groupBy('goods_id')->orderBy('id asc')->indexBy('goods_id')->all();
  29. // 获取当前订单的省市区名称
  30. $region_name = Region::find()->where(['id' => [$order->province_id, $order->city_id, $order->district_id]])
  31. ->orderBy('id asc')->select('name')->column();
  32. $amount = 0; // 订单总金额
  33. $returnOrderDetail = [];
  34. foreach ($order->details as $detail) {
  35. if (empty($goodsAttr[$detail->goods_id])) continue;
  36. // 计算商品总价
  37. $amount += $detail->num * $goodsAttr[$detail->goods_id]['price'] ?? 0;
  38. $returnOrderDetail[] = [
  39. 'id' => $detail->id,
  40. 'order_id' => $detail->order_id,
  41. 'user_id' => $detail->user_id,
  42. 'mall_id' => $detail->mall_id,
  43. 'mch_id' => 0,
  44. 'store_id' => 0,
  45. 'goods_id' => $detail->goods_id,
  46. 'goods_name' => $goodsAttr[$detail->goods_id]['goods']['goods_name'],
  47. 'goods_attr_id' => $goodsAttr[$detail->goods_id]['id'],
  48. 'goods_attr_name' => $goodsAttr[$detail->goods_id]['name'],
  49. 'sign_id' => $goodsAttr[$detail->goods_id]['sign_id'],
  50. 'attr_groups_format'=> null,
  51. 'price' => $goodsAttr[$detail->goods_id]['price'],
  52. 'cost_price' => $goodsAttr[$detail->goods_id]['cost_price'],
  53. 'original_goods_price' => $goodsAttr[$detail->goods_id]['goods']['original_price'],
  54. 'goods_price' => bcmul($amount, 1, 2),
  55. 'num' => $detail->num,
  56. 'adjust_money' => 0,
  57. 'pic_url' => !empty($goodsAttr[$detail->goods_id]['pic_url']) ? $goodsAttr[$detail->goods_id]['pic_url'] : $goodsAttr[$detail->goods_id]['goods']['cover_pic'],
  58. 'marketing_id' => 0,
  59. 'marketing_type' => 0,
  60. 'order_type' => StatusEnum::ENABLED,
  61. 'give_score' => 0,
  62. 'order_status' => OrderStatusEnum::PAY,
  63. 'shipping_status' => 0,
  64. 'is_feedback' => 0,
  65. 'remark' => '',
  66. 'is_evaluate' => 0,
  67. 'refund_balance_money' => 0,
  68. 'is_virtual' => 0,
  69. 'status' => StatusEnum::ENABLED,
  70. 'extra_info' => null,
  71. 'created_at' => $detail->created_at,
  72. 'updated_at' => $detail->updated_at,
  73. ];
  74. }
  75. // 设置返回订单数据
  76. $returnOrder = [
  77. 'id' => $order->id,
  78. 'mch_id' => 0,
  79. 'store_id' => 0,
  80. 'mall_id' => $order->mall_id,
  81. 'user_id' => $order->user_id,
  82. 'order_no' => "cs_{$order->id}",
  83. 'out_trade_no' => '',
  84. 'mobile' => $order->mobile,
  85. 'province' => $order->province_id,
  86. 'city' => $order->city_id,
  87. 'area' => $order->district_id,
  88. 'town' => 0,
  89. 'community' => 0,
  90. 'address' => $order->address,
  91. 'region_name' => implode(" ", $region_name),
  92. 'zip' => '',
  93. 'receiver_name' => $order->name,
  94. 'remark' => $order->remark,
  95. 'seller_remark' => '',
  96. 'shipping_type' => ShippingTypeEnum::LOGISTICS,
  97. 'shipping_money' => 0,
  98. 'reduce_shipping_money' => 0,
  99. 'refund_money' => 0,
  100. 'pay_money' => $amount,
  101. 'goods_price' => $amount,
  102. 'original_goods_price' => $amount,
  103. 'ip' => '',
  104. 'coupon_id' => 0,
  105. 'coupon_money' => 0,
  106. 'score' => 0,
  107. 'score_money' => 0,
  108. 'order_status' => OrderStatusEnum::PAY,
  109. 'pay_status' => StatusEnum::ENABLED,
  110. 'shipping_status' => 0,
  111. 'review_status' => 0,
  112. 'is_feedback' => 0,
  113. 'payment_type' => '',
  114. 'marketing_id' => 0,
  115. 'marketing_type' => '',
  116. 'invoice_id' => 0,
  117. 'status' => StatusEnum::ENABLED,
  118. 'is_comment' => 0,
  119. 'is_recycle' => 0,
  120. 'is_virtual' => 0,
  121. 'is_new_user' => 0,
  122. 'pay_time' => $order->created_at,
  123. 'shipping_time' => 0,
  124. 'sign_time' => 0,
  125. 'consign_time' => 0,
  126. 'finish_time' => 0,
  127. 'close_time' => 0,
  128. 'extra_info' => null,
  129. 'order_source' => '',
  130. 'created_at' => $order->created_at,
  131. 'updated_at' => $order->updated_at,
  132. ];
  133. $returnOrder['detail'] = $returnOrderDetail;
  134. return $returnOrder;
  135. }
  136. /**
  137. * @param array $params
  138. * @param array $express
  139. * @return bool|string
  140. */
  141. public static function syncLogistics(array $params, array $express)
  142. {
  143. $id = intval($params['id']);
  144. $order = CloudStockAgentOrder::findOne(['id' => $id]);
  145. if (empty($order)) return true;
  146. $params['send_status'] = CloudStockEnum::SEND_STATUS_1;
  147. $ret = CloudStockAgentOrder::setData($order->mall_id, $params, $express);
  148. return $ret !== false ? true : CloudStockAgentOrder::getStaticError();
  149. }
  150. }