DefaultController.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. <?php
  2. namespace addons\GroupBuy\api\modules\v1\controllers;
  3. use addons\GroupBuy\common\enums\GroupBuyEnum;
  4. use addons\GroupBuy\common\logic\order\OrderInitDataLogic;
  5. use addons\GroupBuy\common\logic\order\OrderLimitLogic;
  6. use addons\GroupBuy\common\logic\order\OrderMarketingLogic;
  7. use addons\GroupBuy\common\models\GroupBuyActive;
  8. use addons\GroupBuy\common\models\GroupBuyOrder;
  9. use common\enums\AppEnum;
  10. use common\enums\PreviewTypeEnum;
  11. use common\enums\ShippingTypeEnum;
  12. use common\enums\StatusEnum;
  13. use common\models\common\AddonsMarketingSetting;
  14. use common\models\common\PaymentTrade;
  15. use common\models\common\PaymentTradeOrder;
  16. use common\models\goods\Goods;
  17. use common\models\order\Order;
  18. use common\models\user\User;
  19. use addons\GroupBuy\common\logic\order\OrderFormLogic;
  20. use common\models\user\UserAddress;
  21. use EasyWeChat\Factory;
  22. use Yii;
  23. use api\controllers\OnAuthController;
  24. /**
  25. * 默认控制器
  26. *
  27. * Class DefaultController
  28. * @package addons\GroupBuy\api\modules\v1\controllers
  29. */
  30. class DefaultController extends OnAuthController
  31. {
  32. public $modelClass = '';
  33. /**
  34. * 不用进行登录验证的方法
  35. *
  36. * 例如: ['index', 'update', 'create', 'view', 'delete']
  37. * 默认全部需要验证
  38. *
  39. * @var array
  40. */
  41. protected $authOptional = ['index', 'active-list'];
  42. /**
  43. * @desc:拼团活动首页
  44. * @Author: hua
  45. * @Date: 2021/12/20
  46. * @Time: 16:00
  47. * @Copyright: copyright (c) 2021 广东七件事集团
  48. * @return mixed|void
  49. */
  50. public function actionIndex()
  51. {
  52. $data = AddonsMarketingSetting::getOne([['mall_id' => $this->mall_id], ['addons_name' => GroupBuyEnum::ADDONS_NAME], ['status' => StatusEnum::ENABLED]]);
  53. if ($data == false) return $this->error(AddonsMarketingSetting::getStaticError());
  54. return $this->success('', $data);
  55. }
  56. /**
  57. * @desc:拼团商品列表
  58. * @Author: hua
  59. * @Date: 2021/12/14
  60. * @Time: 15:52
  61. * @Copyright: copyright (c) 2021 广东七件事集团
  62. * @return mixed|void
  63. */
  64. public function actionActiveList()
  65. {
  66. $get = \Yii::$app->request->get();
  67. $where[] = ['mall_id' => $this->mall_id];
  68. $where[] = ['status' => StatusEnum::ENABLED];
  69. if (isset($get['group_status'])) {
  70. $where[] = ['group_status' => $get['group_status']];
  71. } else {
  72. $where[] = ['group_status' => [GroupBuyEnum::NOT_STARTED, GroupBuyEnum::OPEN_GROUP]];
  73. }
  74. if (!empty($get['cate_id'])) $where[] = ['cate_id' => $get['cate_id']];
  75. if (isset($get['id'])) $where[] = ['id' => json_decode($get['id'], true)];
  76. $list = GroupBuyActive::getActiveList($where, true);
  77. $list['group_status_map'] = GroupBuyEnum::getGroupStatusMap();
  78. return $this->success('操作成功', $list);
  79. }
  80. /**
  81. * @desc:商品详情
  82. * @Author: hua
  83. * @Date: 2021/12/14
  84. * @Time: 16:01
  85. * @Copyright: copyright (c) 2021 广东七件事集团
  86. */
  87. public function actionActiveGoodsDetail()
  88. {
  89. $get = \Yii::$app->request->get();
  90. $res = \Yii::$app->services->validate->validate($get, [
  91. [['active_id'], 'required'],
  92. ]);
  93. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  94. $where[] = ['mall_id' => $this->mall_id];
  95. $where[] = ['id' => $get['active_id']];
  96. $with = [
  97. 'activeGoodsAttr' => function ($query) {
  98. $query->where(['status' => StatusEnum::ENABLED])
  99. ->select('id,group_buy_active_id,attr_id,group_buy_price,stock')->indexBy('attr_id');
  100. }
  101. ];
  102. //查询拼团活动
  103. $group_buy_active = GroupBuyActive::getOne($where, true, $with, false, 'id,goods_id,status,effective_time,group_size,limit_buy_num,total_num,start_at,end_at,group_status, restrict_rule_num');
  104. if ($group_buy_active == false) return $this->error(GroupBuyActive::getStaticError());
  105. if($group_buy_active['status']==StatusEnum::DISABLED) return $this->error('活动已禁用');
  106. if($group_buy_active['status']==StatusEnum::DELETE) return $this->error('活动已删除');
  107. $group_buy_active['surplus_stock'] = array_sum(array_column($group_buy_active['activeGoodsAttr'], 'stock'));//剩余库存
  108. $select = 'id,is_on_sale,goods_name,price,original_price,unit,attr_groups_format,attr_groups,area_limit,is_attr,is_show_stock,video_url,stock,video_cover_pic,cover_pic,bannar_pic,sales_num,virtual_sales,is_show_sales,detail,services';
  109. $params['mall_id'] = $this->mall_id;
  110. $params['where'] = [['id' => $group_buy_active['goods_id']], ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]];
  111. $params['is_array'] = true;
  112. $params['with'] = ['attr' => function ($query) {
  113. $query->orderBy('price asc')->select('id,goods_id,goods_no,name,original_price,pic_url,price,sign_id,sort,status,version,weight,stock,is_show');
  114. }];
  115. $params['order'] = false;
  116. $params['select'] = $select;
  117. //查询商品
  118. $goods = Goods::getGoodsDetail($params);
  119. unset($goods['is_member_price']);
  120. unset($goods['price_type']);
  121. $goods['attr_id'] = 0;
  122. //把拼团价,拼团库存放置商品数组
  123. foreach ($goods['attr'] as &$item) {
  124. $item['group_buy_price'] = $group_buy_active['activeGoodsAttr'][$item['id']]['group_buy_price'];
  125. $item['group_buy_stock'] = $group_buy_active['activeGoodsAttr'][$item['id']]['stock'];
  126. $goods['attr_id'] <= 0 && $item['is_show'] == StatusEnum::ENABLED && $goods['attr_id'] = $item['id'];
  127. }
  128. $params = [];
  129. $params['where'] = [
  130. ['mall_id' => $this->mall_id],
  131. ['group_buy_active_id' => $get['active_id']],
  132. ['is_commander' => GroupBuyEnum::IS_COMMANDER],
  133. ['order_status' => GroupBuyEnum::OPEN_GROUP],
  134. ];
  135. $params['select'] = 'id as open_group_id,commander_id,user_id,group_buy_active_id,created_at';
  136. $params['with'] = [
  137. 'user' => function ($query) {
  138. $query->select('id,nickname,avatar_url');
  139. },
  140. 'groupBuyActive' => function ($query) {
  141. $query->select('id,effective_time,group_size,is_virtual,virtual_group_size');
  142. }
  143. ];
  144. //查询正在开团的活动
  145. $commander_list = GroupBuyOrder::lists($params);
  146. //开团列表
  147. if (!empty($commander_list)) {
  148. $time = time();
  149. $open_group_id_arr = array_column($commander_list, 'open_group_id');
  150. $params = [];
  151. $params['where'] = [
  152. ['mall_id' => $this->mall_id],
  153. ['open_group_id' => $open_group_id_arr],
  154. ['order_status' => GroupBuyEnum::OPEN_GROUP],
  155. ];
  156. $params['order'] = 'id asc';
  157. $group_buy_order_list = GroupBuyOrder::lists($params);
  158. $user_id_arr = array_column($group_buy_order_list, 'user_id');
  159. $user_list = User::lists(['where' => [['id' => $user_id_arr]], 'select' => 'id,nickname,avatar_url', 'index' => 'id']);
  160. $counts_arr = $team_list = $team_user_id_arr = [];
  161. foreach ($group_buy_order_list as $val) {
  162. if (isset($counts_arr[$val['open_group_id']])) {
  163. $counts_arr[$val['open_group_id']]++;
  164. } else {
  165. $counts_arr[$val['open_group_id']] = 1;
  166. }
  167. $team_list[$val['open_group_id']][] = $user_list[$val['user_id']];
  168. $team_user_id_arr[$val['open_group_id']][] = $val['user_id'];
  169. }
  170. foreach ($commander_list as &$item) {
  171. $effective_time = $item['groupBuyActive']['effective_time'] * 60;
  172. $group_size = $item['groupBuyActive']['group_size'];
  173. $virtual_group_size = $item['groupBuyActive']['virtual_group_size'];
  174. $is_virtual = $item['groupBuyActive']['is_virtual'];
  175. $item['surplus_time'] = ($time - $item['created_at']) > $effective_time ? 0 : $effective_time - ($time - $item['created_at']);//剩余时间
  176. $surplus_size = $group_size - $counts_arr[$item['open_group_id']];
  177. // if ($is_virtual) $surplus_size -= $virtual_group_size;
  178. $item['surplus_size'] = $surplus_size;//剩余参团人数
  179. $item['team_list'] = $team_list[$item['open_group_id']] ?? [];
  180. $item['is_join'] = in_array($this->user_id, $team_user_id_arr[$item['open_group_id']]) ? 1 : 0;
  181. unset($item['groupBuyActive']);
  182. }
  183. }
  184. // 判断当前活动是否开启个人参团次数限制
  185. $group_buy_active['is_restrict_rule'] = false;
  186. if (!empty($group_buy_active['restrict_rule_num'])) {
  187. // 获取当前用户参与次拼团活动成功或者参团次数
  188. $joinNum = GroupBuyOrder::find()
  189. ->where(['status' => StatusEnum::ENABLED, 'user_id' => $this->user_id, 'is_commander' => 0])
  190. ->andWhere(['group_buy_active_id' => $get['active_id'], 'order_status' => [GroupBuyEnum::GROUP_SUCCESS, GroupBuyEnum::JOINING]])
  191. ->groupBy('open_group_id')
  192. ->count();
  193. if ($joinNum >= $group_buy_active['restrict_rule_num']) {
  194. $group_buy_active['is_restrict_rule'] = true;
  195. }
  196. }
  197. $group_buy_active['commander'] = $commander_list;//团长开团列表
  198. $counts = GroupBuyOrder::find()->where(['mall_id' => $this->mall_id, 'group_buy_active_id' => $get['active_id'], 'order_status' => GroupBuyEnum::JOINING])->count();
  199. $group_buy_active['count'] = $counts;//参团中的人数
  200. $group_buy_active['group_status_map'] = GroupBuyEnum::getGroupStatusMap();
  201. $goods['member_buy_limit_setting'] = [
  202. 'every_day_num' => 0,
  203. 'every_month_num' => 0,
  204. 'every_week_num' => 0,
  205. 'nums' => 0,
  206. 'total_num' => 0,
  207. 'member_level' => [],
  208. 'every_num' => $group_buy_active['limit_buy_num']??0,
  209. ];
  210. $group_buy_active['goods'] = $goods;
  211. unset($group_buy_active['activeGoodsAttr']);
  212. return $this->success('操作成功', $group_buy_active);
  213. }
  214. /**
  215. * @desc:拼团详情
  216. * @Author: hua
  217. * @Date: 2021/12/14
  218. * @Time: 16:02
  219. * @Copyright: copyright (c) 2021 广东七件事集团
  220. */
  221. public function actionOrderDetail()
  222. {
  223. $get = \Yii::$app->request->get();
  224. $res = \Yii::$app->services->validate->validate($get, [
  225. [['open_group_id'], 'required'],
  226. [['order_status', 'open_group_id'], 'integer'],
  227. ]);
  228. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  229. $params['where'] = [
  230. ['mall_id' => $this->mall_id],
  231. ['open_group_id' => $get['open_group_id']],
  232. ['is_pay'=>1]
  233. ];
  234. $params['order'] = 'id asc';
  235. $params['select'] = 'id,user_id,commander_id,is_commander,win_time,group_buy_active_id,created_at,goods_id,goods_attr_name,goods_attr_id,num,order_status';
  236. $list = GroupBuyOrder::lists($params);
  237. $user_id_arr = array_column($list, 'user_id');
  238. $user_map = User::lists(['where' => [['id' => $user_id_arr]], 'select' => 'id,nickname,avatar_url', 'index' => 'id']);
  239. $group_buy_active_id = $list[0]['group_buy_active_id'] ?? 0;
  240. $open_time = 0;
  241. $is_success = $commander_id = $num = $goods_attr_id = 0;
  242. $order_status = $is_join = 0;
  243. $goods_attr_name = '';
  244. $win_time = 0;
  245. $commander_name = '';
  246. foreach ($list as &$value) {
  247. $value['avatar_url'] = $user_map[$value['user_id']]['avatar_url'] ?? '';
  248. $value['nickname'] = $user_map[$value['user_id']]['nickname'] ?? '';
  249. $order_status = $value['order_status'];
  250. $commander_id = $value['commander_id'];
  251. if ($value['order_status'] == GroupBuyEnum::GROUP_SUCCESS) $is_success = 1;
  252. if ($value['is_commander']) $open_time = $value['created_at'];
  253. if ($value['user_id'] == $this->user_id) {
  254. $is_join = 1;
  255. $num = $value['num'];
  256. $goods_attr_id = $value['goods_attr_id'];
  257. $goods_attr_name = $value['goods_attr_name'];
  258. }
  259. $win_time = $value['win_time'] ? date('Y-m-d H:i:s', $value['win_time']) : 0;
  260. if ($value['is_commander']) {
  261. $commander_name = $value['nickname'];
  262. $value['nickname'] = '团长';
  263. }
  264. unset($value['created_at']);
  265. unset($value['group_buy_active_id']);
  266. unset($value['commander_id']);
  267. unset($value['id']);
  268. unset($value['user_id']);
  269. unset($value['goods_id']);
  270. unset($value['goods_attr_name']);
  271. unset($value['goods_attr_id']);
  272. unset($value['num']);
  273. unset($value['order_status']);
  274. }
  275. $group_buy_active = [];
  276. if ($group_buy_active_id) {
  277. $group_buy_active = GroupBuyActive::getOne([['id' => $group_buy_active_id], ['mall_id' => $this->mall_id]], true, [
  278. 'goods' => function ($query) {
  279. $query->where(['status' => StatusEnum::ENABLED])
  280. ->select('id,goods_name,cover_pic,attr_groups')->with(['attr' => function ($query) {
  281. $query->select('id,goods_id,goods_no,name,original_price,pic_url,price,sign_id,sort,status,version,weight,stock');
  282. }]);
  283. },
  284. 'activeGoodsAttr' => function ($query) {
  285. $query->where(['status' => StatusEnum::ENABLED])
  286. ->select('id,group_buy_active_id,attr_id,group_buy_price')->with(['goodsAttr']);
  287. }
  288. ], false, 'id,goods_id,is_virtual,virtual_group_size,effective_time,group_size,group_status,limit_buy_num, is_show_participant_nickname, virtual_group_type, is_show_virtual_avatar, restrict_rule_num');
  289. $group_buy_active['group_buy_price'] = $group_buy_active['activeGoodsAttr'][0]['group_buy_price']??0;
  290. $group_buy_active['price'] = $group_buy_active['activeGoodsAttr'][0]['goodsAttr']['price']??0;
  291. $active_goods_attr_arr = array_column($group_buy_active['activeGoodsAttr'], 'group_buy_price', 'attr_id');
  292. foreach ($group_buy_active['goods']['attr'] as &$attr) {
  293. $attr['group_buy_price'] = $active_goods_attr_arr[$attr['id']] ?? 0;
  294. }
  295. unset($group_buy_active['activeGoodsAttr']);
  296. //参团中
  297. if ($order_status == GroupBuyEnum::JOINING) {
  298. $time = time();
  299. $effective_time = $group_buy_active['effective_time'] * 60;
  300. $group_buy_active['surplus_time'] = ($time - $open_time) > $effective_time ? 0 : $effective_time - ($time - $open_time);//剩余时间
  301. $surplus_size = $group_buy_active['group_size'] - count($list);
  302. // if ($group_buy_active['is_virtual']) $surplus_size -= $group_buy_active['virtual_group_size'];
  303. $group_buy_active['surplus_size'] = $surplus_size;
  304. }
  305. if ($order_status == GroupBuyEnum::GROUP_SUCCESS) {
  306. //拼团成功
  307. $group_buy_active['win_time'] = $win_time;
  308. }
  309. // 判断当前活动是否开启个人参团次数限制
  310. $group_buy_active['is_restrict_rule'] = false;
  311. if (!empty($group_buy_active['restrict_rule_num'])) {
  312. // 获取当前用户参与次拼团活动成功或者参团次数
  313. $joinNum = GroupBuyOrder::find()
  314. ->where(['status' => StatusEnum::ENABLED, 'user_id' => $this->user_id, 'is_commander' => 0])
  315. ->andWhere(['group_buy_active_id' => $group_buy_active_id, 'order_status' => [GroupBuyEnum::GROUP_SUCCESS, GroupBuyEnum::JOINING]])
  316. ->groupBy('open_group_id')
  317. ->count();
  318. if ($joinNum >= $group_buy_active['restrict_rule_num']) {
  319. $group_buy_active['is_restrict_rule'] = true;
  320. }
  321. }
  322. $group_buy_active['goods_attr_id'] = $goods_attr_id;
  323. $group_buy_active['goods_attr_name'] = $goods_attr_name;
  324. $group_buy_active['num'] = $num;
  325. $group_buy_active['goods']['member_buy_limit_setting'] = [
  326. 'every_day_num' => 0,
  327. 'every_month_num' => 0,
  328. 'every_week_num' => 0,
  329. 'nums' => 0,
  330. 'total_num' => 0,
  331. 'member_level' => [],
  332. 'every_num' => $group_buy_active['limit_buy_num']??0,
  333. ];
  334. }
  335. if ($is_success) {
  336. $counts = count($list);
  337. $group_size = $group_buy_active['group_size'];
  338. if (!empty($group_buy_active['is_virtual']) && $group_buy_active['virtual_group_type'] == 3 && empty($group_buy_active['is_show_virtual_avatar'])) {
  339. $number = 0;
  340. } else {
  341. $number = $group_size - $counts;
  342. }
  343. for ($i = 0; $i < $number; $i++) {
  344. $k = ($commander_id + $i) % 500;
  345. $virtual_winer = [
  346. 'is_commander' => 0,
  347. 'avatar_url' => Yii::getAlias('@apiUrl') . '/resources/img/def-virtual-avatar/' . $k . '.png',
  348. 'nickname' => '商城用户',
  349. ];
  350. $list[] = $virtual_winer;
  351. }
  352. }
  353. if (empty($group_buy_active['is_show_participant_nickname'])) {
  354. foreach ($list as &$item) {
  355. unset($item['nickname']);
  356. }
  357. } else {
  358. foreach ($list as &$item) {
  359. $item['nickname'] = $this->truncateString($item['nickname']);
  360. }
  361. $group_buy_active['commander_name'] = $commander_name;
  362. }
  363. unset($group_buy_active['is_virtual']);
  364. unset($group_buy_active['virtual_group_size'], $group_buy_active['is_show_virtual_avatar'], $group_buy_active['virtual_group_type']);
  365. // \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK,
  366. // RabbitMqEnum::TASK_QUEUE, ['mall_id'=>$this->mall_id,'open_group_id'=>$get['open_group_id']], GroupBuyOrder::class, 'finishGroupBuyOrderSync');
  367. return $this->success('操作成功', ['list' => $list, 'group_buy_active' => $group_buy_active, 'is_join' => $is_join, 'order_status' => $order_status, 'order_status_map' => GroupBuyEnum::getOrderStatusMap()]);
  368. }
  369. private function truncateString($str, $length = 4) {
  370. if (mb_strlen($str) <= $length) {
  371. return $str;
  372. }
  373. return mb_substr($str, 0, $length) . '...';
  374. }
  375. /**
  376. * @desc:订单预览
  377. * @Author: hua
  378. * @Date: 2021/12/14
  379. * @Time: 18:36
  380. * @Copyright: copyright (c) 2021 广东七件事集团
  381. */
  382. public function actionPreview()
  383. {
  384. $params = \Yii::$app->request->post();
  385. $params['mall_id'] = $this->mall_id;
  386. $params['user_id'] = $this->user_id;
  387. $orderFormLogic = new OrderFormLogic();
  388. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  389. $form->attributes = Yii::$app->request->post();
  390. $form['action'] = AppEnum::ACTION_PREVIEW;
  391. !empty($form->shipping_type) && $form->shipping_type = ShippingTypeEnum::LOGISTICS;
  392. // 初始化订单数据
  393. $orderInitDataLogic = new OrderInitDataLogic();
  394. $form = $orderInitDataLogic->execute($form, PreviewTypeEnum::BUY_NOW);
  395. if ($form === false) return $this->error($orderInitDataLogic->getError());
  396. // 购买验证
  397. $orderLimitLogic = new OrderLimitLogic();
  398. $form = $orderLimitLogic->run($form);
  399. if ($form === false) return $this->error($orderLimitLogic->getError());
  400. // 获取收货地址
  401. $address_info = UserAddress::getUserAddress($this->user_id, $form->address_id);
  402. $form->address_id = $address_info['id']??0;
  403. // 运费
  404. $orderMarketingLogic = new OrderMarketingLogic();
  405. $form = $orderMarketingLogic->run($form);
  406. if ($form === false) return $this->error($orderMarketingLogic->getError());
  407. $group_order_goods = $form['group_order_goods'];
  408. $group_order_goods = array_values($group_order_goods);
  409. $marketing = $form['marketing'];
  410. $pay_type_list = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform);
  411. $shipping_type_list = ShippingTypeEnum::getMap();
  412. $info = compact('group_order_goods', 'marketing', 'address_info', 'pay_type_list', 'shipping_type_list');
  413. $info['total_pay_money'] = $form['total_pay_money'];
  414. $info['is_address'] = $form['is_address'] ?? 0;
  415. return $this->success('操作成功', $info);
  416. }
  417. /**
  418. * 创建订单
  419. * @Author bing
  420. * @DateTime 2021-09-22 09:31:22
  421. * @return void
  422. * @copyright: Copyright (c) 2020 广东七件事集团
  423. */
  424. public function actionCreate()
  425. {
  426. $params = \Yii::$app->request->post();
  427. $params['mall_id'] = $this->mall_id;
  428. $params['user_id'] = $this->user_id;
  429. $orderFormLogic = new OrderFormLogic();
  430. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  431. $form->attributes = Yii::$app->request->post();
  432. $form['action'] = AppEnum::ACTION_CREATE;
  433. !empty($form->shipping_type) && $form->shipping_type = ShippingTypeEnum::LOGISTICS;
  434. // 初始化订单数据
  435. $orderInitDataLogic = new OrderInitDataLogic();
  436. $form = $orderInitDataLogic->execute($form, PreviewTypeEnum::BUY_NOW);
  437. if ($form === false) return $this->error($orderInitDataLogic->getError());
  438. // 购买验证
  439. $orderLimitLogic = new OrderLimitLogic();
  440. $form = $orderLimitLogic->run($form);
  441. if ($form === false) return $this->error($orderLimitLogic->getError());
  442. // 获取收货地址
  443. $address_info = UserAddress::getUserAddress($this->user_id, $form->address_id);
  444. $form->address_id = $address_info['id'];
  445. // 运费
  446. $orderMarketingLogic = new OrderMarketingLogic();
  447. $form = $orderMarketingLogic->run($form);
  448. if ($form === false) return $this->error($orderMarketingLogic->getError());
  449. $res = GroupBuyOrder::createOrder($form);
  450. if ($res === false) return $this->error(GroupBuyOrder::getStaticError());
  451. return $this->success('操作成功', $res);
  452. }
  453. /**
  454. * @desc:拼团订单列表
  455. * @Author: hua
  456. * @Date: 2021/12/17
  457. * @Time: 18:49
  458. * @Copyright: copyright (c) 2021 广东七件事集团
  459. * @return mixed|void
  460. */
  461. public function actionOrderList()
  462. {
  463. $params = \Yii::$app->request->get();
  464. $params['mall_id'] = $this->mall_id;
  465. $params['user_id'] = $this->user_id;
  466. $where[] = ['mall_id' => $this->mall_id];
  467. $where[] = ['user_id' => $this->user_id];
  468. $where[] = ['status' => StatusEnum::ENABLED];
  469. if (isset($params['order_status'])) $where[] = ['order_status' => $params['order_status']];
  470. $params['where'] = $where;
  471. $params['order'] = "id desc";
  472. $params['select'] = 'id,pic_url,goods_name,order_no,goods_attr_name,open_group_id,order_id,price,group_buy_price,num,order_status,total_pay_price';
  473. $list = GroupBuyOrder::listPage($params);
  474. if (!empty($list['list'])) {
  475. $order_no_arr = array_column($list['list'], 'order_no');
  476. $payment_trade_order_list = PaymentTradeOrder::lists(['where' => [['order_no' => $order_no_arr], ['order_type' => GroupBuyEnum::ADDONS_NAME]], 'select' => 'order_no,trade_id']);
  477. $payment_trade_order_arr = array_column($payment_trade_order_list, 'trade_id', 'order_no');
  478. $payment_trade_list = PaymentTrade::lists(['where' => [['id' => $payment_trade_order_arr], ['mall_id' => $this->mall_id], ['user_id' => $this->user_id]], 'select' => 'id,out_trade_no']);
  479. $payment_trade_arr = array_column($payment_trade_list, 'out_trade_no', 'id');
  480. foreach ($list['list'] as &$item) {
  481. $item['out_trade_no'] = $payment_trade_arr[$payment_trade_order_arr[$item['order_no']]] ?? '';
  482. }
  483. }
  484. $list['order_status_map'] = GroupBuyEnum::getOrderStatusMap();
  485. return $this->success('操作成功', $list);
  486. }
  487. /**
  488. * @desc:调试用,发起微信退款或查询退款
  489. * @Author: hua
  490. * @Date: 2021/12/20
  491. * @Time: 15:02
  492. * @Copyright: copyright (c) 2021 广东七件事集团
  493. * @return mixed|void
  494. */
  495. public function actionRefundOrder()
  496. {
  497. try {
  498. $params = \Yii::$app->request->get();
  499. if ($params['type'] == 2) {
  500. $re_order_no = $params['re_order_no'];
  501. $config = Yii::$app->services->pay->getWechatConfig($this->mall_id);
  502. $wechatConfig = [
  503. 'app_id' => $config['app_id'],
  504. 'mch_id' => $config['wechat_mch_id'],
  505. 'key' => $config['wechat_pay_secret'], // API 密钥
  506. 'cert_path' => dirname(Yii::$app->basePath) . '/' . $config['wechat_cert_pem_file'],
  507. 'key_path' => dirname(Yii::$app->basePath) . '/' . $config['wechat_key_pem_file'],
  508. 'notify_url' => ''//回调地址
  509. ];
  510. $payment = Factory::payment($wechatConfig);
  511. $res = $payment->refund->queryByOutRefundNumber($re_order_no);
  512. } else {
  513. $order = Order::findOne(['id' => 5230]);
  514. $payment_order = PaymentTradeOrder::findOne(['order_no' => $order->order_no]);
  515. $payment_trade = PaymentTrade::findOne(['id' => $payment_order->trade_id]);
  516. $res = Yii::$app->services->pay->refund($payment_trade->pay_fee, $payment_trade->pay_fee, $payment_trade->out_trade_no, $order, '', '', '');
  517. }
  518. } catch (\Exception $e) {
  519. return $this->error($e->getMessage());
  520. }
  521. }
  522. }