InitOrderDataInterface.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. namespace addons\TinyShop\common\components;
  3. use Yii;
  4. use yii\helpers\Json;
  5. use yii\web\UnprocessableEntityHttpException;
  6. use common\helpers\ArrayHelper;
  7. use common\helpers\StringHelper;
  8. use addons\TinyShop\common\enums\ShippingTypeEnum;
  9. use addons\TinyShop\common\models\order\OrderProduct;
  10. use addons\TinyShop\common\forms\PreviewForm;
  11. use addons\TinyShop\common\traits\AutoCalculatePriceTrait;
  12. use addons\TinyShop\common\enums\ProductShippingTypeEnum;
  13. /**
  14. * Interface InitOrderDataInterface
  15. * @package addons\TinyShop\common\components\purchase
  16. */
  17. abstract class InitOrderDataInterface
  18. {
  19. use AutoCalculatePriceTrait;
  20. /**
  21. * 创建记录
  22. *
  23. * @var bool
  24. */
  25. public $isNewRecord = false;
  26. /**
  27. * 执行
  28. *
  29. * @param PreviewForm $form
  30. * @return mixed
  31. */
  32. abstract public function execute(PreviewForm $form): PreviewForm;
  33. /**
  34. * 下单类型
  35. *
  36. * @return string
  37. */
  38. abstract public static function getType(): string;
  39. /**
  40. * 触发商品自带营销
  41. *
  42. * 例如:会员折扣、限时折扣、阶梯优惠等
  43. *
  44. * @param PreviewForm $previewForm
  45. * @param string $type 下单类型
  46. * @param bool $create 是否创建订单
  47. * @return PreviewForm
  48. * @throws UnprocessableEntityHttpException
  49. */
  50. public function afterExecute(PreviewForm $previewForm, string $type): PreviewForm
  51. {
  52. // 重组默认商品信息
  53. $defaultProducts = ArrayHelper::arrayKey($previewForm->defaultProducts, 'id');
  54. $orderProducts = $previewForm->orderProducts;
  55. $groupOrderProducts = [];
  56. /** @var OrderProduct $item 商品重新归类组别 */
  57. foreach ($orderProducts as $item) {
  58. if (!isset($groupOrderProducts[$item->product_id])) {
  59. $groupOrderProducts[$item->product_id] = [];
  60. $groupOrderProducts[$item->product_id]['product_id'] = $item->product_id;
  61. $groupOrderProducts[$item->product_id]['product_money'] = 0;
  62. $groupOrderProducts[$item->product_id]['count'] = 0;
  63. $groupOrderProducts[$item->product_id]['max_use_point'] = 0;
  64. $groupOrderProducts[$item->product_id]['name'] = $item->product_name;
  65. $groupOrderProducts[$item->product_id]['merchant_id'] = $item->merchant_id;
  66. $groupOrderProducts[$item->product_id]['products'] = [];
  67. $groupOrderProducts[$item->product_id]['cateIds'] = []; // 商家分类
  68. $groupOrderProducts[$item->product_id]['platformCateIds'] = []; // 平台分类
  69. $groupOrderProducts[$item->product_id]['allCateIds'] = []; // 商家分类(包含上级)
  70. $groupOrderProducts[$item->product_id]['allPlatformCateIds'] = []; // 商家分类(包含上级)
  71. // 记录所有产品ID 和 产品对应的所属分类
  72. $previewForm->productIds[] = $item->product_id;
  73. foreach ($defaultProducts[$item->product_id]['cateMap'] as $cateMap) {
  74. if ($cateMap['merchant_id'] == 0) {
  75. $previewForm->platformCateIds[] = $cateMap['cate_id'];
  76. $groupOrderProducts[$item->product_id]['platformCateIds'][] = $cateMap['cate_id'];
  77. } else {
  78. $previewForm->cateIds[] = $cateMap['cate_id'];
  79. $groupOrderProducts[$item->product_id]['cateIds'][] = $cateMap['cate_id'];
  80. }
  81. }
  82. }
  83. $groupOrderProducts[$item->product_id]['product_money'] += $item->product_money;
  84. $groupOrderProducts[$item->product_id]['max_use_point'] += $defaultProducts[$item->product_id]['max_use_point'] * $item->num;
  85. $groupOrderProducts[$item->product_id]['count'] += $item->num;
  86. $groupOrderProducts[$item->product_id]['products'][] = $item;
  87. // 计算运费
  88. if (in_array($defaultProducts[$item->product_id]['shipping_type'], [ProductShippingTypeEnum::USER_PAY, ProductShippingTypeEnum::FIXATION])) {
  89. $previewForm->freight = true;
  90. }
  91. }
  92. // 获取全部分类(包含上级)
  93. $cateIds = Yii::$app->tinyShopService->productCate->getParentIds(array_merge($previewForm->cateIds, $previewForm->platformCateIds));
  94. // 写入组别
  95. $previewForm->groupOrderProducts = $groupOrderProducts;
  96. // 重新计算价格
  97. $previewForm = $this->calculatePrice($previewForm);
  98. // 重新获取组别
  99. $groupOrderProducts = $previewForm->groupOrderProducts;
  100. foreach ($groupOrderProducts as $product_id => &$groupOrderProduct) {
  101. $defaultProduct = $defaultProducts[$product_id];
  102. // 创建订单校验
  103. if ($this->isNewRecord == true) {
  104. // 单次最少购买
  105. if ($defaultProduct['min_buy'] > 0 && $groupOrderProduct['count'] < $defaultProduct['min_buy']) {
  106. throw new UnprocessableEntityHttpException(StringHelper::textNewLine($groupOrderProduct['name'], 10, 1)[0] . ' 最少购买数量为 ' . $defaultProduct['min_buy']);
  107. }
  108. // 最多购买
  109. $myMaxBuy = $defaultProduct['myGet']['all_num'] ?? 0;
  110. if ($defaultProduct['max_buy'] > 0 && (($myMaxBuy + $groupOrderProduct['count']) > $defaultProduct['max_buy'])) {
  111. throw new UnprocessableEntityHttpException(StringHelper::textNewLine($groupOrderProduct['name'], 10, 1)[0] . ' 最多可购买数量为 ' . $defaultProduct['max_buy']);
  112. }
  113. // 配送方式
  114. if (
  115. !empty($deliveryType = Json::decode($defaultProduct['delivery_type'])) &&
  116. !in_array($previewForm->shipping_type, $deliveryType)
  117. ) {
  118. throw new UnprocessableEntityHttpException(StringHelper::textNewLine($groupOrderProduct['name'], 10, 1)[0] . '不支持' . ShippingTypeEnum::getValue($previewForm->shipping_type));
  119. }
  120. }
  121. //-------------------------- 分类重组 -------------------------- //
  122. foreach ($groupOrderProduct['cateIds'] as $cateId) {
  123. if (isset($cateIds[$cateId])) {
  124. $groupOrderProduct['allCateIds'] = array_merge($groupOrderProduct['allCateIds'], $cateIds[$cateId]);
  125. }
  126. }
  127. foreach ($groupOrderProduct['platformCateIds'] as $cateId) {
  128. if (isset($cateIds[$cateId])) {
  129. $groupOrderProduct['allPlatformCateIds'] = array_merge($groupOrderProduct['allPlatformCateIds'], $cateIds[$cateId]);
  130. }
  131. }
  132. }
  133. $previewForm->groupOrderProducts = $groupOrderProducts;
  134. return $previewForm;
  135. }
  136. }
粤ICP备19079148号