OrderController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <?php
  2. namespace addons\UpgradeGift\api\modules\v1\controllers;
  3. use addons\UpgradeGift\common\enums\GiftEnum;
  4. use addons\UpgradeGift\common\logic\order\OrderFormLogic;
  5. use addons\UpgradeGift\common\logic\order\OrderInitDataLogic;
  6. use addons\UpgradeGift\common\logic\order\OrderLimitLogic;
  7. use addons\UpgradeGift\common\logic\order\OrderMarketingLogic;
  8. use addons\UpgradeGift\common\logic\order\OrderValidateLogic;
  9. use addons\UpgradeGift\common\models\UpgradeGiftGoods;
  10. use addons\UpgradeGift\common\models\UpgradeGiftGrantLog;
  11. use addons\UpgradeGift\common\models\UpgradeGiftStatistics;
  12. use addons\UpgradeGift\common\services\UpgradeGiftGoodsService;
  13. use api\controllers\OnAuthController;
  14. use common\enums\AddonsEnum;
  15. use common\enums\AppEnum;
  16. use common\enums\RedisKeyEnum;
  17. use common\enums\ShippingTypeEnum;
  18. use common\enums\StatusEnum;
  19. use common\helpers\FormatHelper;
  20. use common\helpers\LockHelper;
  21. use common\models\goods\Goods;
  22. use common\models\goods\GoodsAttr;
  23. use common\models\order\Order;
  24. use common\models\user\UserAddress;
  25. use Exception;
  26. use Yii;
  27. /**
  28. * 订单控制器
  29. *
  30. * Class OrderController
  31. *
  32. * @package addons\UpgradeGift\api\controllers
  33. */
  34. class OrderController extends OnAuthController
  35. {
  36. public $modelClass = '';
  37. /**
  38. * 不用进行登录验证的方法
  39. *
  40. * 例如: ['index', 'update', 'create', 'view', 'delete']
  41. * 默认全部需要验证
  42. *
  43. * @var array
  44. */
  45. protected $authOptional = [];
  46. /**
  47. * 订单预览
  48. *
  49. * @Author bing
  50. * @DateTime 2021-09-24 19:46:46
  51. * @return void
  52. * @copyright: Copyright (c) 2020 广东七件事集团
  53. */
  54. public function actionPreview()
  55. {
  56. try {
  57. $orderFormLogic = new OrderFormLogic();
  58. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  59. $form->attributes = Yii::$app->request->post();
  60. $form['action'] = AppEnum::ACTION_PREVIEW;
  61. !empty($form->shipping_type) && $form->shipping_type = ShippingTypeEnum::LOGISTICS;
  62. $upgradeGiftGoodsService = new UpgradeGiftGoodsService(['mall_id' => $form->mall_id, 'user_id' => $form->user_id]);
  63. if (!$upgradeGiftGoodsService->getIsEnable()) {
  64. return $this->error('非法请求');
  65. }
  66. // 初始化订单数据
  67. $orderInitDataLogic = new OrderInitDataLogic();
  68. $form = $orderInitDataLogic->execute($form, $form->type);
  69. if ($form === false) return $this->error($orderInitDataLogic->getError());
  70. // 购买限制验证
  71. $orderLimitLogic = new OrderLimitLogic();
  72. $form = $orderLimitLogic->run($form);
  73. if ($form === false) return $this->error($orderLimitLogic->getError());
  74. // 获取收货地址
  75. $address_info = UserAddress::getUserAddress($this->user_id, $form->address_id);
  76. $form->address_id = $address_info['id'] ?? 0;
  77. // 营销减免活动
  78. $orderMarketingLogic = new OrderMarketingLogic();
  79. $form = $orderMarketingLogic->run($form);
  80. if ($form === false) return $this->error($orderMarketingLogic->getError());
  81. $group_order_goods = $form['group_order_goods'];
  82. $group_order_goods_list = [];
  83. foreach ($group_order_goods as $val) {
  84. $group_order_goods_list[] = $val;
  85. }
  86. $marketing = $form['marketing'] ?? [];
  87. $shipping_type_list = ShippingTypeEnum::getMap();
  88. $option_list = [];
  89. $group_order_goods = $group_order_goods_list;
  90. $extends_fields = [];
  91. $info = compact('group_order_goods', 'marketing', 'address_info', 'shipping_type_list', 'option_list', 'extends_fields');
  92. $form['total_pay_money'] = max($form['total_pay_money'], 0);
  93. $info['total_pay_money'] = '¥' . $form['total_pay_money'];
  94. $info['total_pay_money_not_coupon'] = $form['total_pay_money_not_coupon'];
  95. $info['is_address'] = $form['is_address'] ?? 0;
  96. $info['is_virtual'] = $form['is_virtual'] ?? 0;
  97. $info['is_sign_agreement'] = $form['is_sign_agreement'] ?? 0;
  98. $info['shipping_type'] = $form->data['shipping_type'] ?? null;
  99. $form->data['type'] = $form->type;
  100. return $this->success('操作成功', $info);
  101. } catch (Exception $e) {
  102. return $this->error($e->getMessage());
  103. }
  104. }
  105. /**
  106. * 创建订单(兑换礼品,0元下单)
  107. *
  108. * @return mixed|null
  109. */
  110. public function actionCreate()
  111. {
  112. try {
  113. $orderFormLogic = new OrderFormLogic();
  114. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  115. $post = Yii::$app->request->post();
  116. $post['data']['marketing_type'] = AddonsEnum::ADDONS_NAME_UPGRADEGIFT; // TODO 赠送奖品类型
  117. $form->attributes = $post;
  118. $form['action'] = AppEnum::ACTION_CREATE;
  119. $upgradeGiftGoodsService = new UpgradeGiftGoodsService(['mall_id' => $form->mall_id, 'user_id' => $form->user_id]);
  120. if (!$upgradeGiftGoodsService->getIsEnable()) {
  121. return $this->error('非法请求');
  122. }
  123. // 初始化订单数据
  124. $orderInitDataLogic = new OrderInitDataLogic();
  125. $form = $orderInitDataLogic->execute($form, $form->type);
  126. if ($form === false) return $this->error($orderInitDataLogic->getError());
  127. // 购买限制验证
  128. $orderLimitLogic = new OrderLimitLogic();
  129. $form = $orderLimitLogic->run($form);
  130. if ($form === false) return $this->error($orderLimitLogic->getError());
  131. // 数据校验
  132. $flag = OrderValidateLogic::run($form);
  133. if (is_string($flag)) return $this->error($flag);
  134. // 这个等级是否有奖品可以领取
  135. $giftGoods = $upgradeGiftGoodsService->getUnclaimedGiftGoodsIdByLevel([$form->data['level']]);
  136. if (empty($giftGoods)) {
  137. return $this->error('非法请求');
  138. }
  139. // 验证提交过来的商品是不是可领取的商品
  140. $queryGoodsAttr = GoodsAttr::find()->select('goods_id, name');
  141. GoodsAttr::paramPack(['where' => [['<>', 'status', StatusEnum::DELETE], ['id' => $form->data['attr_id']]]], $queryGoodsAttr);
  142. $goodsAttr = $queryGoodsAttr->one();
  143. if (empty($goodsAttr)) {
  144. return $this->error('非法请求');
  145. }
  146. $attrGoodsId = $goodsAttr->goods_id;
  147. if ($attrGoodsId != $giftGoods['goods_id']) {
  148. return $this->error('非法请求');
  149. }
  150. // 加锁
  151. $createOrderLockKey = RedisKeyEnum::suffix(
  152. RedisKeyEnum::CREATE_UPGRADE_GIFT_ORDER_LOCK,
  153. sprintf('%d-%d', $this->user_id, $form->data['level'])
  154. );
  155. $identification = $this->user_id;
  156. if (!LockHelper::lock($createOrderLockKey, $identification, 30, 60)) throw new Exception('当前访问人数过多');
  157. // 当前用户这个等级是否存在待领取的奖品
  158. $unclaimedGiftId = UpgradeGiftGoods::getUnclaimedGiftIdByLevel($form->user_id, $form->data['level']);
  159. if (!$unclaimedGiftId) {
  160. return $this->error('非法请求');
  161. }
  162. // 营销减免活动
  163. $orderMarketingLogic = new OrderMarketingLogic();
  164. $form = $orderMarketingLogic->run($form, true);
  165. if ($form === false) return $this->error($orderMarketingLogic->getError());
  166. $t = Yii::$app->db->beginTransaction();
  167. $res = Order::createOrder($form);
  168. if ($res === false) {
  169. $t->rollBack();
  170. Yii::error(sprintf('方法:%s,创建订单失败,错误原因%s', __METHOD__, Order::getStaticError()));
  171. return $this->error(Order::getStaticError());
  172. }
  173. // 修改领取状态
  174. $updateRes = UpgradeGiftGoods::setData([
  175. 'id' => $unclaimedGiftId,
  176. 'status' => 1,
  177. 'receive_time' => time(),
  178. 'order_id' => isset($res['transaction']['order_ids']) ? (int)trim($res['transaction']['order_ids'], ',') : 0, // 由于下单是可能存在多个id的,但是目前限制只有一个赠送商品,所以不存在多个订单id,可以直接拿
  179. 'goods_id' => $attrGoodsId,
  180. 'attr_id' => $form->data['attr_id'],
  181. ]);
  182. if ($updateRes === false) {
  183. $t->rollBack();
  184. Yii::error(sprintf('方法:%s,更新奖品表数据失败,错误原因%s', __METHOD__, UpgradeGiftGoods::getStaticError()));
  185. return $this->error('下单失败!');
  186. }
  187. UpgradeGiftStatistics::updateAllCounters(
  188. ['actual_goods_num' => 1],
  189. ['mall_id' => $this->mall_id, 'gift_type' => GiftEnum::GIFT_TYPE_USER, 'status' => StatusEnum::ENABLED, 'level' => $form->data['level']]
  190. );
  191. UpgradeGiftGrantLog::setData([
  192. 'mall_id' => $this->mall_id,
  193. 'gift_type' => GiftEnum::GIFT_TYPE_USER,
  194. 'user_id' => $this->user_id,
  195. 'level' => $form->data['level'],
  196. 'goods_id' => $attrGoodsId,
  197. 'attr_id' => $form->data['attr_id'],
  198. 'goods_name' => Goods::find()->select('goods_name')->where(['id' => $attrGoodsId])->scalar(),
  199. 'attr_name' => $goodsAttr->name
  200. ]);
  201. $t->commit();
  202. return $this->success('操作成功', $res);
  203. } catch (Exception $e) {
  204. if (isset($t)) {
  205. $t->rollBack();
  206. }
  207. Yii::error(FormatHelper::exception($e, '领取奖品,创建订单失败'));
  208. return $this->error($e->getMessage());
  209. } finally {
  210. if (isset($createOrderLockKey, $identification)) {
  211. LockHelper::uLock($createOrderLockKey, $identification);
  212. }
  213. }
  214. }
  215. }