BuyAgainPurchase.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace addons\TinyShop\common\components\purchase;
  3. use Yii;
  4. use yii\web\UnprocessableEntityHttpException;
  5. use common\helpers\ArrayHelper;
  6. use common\helpers\BcHelper;
  7. use addons\TinyShop\common\components\InitOrderDataInterface;
  8. use addons\TinyShop\common\forms\PreviewForm;
  9. use addons\TinyShop\common\models\order\OrderProduct;
  10. /**
  11. * 再次购买
  12. *
  13. * Class BuyAgainPurchase
  14. * @package addons\TinyShop\common\components\purchase
  15. * @author jianyan74 <751393839@qq.com>
  16. */
  17. class BuyAgainPurchase extends InitOrderDataInterface
  18. {
  19. /**
  20. * @param PreviewForm $form
  21. * @return PreviewForm|mixed
  22. * @throws \yii\web\NotFoundHttpException
  23. * @throws \yii\web\UnprocessableEntityHttpException
  24. */
  25. public function execute(PreviewForm $form): PreviewForm
  26. {
  27. if (
  28. !$form->data['buy_again_id'] ||
  29. !($oldOrderProducts = Yii::$app->tinyShopService->orderProduct->findByOrderId($form->data['buy_again_id']))
  30. ) {
  31. throw new UnprocessableEntityHttpException('找不到订单');
  32. }
  33. $numMap = ArrayHelper::map($oldOrderProducts, 'sku_id', 'num');
  34. $nameMap = [];
  35. foreach ($oldOrderProducts as $oldOrderProduct) {
  36. $nameMap[$oldOrderProduct['sku_id']] = $oldOrderProduct['product_name'] . ' ' . $oldOrderProduct['sku_name'];
  37. }
  38. // 查找已有的sku
  39. $skus = Yii::$app->tinyShopService->productSku->findByIds(ArrayHelper::getColumn($oldOrderProducts, 'sku_id'));
  40. $skuIds = ArrayHelper::getColumn($skus, 'id');
  41. foreach ($nameMap as $key => $value) {
  42. if (!in_array($key, $skuIds)) {
  43. throw new UnprocessableEntityHttpException($value . ' 已失效');
  44. }
  45. }
  46. foreach ($skus as $model) {
  47. $orderProduct = new OrderProduct();
  48. $orderProduct = $orderProduct->loadDefaultValues();
  49. $orderProduct->merchant_id = $model['product']['merchant_id'];
  50. $orderProduct->product_id = $model['product_id'];
  51. $orderProduct->product_name = $model['product']['name'];
  52. $orderProduct->sku_id = $model['id'];
  53. $orderProduct->sku_name = $model['name'];
  54. $orderProduct->num = $numMap[$model['id']];
  55. $orderProduct->cost_price = BcHelper::mul($orderProduct->num, $model['cost_price']);
  56. $orderProduct->price = $model['price'];
  57. $orderProduct->product_money = BcHelper::mul($orderProduct->num, $orderProduct->price);
  58. $orderProduct->product_original_money = $orderProduct->product_money;
  59. $orderProduct->product_picture = !empty($model['picture']) ? $model['picture'] : $model['product']['picture'];
  60. $orderProduct->product_type = $model['product']['type'];
  61. $orderProduct->stock_deduction_type = $model['product']['stock_deduction_type'];
  62. $orderProduct->point_exchange_type = $model['product']['point_exchange_type'];
  63. $orderProduct->supplier_id = $model['product']['supplier_id'];
  64. $orderProduct->is_commission = $model['product']['is_commission'];
  65. // 默认数据带购物车数量方便计算
  66. $product = $model['product'];
  67. $product['number'] = $orderProduct->num;
  68. // 修改总订单
  69. $form->product_count += $orderProduct->num;
  70. $form->merchant_id = $orderProduct->merchant_id;
  71. $form->product_money = BcHelper::add($form->product_money, $orderProduct->product_money);
  72. $form->product_original_money = BcHelper::add($form->product_original_money, $orderProduct->product_money);
  73. $form->product_type = $orderProduct->product_type;
  74. $form->max_use_point += $model['product']['max_use_point'] * $orderProduct->num; // 最多抵现积分
  75. $form->defaultProducts[] = $product;
  76. $form->orderProducts[] = $orderProduct;
  77. $form->merchant = $form->merchant_id > 0 ? Yii::$app->services->merchant->findById($form->merchant_id) : [];
  78. unset($model['product'], $product);
  79. $form->sku[] = $model;
  80. }
  81. return $form;
  82. }
  83. /**
  84. * 下单类型
  85. *
  86. * @return string
  87. */
  88. public static function getType(): string
  89. {
  90. return 'buyAgain';
  91. }
  92. }
粤ICP备19079148号