VerificationController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <?php
  2. namespace addons\Store\api\modules\v1\controllers;
  3. use common\enums\ClerkEnum;
  4. use Yii;
  5. use api\controllers\OnAuthController;
  6. use common\enums\StatusEnum;
  7. use common\models\user\User;
  8. use addons\Store\common\models\Store;
  9. use addons\Store\addons\Verification\common\models\StoreVerificationCoupons;
  10. use addons\Store\addons\Verification\common\models\StoreVerificationCouponsUser;
  11. use addons\Store\addons\Verification\common\models\StoreVerificationSetting;
  12. use addons\Store\addons\Verification\common\models\StoreVerificationCouponsClerkLog;
  13. use common\models\common\Region;
  14. use common\helpers\LockHelper;
  15. /**
  16. * 默认控制器
  17. *
  18. * Class DefaultController
  19. * @package addons\Starfish\api\controllers
  20. */
  21. class VerificationController extends OnAuthController
  22. {
  23. public $modelClass = '';
  24. /**
  25. * 不用进行登录验证的方法
  26. *
  27. * 例如: ['index', 'update', 'create', 'view', 'delete']
  28. * 默认全部需要验证
  29. *
  30. * @var array
  31. */
  32. protected $authOptional = [];
  33. public function actionList(){
  34. $params = \Yii::$app->request->get();
  35. if (empty($params['type'])) $params['type'] = 0; //0门店赠送 1他人转赠
  36. if (empty($params['status'])) $params['status'] = 1; //1未核销 2已核销 3已过期
  37. $where = [];
  38. $where[] = ['mall_id' => $this->mall_id];
  39. $where[] = ['=', 'status', StatusEnum::ENABLED];
  40. $where[] = ['=','is_transfer',$params['type']];
  41. $where[] = ['=','user_id',$this->user_id];
  42. $state = $params['status'];
  43. //用户拥有的券
  44. $user_coupon_ids = StoreVerificationCouponsUser::find()->where(['user_id'=>$this->user_id])->select('coupon_id')->column();
  45. $user_coupon_ids = array_unique($user_coupon_ids);
  46. $query = StoreVerificationCoupons::find()->where(['mall_id'=>$this->mall_id,'status'=>StatusEnum::ENABLED,'id'=>$user_coupon_ids]);
  47. if($state == 1){
  48. $where[] = 'num > used_num';
  49. }elseif ($state == 2) {
  50. $where[] = 'num = used_num';
  51. }elseif($state == 3){
  52. $query->andWhere(['<','end_at',time()]);
  53. }
  54. $coupon_ids = $query->select('id')->column();
  55. $where[] = ['in', 'coupon_id', $coupon_ids];
  56. $select = 'id,coupon_id,num,used_num,store_id,from_user_id,created_at';
  57. $order = 'id desc';
  58. $params['where'] = $where;
  59. $params['select'] = $select;
  60. $params['order'] = $order;
  61. //var_dump($params);
  62. $list = StoreVerificationCouponsUser::listPage($params, false, true);
  63. if (!empty($list['list'])) {
  64. $coupon_ids = array_column($list['list'],'coupon_id');
  65. $coupon_list = StoreVerificationCoupons::find()
  66. ->where(['id'=>$coupon_ids])
  67. ->indexBy('id')
  68. ->asArray()
  69. ->all();
  70. $store_ids = array_column($list['list'],'store_id');
  71. $store_list = Store::find()
  72. ->where(['id'=>$store_ids])
  73. ->indexBy('id')
  74. ->asArray()
  75. ->all();
  76. $region_ids = [];
  77. $province_ids = array_unique(array_column($store_list, 'province_id'));
  78. $city_ids = array_unique(array_column($store_list, 'city_id'));
  79. $district_ids = array_unique(array_column($store_list, 'district_id'));
  80. $region_ids = array_merge($province_ids, $city_ids, $district_ids);
  81. $regions = Region::find()
  82. ->select('id,name')
  83. ->where(['id' => $region_ids])
  84. ->asArray()
  85. ->indexBy('id')
  86. ->all();
  87. if($params['type'] == 1){
  88. $user_ids = array_column($list['list'],'from_user_id');
  89. $user_list = User::find()
  90. ->where(['id'=>$user_ids])
  91. ->indexBy('id')
  92. ->asArray()
  93. ->all();
  94. }
  95. foreach ($list['list'] as &$item) {
  96. $item['name'] = '';
  97. $item['start_at'] = '';
  98. $item['end_at'] = '';
  99. $item['coupon_status'] = 0;
  100. if(!empty($coupon_list[$item['coupon_id']])){
  101. if($coupon_list[$item['coupon_id']]['end_at'] < time()){
  102. $item['coupon_status'] = 1;
  103. }
  104. $item['name'] = $coupon_list[$item['coupon_id']]['name'];
  105. $item['start_at'] = date('Y-m-d H:i:s',$coupon_list[$item['coupon_id']]['start_at']);
  106. $item['end_at'] = date('Y-m-d H:i:s',$coupon_list[$item['coupon_id']]['end_at']);
  107. }
  108. $item['store_name'] = '';
  109. $item['logo_img'] = '';
  110. $item['longitude'] = 0;
  111. $item['latitude'] = 0;
  112. $item['store_address'] = '';
  113. if(!empty($store_list[$item['store_id']])){
  114. $item['store_name'] = $store_list[$item['store_id']]['store_name'];
  115. $item['logo_img'] = $store_list[$item['store_id']]['logo_img'];
  116. $item['longitude'] = $store_list[$item['store_id']]['longitude'];
  117. $item['latitude'] = $store_list[$item['store_id']]['latitude'];
  118. $province = $regions[$store_list[$item['store_id']]['province_id']] ?? [];
  119. $city = $regions[$store_list[$item['store_id']]['city_id']] ?? [];
  120. $district = $regions[$store_list[$item['store_id']]['district_id']] ?? [];
  121. $item['store_address'] = ($province['name'] ?? '') . ($city['name'] ?? '') . ($district['name'] ?? '') . $store_list[$item['store_id']]['address'];
  122. }
  123. $item['from_user_info'] = [];
  124. if($params['type'] == 1){
  125. if(!empty($user_list[$item['from_user_id']])){
  126. $item['from_user_info']['user_id'] = $user_list[$item['from_user_id']]['id'];
  127. $item['from_user_info']['nickname'] = $user_list[$item['from_user_id']]['nickname'];
  128. $item['from_user_info']['avatar_url'] = $user_list[$item['from_user_id']]['avatar_url'];
  129. $item['from_user_info']['created_at'] = date('Y-m-d H:i:s',$item['created_at']);
  130. }
  131. }
  132. }
  133. }
  134. return $this->success('请求成功', $list);
  135. }
  136. /**
  137. * 赠送
  138. */
  139. public function actionTransfer(){
  140. if (Yii::$app->request->isPost) {
  141. $form = Yii::$app->request->post();
  142. $rules = [
  143. [['num','user_id','coupon_user_id'], 'required'],
  144. [['num','user_id','coupon_user_id'], 'integer'],
  145. ];
  146. $res = Yii::$app->services->validate->validate($form, $rules);
  147. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  148. $key = sprintf('TransferVerification:%s', $this->user_id);
  149. $t = \Yii::$app->db->beginTransaction();
  150. try {
  151. if (LockHelper::fLock($key)) throw new \Exception('请勿频繁请求');
  152. $coupon_user = StoreVerificationCouponsUser::findOne($form['coupon_user_id']);
  153. if(empty($coupon_user)) throw new \Exception('数据不存在');
  154. $coupon = StoreVerificationCoupons::findOne(['id'=>$coupon_user['coupon_id'],'status'=>StatusEnum::ENABLED]);
  155. if(empty($coupon)) throw new \Exception('核销券不存在或已删除');
  156. // 获取配置
  157. $config = StoreVerificationSetting::search($coupon_user['store_id']);
  158. if (empty($config['is_enable_transfer'])) throw new \Exception('核销券赠送功能尚未开启');
  159. $num = $coupon_user['num'] - $coupon_user['used_num'];
  160. if($form['num'] > $num) throw new \Exception('可赠送数量不足');
  161. // 检测转送用户是否是本人
  162. if ($form['user_id'] == $this->user_id) throw new \Exception('赠送的用户不能是本人哦');
  163. // 检查用户是否存在
  164. $receive_user = User::getUser([['id' => $form['user_id']]], 'id');
  165. if (empty($receive_user)) throw new \Exception('赠送的用户不存在');
  166. $coupon_user->used_num += $form['num'];
  167. if(!$coupon_user->save()) throw new \Exception($coupon_user->getErrorMessage());
  168. $params = [
  169. 'mall_id' => $this->mall_id,
  170. 'store_id' => $coupon_user['store_id'],
  171. 'user_id' => $form['user_id'],
  172. 'coupon_id' => $coupon_user['coupon_id'],
  173. 'num' => $form['num'],
  174. 'is_transfer' => 1,
  175. 'from_user_id' => $this->user_id,
  176. 'from_coupon_user_id' => $coupon_user['id'],
  177. ];
  178. $params['clerk_code'] = StoreVerificationCouponsUser::createCode($this->mall_id);
  179. $res = StoreVerificationCouponsUser::setData($params);
  180. if ($res === false) return $this->error(StoreVerificationCouponsUser::getStaticError());
  181. $t->commit();
  182. LockHelper::unFLock($key);
  183. $this->success('转送成功');
  184. }catch(\Exception $e){
  185. $t->rollBack();
  186. LockHelper::unFLock($key);
  187. return $this->error('赠送失败:' . $e->getMessage());
  188. }
  189. }
  190. }
  191. /**
  192. * 券详情
  193. */
  194. public function actionDetail(){
  195. try {
  196. $params = \Yii::$app->request->get();
  197. $res = Yii::$app->services->validate->validate($params, [
  198. [['id',], 'required'],
  199. [['id'], 'integer'],
  200. ]);
  201. if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
  202. $coupon_user = StoreVerificationCouponsUser::findOne($params['id']);
  203. if(empty($coupon_user)) throw new \Exception('核销券不存在');
  204. $coupon = StoreVerificationCoupons::findOne(['id'=>$coupon_user['coupon_id'],'status'=>StatusEnum::ENABLED]);
  205. if(empty($coupon)) throw new \Exception('核销券不存在或已删除');
  206. $store = Store::findOne($coupon_user['store_id']);
  207. $store_address = '';
  208. if($store){
  209. $region_ids = [$store['province_id'],$store['city_id'],$store['district_id']];
  210. $regions = Region::find()
  211. ->select('id,name')
  212. ->where(['id' => $region_ids])
  213. ->asArray()
  214. ->indexBy('id')
  215. ->all();
  216. $province = $regions[$coupon_user['store_id']]['province_id'] ?? [];
  217. $city = $regions[$coupon_user['store_id']] ?? [];
  218. $district = $regions[$coupon_user['store_id']]['district_id'] ?? [];
  219. $store_address = ($province['name'] ?? '') . ($city['name'] ?? '') . ($district['name'] ?? '') . $store['address'];
  220. }
  221. $returnData = [];
  222. $returnData['detail'] = [
  223. 'name' => $coupon['name'],
  224. 'num' => $coupon_user['num'],
  225. 'used_num' => $coupon_user['used_num'],
  226. 'logo_img' => $store['logo_img'] ?? '',
  227. 'store_name' => $store['store_name'] ?? '',
  228. 'store_address' => $store_address,
  229. 'longitude' => $store['longitude'] ?? 0,
  230. 'latitude' => $store['latitude'] ?? 0,
  231. 'start_at' => date('Y-m-d H:i:s',$coupon['start_at']),
  232. 'end_at' => date('Y-m-d H:i:s',$coupon['end_at']),
  233. ];
  234. $returnData['give_user_info'] = [];
  235. $give_coupon_user_list = StoreVerificationCouponsUser::find()
  236. ->where(['from_coupon_user_id'=>$coupon_user->id])
  237. ->asArray()
  238. ->all();
  239. if(!empty($give_coupon_user_list)){
  240. $user_ids = array_column($give_coupon_user_list,'user_id');
  241. $user_list = User::find()
  242. ->where(['id'=>$user_ids])
  243. ->indexBy('id')
  244. ->asArray()
  245. ->all();
  246. $give_user_info = [];
  247. foreach($give_coupon_user_list as $give_coupon_user){
  248. $give_user_info['num'] = $give_coupon_user['num'];
  249. $give_user_info['used_num'] = $give_coupon_user['used_num'];
  250. $give_user_info['user_id'] = $give_coupon_user['user_id'];
  251. $give_user_info['nickname'] = $user_list[$give_coupon_user['user_id']]['nickname'] ?? '';
  252. $give_user_info['avatar_url'] = $user_list[$give_coupon_user['user_id']]['avatar_url'] ?? '';
  253. $give_user_info['created_at'] = date('Y-m-d H:i:s',$give_coupon_user['created_at']);
  254. $give_user_info['log'] = [];
  255. $logs = StoreVerificationCouponsClerkLog::find()
  256. ->where(['from_coupon_user_id'=>$give_coupon_user['id']])
  257. ->select('created_at')
  258. ->column();
  259. if(!empty($logs)){
  260. foreach($logs as $log){
  261. $give_user_info['log'][] = date('Y-m-d H:i:s',$log) . '进行核销一次';
  262. }
  263. }
  264. $returnData['give_user_info'][] = $give_user_info;
  265. }
  266. }
  267. return $this->success('请求成功', $returnData);
  268. } catch (\Exception $e) {
  269. return $this->error($e->getMessage());
  270. }
  271. }
  272. /**
  273. * 券海报
  274. */
  275. public function actionPosterInfo(){
  276. try {
  277. $params = \Yii::$app->request->get();
  278. $res = Yii::$app->services->validate->validate($params, [
  279. [['id',], 'required'],
  280. [['id'], 'integer'],
  281. ]);
  282. if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
  283. $coupon_user = StoreVerificationCouponsUser::findOne($params['id']);
  284. if(empty($coupon_user)) throw new \Exception('核销券不存在');
  285. $coupon = StoreVerificationCoupons::findOne(['id'=>$coupon_user['coupon_id'],'status'=>StatusEnum::ENABLED]);
  286. if(empty($coupon)) throw new \Exception('核销券不存在或已删除');
  287. if($coupon['start_at'] > time()) throw new \Exception('核销券未到使用时间');
  288. if($coupon['end_at'] < time()) throw new \Exception('核销券已过期');
  289. $returnData = [
  290. 'style_pic_url' => $coupon['style_pic_url'],
  291. // 'clerk_code' => 'HXQ_'.$coupon_user['id'],
  292. 'clerk_code' => $coupon_user['clerk_code'],
  293. ];
  294. return $this->success('请求成功', $returnData);
  295. } catch (\Exception $e) {
  296. return $this->error($e->getMessage());
  297. }
  298. }
  299. /**
  300. * 券核销详情
  301. */
  302. public function actionClerkDetail(){
  303. try {
  304. $params = \Yii::$app->request->get();
  305. $res = Yii::$app->services->validate->validate($params, [
  306. [['id',], 'required'],
  307. [['id'], 'integer'],
  308. ]);
  309. if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
  310. $coupon_user = StoreVerificationCouponsUser::findOne($params['id']);
  311. if(empty($coupon_user)) throw new \Exception('核销券不存在');
  312. $coupon = StoreVerificationCoupons::findOne(['id'=>$coupon_user['coupon_id'],'status'=>StatusEnum::ENABLED]);
  313. if(empty($coupon)) throw new \Exception('核销券不存在或已删除');
  314. $store = Store::findOne($coupon_user['store_id']);
  315. $returnData = [];
  316. $returnData['detail'] = [
  317. 'name' => $coupon['name'],
  318. 'num' => $coupon_user['num'],
  319. 'used_num' => $coupon_user['used_num'],
  320. 'logo_img' => $store['logo_img'],
  321. 'store_name' => $store['store_name'],
  322. 'start_at' => date('Y-m-d H:i:s',$coupon['start_at']),
  323. 'end_at' => date('Y-m-d H:i:s',$coupon['end_at']),
  324. ];
  325. return $this->success('请求成功', $returnData);
  326. } catch (\Exception $e) {
  327. return $this->error($e->getMessage());
  328. }
  329. }
  330. }