CouponController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. <?php
  2. namespace addons\Store\api\modules\v1\controllers;
  3. use addons\Coupon\common\enums\AddonsCouponEnum;
  4. use addons\Coupon\common\models\AddonsCoupon;
  5. use addons\Store\common\enums\StoreEnum;
  6. use addons\Store\common\models\Store;
  7. use addons\Store\common\models\StoreCoupon;
  8. use addons\Store\common\models\StoreCouponShareLog;
  9. use addons\Store\common\models\StoreCouponUserRelate;
  10. use addons\Store\common\models\StoreGoods;
  11. use addons\Store\common\models\StoreGoodsCateRelate;
  12. use common\enums\AddonsEnum;
  13. use common\enums\StatusEnum;
  14. use common\helpers\LocationHelper;
  15. use common\models\goods\Goods;
  16. use common\models\goods\GoodsCateRelate;
  17. use common\models\mall\MallAddons;
  18. use common\models\user\User;
  19. use Yii;
  20. use api\controllers\OnAuthController;
  21. /**
  22. * 默认控制器
  23. *
  24. * Class DefaultController
  25. * @package addons\Store\api\modules\v1\controllers
  26. */
  27. class CouponController extends OnAuthController
  28. {
  29. public $modelClass = '';
  30. /**
  31. * 不用进行登录验证的方法
  32. *
  33. * 例如: ['index', 'update', 'create', 'view', 'delete']
  34. * 默认全部需要验证
  35. *
  36. * @var array
  37. */
  38. protected $authOptional = [];
  39. private function getCommonWhere($coupon_status)
  40. {
  41. $common_where = [
  42. ['mall_id' => $this->mall_id],
  43. ['user_id' => $this->user_id],
  44. ['status' => StatusEnum::ENABLED]
  45. ];
  46. switch ($coupon_status) {
  47. case 1:
  48. $common_where[] = ['is_use' => 1];
  49. break;
  50. case 2:
  51. $common_where[] = ['coupon_status' => 2];
  52. $common_where[] = ['is_use' => 0];
  53. break;
  54. case 3:
  55. $common_where[] = ['coupon_status' => [3, 4]];
  56. $common_where[] = ['is_giving' => 0];
  57. $common_where[] = ['is_use' => 0];
  58. break;
  59. case 4:
  60. $common_where[] = ['is_giving' => 1];
  61. $common_where[] = ['giving_status' => 2];
  62. break;
  63. }
  64. return $common_where;
  65. }
  66. public function actionMyCouponList()
  67. {
  68. $params = \Yii::$app->request->get();
  69. $res = Yii::$app->services->validate->validate($params, [
  70. [['coupon_status'], 'required'],
  71. [['page', 'limit'], 'safe'],
  72. ]);
  73. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  74. $coupon_status = $params['coupon_status'] ?? 1;
  75. $common_where = $this->getCommonWhere($coupon_status);
  76. $params['where'] = $common_where;
  77. $params['order'] = 'id desc';
  78. $select = 'id,coupon_id,start_time,end_time,is_use,is_giving,giving_status,store_id,from_type,updated_at';
  79. $params['select'] = $select;
  80. $page_list = StoreCouponUserRelate::listPage($params);
  81. if (!empty($page_list['list'])) {
  82. $platform_coupon_ids = $store_coupon_ids = [];
  83. foreach ($page_list['list'] as &$item) {
  84. switch ($item['from_type']) {
  85. case 1:
  86. $platform_coupon_ids[] = $item['coupon_id'];
  87. break;
  88. case 2:
  89. $store_coupon_ids[] = $item['coupon_id'];
  90. break;
  91. }
  92. }
  93. $platform_coupon_list = [];
  94. if (MallAddons::isInstall($this->mall_id, 'Coupon')) {
  95. $platform_coupon_list = AddonsCoupon::lists(['where' => [['id' => $platform_coupon_ids]], 'index' => 'id', 'select' => 'id,name,min_price,sub_price,appoint_type,is_giving,is_giving_use,type,discount', 'with' => ['storeGoodsRelate']]);
  96. }
  97. $store_coupon_list = StoreCoupon::lists(['where' => [['id' => $store_coupon_ids]], 'with' => ['goodsRelate', 'cateRelate'], 'index' => 'id', 'select' => 'id,name,min_price,sub_price,appoint_type,is_giving,type,discount,exchange_voucher_type']);
  98. array_walk($platform_coupon_list, function (&$item) {
  99. $item['goodsRelate'] = $item['storeGoodsRelate'];
  100. unset($item['storeGoodsRelate']);
  101. });
  102. $store_ids = array_column($page_list['list'], 'store_id');
  103. $store_list = Store::lists(['where' => [['id' => $store_ids]], 'index' => 'id']);
  104. if ($params['coupon_status'] == 4) {
  105. $user_coupon_ids = array_column($page_list['list'], 'id');
  106. $share_logs = StoreCouponShareLog::lists(['where' => [['user_coupon_id' => $user_coupon_ids]], 'index' => 'user_coupon_id', 'select' => 'user_coupon_id,receive_user_id']);
  107. $receive_user_ids = array_column($share_logs, 'receive_user_id');
  108. $receive_user_list = User::lists(['where' => [['id' => $receive_user_ids]], 'index' => 'id', 'select' => 'id,mobile,nickname']);
  109. }
  110. foreach ($page_list['list'] as &$item) {
  111. $item['store_name'] = '';
  112. $item['logo_img'] = '';
  113. $item['give_name'] = '';
  114. $item['give_mobile'] = '';
  115. $item['use_time'] = $item['updated_at'];
  116. if (isset($store_list[$item['store_id']])) {
  117. $item['store_name'] = $store_list[$item['store_id']]['store_name'];
  118. $item['logo_img'] = $store_list[$item['store_id']]['logo_img'];
  119. }
  120. if ($params['coupon_status'] == 4) {
  121. if ($item['is_giving']) {
  122. $item['give_time'] = $item['updated_at'];
  123. }
  124. if (isset($share_logs[$item['id']])) {
  125. $receive_user_id = $share_logs[$item['id']]['receive_user_id'];
  126. if (isset($receive_user_list) && isset($receive_user_list[$receive_user_id])) {
  127. $item['give_name'] = $receive_user_list[$receive_user_id]['nickname'];
  128. $item['give_mobile'] = $receive_user_list[$receive_user_id]['mobile'];
  129. }
  130. }
  131. }
  132. $item['is_show_use_btn'] = true;
  133. $item['coupon'] = [];
  134. switch ($item['from_type']) {
  135. case 1:
  136. if (isset($platform_coupon_list[$item['coupon_id']])) {
  137. $item['coupon'] = $platform_coupon_list[$item['coupon_id']];
  138. }
  139. $item['coupon']['is_goods_single'] = 0;
  140. if (count($item['coupon']['goodsRelate']) == 1) $item['coupon']['is_goods_single'] = 1;
  141. foreach ($item['coupon']['goodsRelate'] as $goodsRelate) {
  142. $item['coupon']['goods_ids'] .= $goodsRelate['goods_id'] . ',';
  143. }
  144. $item['coupon']['goods_ids'] = $item['coupon']['goods_ids'] ? trim($item['coupon']['goods_ids'], ',') : '';
  145. $item['coupon']['cate_ids'] = '';
  146. unset($item['coupon']['goodsRelate']);
  147. $platformCouponUserRelate[] = &$item;
  148. break;
  149. case 2:
  150. if (isset($store_coupon_list[$item['coupon_id']])) {
  151. $item['coupon'] = $store_coupon_list[$item['coupon_id']];
  152. }
  153. $item['coupon']['is_goods_single'] = 0;
  154. if (count($item['coupon']['goodsRelate']) == 1) $item['coupon']['is_goods_single'] = 1;
  155. foreach ($item['coupon']['goodsRelate'] as $goodsRelate) {
  156. $item['coupon']['goods_ids'] .= $goodsRelate['goods_id'] . ',';
  157. }
  158. foreach ($item['coupon']['cateRelate'] as $cateRelate) {
  159. $item['coupon']['cate_ids'] .= $cateRelate['cate_id'] . ',';
  160. }
  161. $item['coupon']['goods_ids'] = trim($item['coupon']['goods_ids'], ',');
  162. $item['coupon']['cate_ids'] = trim($item['coupon']['cate_ids'], ',');
  163. unset($item['coupon']['goodsRelate']);
  164. unset($item['coupon']['cateRelate']);
  165. break;
  166. }
  167. }
  168. if (!empty($platformCouponUserRelate)) {
  169. $giftedIds = AddonsCoupon::getGiftedList($this->mall_id, $platformCouponUserRelate, 2);
  170. array_walk($platformCouponUserRelate, function (&$item) use ($giftedIds) {
  171. if (!isset($item['coupon'])) {
  172. return;
  173. }
  174. // 返回是否显示使用按钮
  175. if (!empty($item['coupon']['is_giving']) && !empty($item['coupon']['is_giving_use']) && !in_array($item['id'], $giftedIds)) {
  176. $item['is_show_use_btn'] = false;
  177. }
  178. });
  179. }
  180. }
  181. $page_list['give_type'] = 1;
  182. if(MallAddons::isInstall($this->mall_id,'Coupon')){
  183. $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_COUPON, 'basic');
  184. $page_list['give_type'] = empty($config['give_type'])?'1':$config['give_type'];
  185. }
  186. return $this->success('操作成功', $page_list);
  187. }
  188. public function actionDetail()
  189. {
  190. $params = \Yii::$app->request->post();
  191. $res = Yii::$app->services->validate->validate($params, [
  192. [['coupon_id', 'from_type'], 'required'],
  193. [['user_coupon_id'], 'safe'],
  194. ]);
  195. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  196. $select = 'id,name,min_price,sub_price,appoint_type,rule,expire_type,expire_day,effect_days,begin_at ,end_at ';
  197. if (!empty($params['user_coupon_id'])) $coupon_user_relate = StoreCouponUserRelate::findOne(['id' => $params['user_coupon_id']]);
  198. if ($params['from_type'] == 1) {
  199. $coupon = AddonsCoupon::getOne([['id' => $params['coupon_id']], 'mall_id' => $this->mall_id], true, false, $select);
  200. } else {
  201. $coupon = StoreCoupon::getOne([['id' => $params['coupon_id']], 'mall_id' => $this->mall_id], true, false, $select);
  202. }
  203. $coupon['start_time'] = $coupon['begin_at'];
  204. $coupon['end_time'] = $coupon['end_at'];
  205. if (!empty($coupon_user_relate)) {
  206. $coupon['start_time'] = $coupon_user_relate['start_time'];
  207. $coupon['end_time'] = $coupon_user_relate['end_time'];
  208. }
  209. return $this->success('操作成功', $coupon);
  210. }
  211. public function actionDetailList()
  212. {
  213. $params = \Yii::$app->request->get();
  214. $res = Yii::$app->services->validate->validate($params, [
  215. [['from_type', 'coupon_id'], 'required'],
  216. [['longitude', 'latitude', 'page', 'limit'], 'safe'],
  217. ]);
  218. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  219. $select = 'id,name,min_price,sub_price,appoint_type,rule,store_id,type';
  220. $coupon = [];
  221. $goods_page_list = [];
  222. $store_page_list = [];
  223. switch ($params['from_type']) {
  224. case 1:
  225. $coupon = AddonsCoupon::getOne([['id' => $params['coupon_id']], 'mall_id' => $this->mall_id], true, ['goodsRelate', 'cateRelate'], false, $select);
  226. switch ($coupon['appoint_type']) {
  227. case 1:
  228. $cate_ids = [];
  229. foreach ($coupon['cateRelate'] as $cateRelate) {
  230. $cate_ids[] = $cateRelate['cate_id'];
  231. }
  232. $goods_cate_relate_list = GoodsCateRelate::lists(['where' => [['cate_id' => $cate_ids]]]);
  233. $goods_ids = array_column($goods_cate_relate_list, 'goods_id');
  234. $params['where'][] = ['id' => $goods_ids,];
  235. $goods_page_list = Goods::listPage($params);
  236. break;
  237. case 2:
  238. $goods_ids = [];
  239. foreach ($coupon['goodsRelate'] as $goodsRelate) {
  240. $goods_ids[] = $goodsRelate['goods_id'];
  241. }
  242. $params['where'][] = ['id' => $goods_ids,];
  243. $params['select'] = 'id,goods_name,cover_pic,price,original_price';
  244. $goods_page_list = Goods::listPage($params);
  245. break;
  246. case 4:
  247. $store_ids = explode(',', $coupon['store_id']);
  248. $params['where'][] = ['id' => $store_ids];
  249. $params['select'] = 'id,store_name,logo_img,longitude,latitude,sales_volume,praise';
  250. $store_page_list = Store::listPage($params);
  251. if (!empty($store_page_list['list'])) {
  252. foreach ($store_page_list['list'] as &$value) {
  253. $distance = (new LocationHelper())->getDistanceByGeo($params['latitude'], $params['longitude'], $value['latitude'], $value['longitude']);
  254. $value['distance'] = $distance;
  255. }
  256. }
  257. break;
  258. }
  259. break;
  260. case 2:
  261. $select .= ',exchange_voucher_type';
  262. $coupon = StoreCoupon::getOne([['id' => $params['coupon_id']], 'mall_id' => $this->mall_id], true, ['goodsRelate', 'cateRelate'], false, $select);
  263. switch ($coupon['appoint_type']) {
  264. case 1:
  265. $cate_ids = [];
  266. foreach ($coupon['cateRelate'] as $cateRelate) {
  267. $cate_ids[] = $cateRelate['cate_id'];
  268. }
  269. $goods_cate_relate_list = StoreGoodsCateRelate::lists(['where' => [['cate_id' => $cate_ids]]]);
  270. $goods_ids = array_column($goods_cate_relate_list, 'goods_id');
  271. $params['where'][] = ['id' => $goods_ids,];
  272. $params['select'] = 'id,store_id,goods_name,cover_pic,price,original_price';
  273. $goods_page_list = StoreGoods::listPage($params);
  274. break;
  275. case 2:
  276. $goods_ids = [];
  277. foreach ($coupon['goodsRelate'] as $goodsRelate) {
  278. $goods_ids[] = $goodsRelate['goods_id'];
  279. }
  280. $params['where'][] = ['id' => $goods_ids,];
  281. $params['select'] = 'id,store_id,goods_name,cover_pic,price,original_price';
  282. $goods_page_list = StoreGoods::listPage($params);
  283. if ($coupon['type'] == StoreEnum::EXCHANGE) {
  284. foreach ($goods_page_list['list'] as &$value) {
  285. if ($coupon['exchange_voucher_type'] == StoreEnum::ALL_DEDUCTION) {
  286. $value['price'] = 0;
  287. } else {
  288. $value['price'] = bcsub($value['price'], $coupon['sub_price'], 2);
  289. if ($value['price'] < 0) {
  290. $value['price'] = 0;
  291. }
  292. }
  293. }
  294. }
  295. break;
  296. case 3:
  297. $params['where'][] = ['id' => $coupon['store_id']];
  298. $params['select'] = 'id,store_name,logo_img,longitude,latitude,sales_volume,praise';
  299. $store_page_list = Store::listPage($params);
  300. if (!empty($store_page_list['list'])) {
  301. foreach ($store_page_list['list'] as &$value) {
  302. $distance = (new LocationHelper())->getDistanceByGeo($params['latitude'], $params['longitude'], $value['latitude'], $value['longitude']);
  303. $value['distance'] = bcdiv($distance, 1000, 1);
  304. }
  305. }
  306. break;
  307. }
  308. break;
  309. }
  310. unset($coupon['goodsRelate']);
  311. unset($coupon['cateRelate']);
  312. return $this->success('操作成功', ['coupon' => $coupon, 'goods_page_list' => $goods_page_list, 'store_page_list' => $store_page_list]);
  313. }
  314. public function actionCenter()
  315. {
  316. $params = \Yii::$app->request->get();
  317. $res = Yii::$app->services->validate->validate($params, [
  318. [['from_type',], 'required'],
  319. [['page', 'limit'], 'safe'],
  320. ]);
  321. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  322. $where = [
  323. ['mall_id' => $this->mall_id],
  324. ['status' => StatusEnum::ENABLED],
  325. ['is_public_receive' => StatusEnum::ENABLED],
  326. ['coupon_status' => AddonsCouponEnum::STATUS_RECEIVING],
  327. ];
  328. $params['order'] = 'id desc';
  329. switch ($params['from_type']) {
  330. case 1:
  331. $where[] = ['<>', 'store_id', ''];
  332. $class = AddonsCoupon::class;
  333. break;
  334. case 2:
  335. $class = StoreCoupon::class;
  336. break;
  337. }
  338. $params['where'] = $where;
  339. $list = $class::listPage($params, false, true);
  340. return $this->success('操作成功', $list);
  341. }
  342. }