StoreAssistanceController.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <?php
  2. namespace app\api\controller\activity;
  3. use app\models\store\StoreDescription;
  4. use app\models\store\StoreProductAttr;
  5. use app\models\store\StoreProductAttrValue;
  6. use app\models\store\StoreProductRelation;
  7. use app\models\system\SystemAttachment;
  8. use app\models\routine\RoutineCode;
  9. use app\models\store\StoreAssistance;
  10. use app\models\store\StoreAssistanceActive;
  11. use app\models\store\StoreProductReply;
  12. use app\models\store\StoreOrder;
  13. use app\models\store\{PopScreen as PopScreenModel};
  14. use app\Request;
  15. use crmeb\services\QrcodeService;
  16. use crmeb\services\SystemConfigService;
  17. use crmeb\services\UploadService;
  18. use crmeb\services\UtilService;
  19. use crmeb\services\CacheService;
  20. /**
  21. * 助力类
  22. * Class StoreAssistanceController
  23. * @package app\api\controller\activity
  24. */
  25. class StoreAssistanceController
  26. {
  27. /**
  28. * 助力列表
  29. * @param Request $request
  30. * @return mixed
  31. */
  32. public function lst(Request $request)
  33. {
  34. list($page, $limit) = UtilService::getMore([
  35. ['page', 1],
  36. ['limit', 10],
  37. ], $request, true);
  38. $assistanceList = StoreAssistance::getAll($page, $limit, $request->mer_id());
  39. if (!count($assistanceList)) return app('json')->successful([]);
  40. return app('json')->successful($assistanceList->hidden(['info', 'product_id', 'images', 'mer_id', 'attr', 'sort', 'stock', 'sales', 'add_time', 'is_del', 'is_show', 'browse', 'cost', 'is_show', 'start_time', 'stop_time', 'postage', 'is_postage', 'is_host', 'mer_use'])->toArray());
  41. }
  42. /**
  43. * 助力商品详情
  44. * @param Request $request
  45. * @param $id
  46. * @return mixed
  47. */
  48. public function detail(Request $request, $id)
  49. {
  50. if (!$id || !($assistanceOne = StoreAssistance::getAssistanceOne($id))) return app('json')->fail('助力不存在或已下架');
  51. $assistanceOne = $assistanceOne->hidden(['mer_id', 'attr', 'sort', 'add_time', 'is_host', 'is_show', 'is_del', 'mer_use', 'cost', 'assistance'])->toArray();
  52. $assistanceOne['images'] = json_decode($assistanceOne['images'], true);
  53. list($assistance, $assistanceAll) = StoreAssistanceActive::getAssistanceAll($id, true);//助力列表
  54. $siteUrl = sys_config('site_url');
  55. $assistanceOne['image'] = set_file_url($assistanceOne['image'], $siteUrl);
  56. $assistanceOne['image_base'] = set_file_url($assistanceOne['image'], $siteUrl);
  57. $assistanceOne['code_base'] = QrcodeService::getWechatQrcodePath($id . '_assistance_detail_wap.jpg', '/pages/activity/goods_assistance_status/index?id=' . $id);
  58. $assistanceOne['sale_stock'] = 0;
  59. if ($assistanceOne['stock'] > 0) $assistanceOne['sale_stock'] = 1;
  60. if (!strlen(trim($assistanceOne['unit_name']))) $assistanceOne['unit_name'] = '个';
  61. $uid = $request->uid();
  62. $assistanceOne['userCollect'] = StoreProductRelation::isProductRelation($assistanceOne['product_id'], $uid, 'collect');
  63. $assistanceOne['description'] = htmlspecialchars_decode(StoreDescription::getDescription($id, 4));
  64. $data['assistance'] = $assistance;
  65. $data['assistanceAll'] = $assistanceAll;
  66. $data['storeInfo'] = $assistanceOne;
  67. $data['assistance_ok_list'] = StoreAssistanceActive::getAssistanceOkList($uid);
  68. $data['assistance_ok_sum'] = StoreAssistanceActive::getAssistanceOkSumTotalNum($id);
  69. $data['reply'] = StoreProductReply::getRecProductReply($assistanceOne['product_id']);
  70. $data['replyCount'] = StoreProductReply::productValidWhere()->where('product_id', $assistanceOne['product_id'])->count();
  71. if ($data['replyCount']) {
  72. $goodReply = StoreProductReply::productValidWhere()->where('product_id', $assistanceOne['product_id'])->where('product_score', 5)->count();
  73. $data['replyChance'] = $goodReply;
  74. if ($goodReply) {
  75. $data['replyChance'] = bcdiv($goodReply, $data['replyCount'], 2);
  76. $data['replyChance'] = bcmul($data['replyChance'], 100, 3);
  77. }
  78. } else $data['replyChance'] = 100;
  79. list($productAttr, $productValue) = StoreProductAttr::getProductAttrDetail($id, $uid, 0, 4);
  80. foreach ($productValue as $k => $v) {
  81. $productValue[$k]['product_stock'] = StoreProductAttrValue::where('product_id', $assistanceOne['product_id'])->where('suk', $v['suk'])->where('type', 0)->value('stock');
  82. $productValue[$k]['subsidy'] = bcmul($v['price'], $assistanceOne['p_separate_account']/100, 2);
  83. }
  84. $data['productAttr'] = $productAttr;
  85. $data['productValue'] = $productValue;
  86. return app('json')->successful($data);
  87. }
  88. /**
  89. * 参与助力
  90. * @param Request $request
  91. * @param $id
  92. * @return mixed
  93. * @throws DataNotFoundException
  94. * @throws DbException
  95. * @throws ModelNotFoundException
  96. */
  97. public function assistanceActive(Request $request, $id)
  98. {
  99. $is_ok = 0;//判断助力是否完成
  100. $userBool = 0;//判断当前用户是否在团内 0未在 1在
  101. $assitanceBool = 0;//判断助力是否成功 0未在 1在
  102. $user = $request->user();
  103. if (!$id) return app('json')->fail('参数错误');
  104. $assistance = StoreAssistanceActive::getAssistanceUserOne($id, $request->mer_id());
  105. if (!$assistance) return app('json')->fail('参数错误');
  106. if (isset($assistance['is_refund']) && $assistance['is_refund']) {
  107. if ($assistance['is_refund'] != $assistance['id']) {
  108. $id = $assistance['is_refund'];
  109. return $this->assistance($request, $id);
  110. } else {
  111. return app('json')->fail('订单已退款');
  112. }
  113. }
  114. list($assistanceAll, $assistanceT, $count, $idAll, $uidAll) = StoreAssistanceActive::getAssistanceMemberAndAssistanceK($assistance);
  115. if ($assistanceT['status'] == 2) {
  116. $assitanceBool = 1;
  117. $is_ok = 1;
  118. } else if ($assistanceT['status'] == 3) {
  119. $assitanceBool = -1;
  120. $is_ok = 0;
  121. } else {
  122. if ($count < 1) {//组团完成
  123. $is_ok = 1;
  124. $assitanceBool = StoreAssistanceActive::AssistanceComplete($uidAll, $idAll, $user['uid'], $assistanceT);
  125. } else {
  126. $assitanceBool = StoreAssistanceActive::AssistanceFail($assistanceAll, $assistanceT, $assitanceBool);
  127. }
  128. }
  129. if (!empty($assistanceAll)) {
  130. foreach ($assistanceAll as $v) {
  131. if ($v['uid'] == $user['uid']) $userBool = 1;
  132. }
  133. }
  134. if ($assistanceT['uid'] == $user['uid']) $userBool = 1;
  135. $assistanceOne = StoreAssistance::getAssistanceOne($assistance['cid'], $request->mer_id());
  136. if (!$assistanceOne) return app('json')->fail('助力不存在或已下架');
  137. $data['qrcode'] = sys_data('routine_wechat_qrcode', 0, $request->mer_id()) ?: [];
  138. $data['userInfo']['uid'] = $user['uid'];
  139. $data['userInfo']['nickname'] = $user['nickname'];
  140. $data['userInfo']['avatar'] = $user['avatar'];
  141. $data['is_ok'] = $is_ok;
  142. $data['userBool'] = $userBool;
  143. $data['assitanceBool'] = $assitanceBool;
  144. $data['store_assistance'] = $assistanceOne->hidden(['mer_id', 'images', 'attr', 'info', 'sort', 'sales', 'stock', 'add_time', 'is_host', 'is_show', 'is_del', 'assistance', 'mer_use', 'is_postage', 'postage', 'start_time', 'stop_time', 'cost', 'browse', 'product_price'])->toArray();
  145. $data['assistanceT'] = $assistanceT;
  146. $data['assistanceAll'] = $assistanceAll;
  147. $data['count'] = $count <= 0 ? 0 : $count;
  148. $data['helped'] = $assistanceT['people'] - $count;
  149. $data['store_assistance_host'] = StoreAssistance::getAssistanceHost(0, $request->mer_id());
  150. $data['current_assistance_order'] = StoreAssistanceActive::getCurrentAssistance($id, $user['uid']);
  151. list($productAttr, $productValue) = StoreProductAttr::getProductAttrDetail($assistanceOne['id'], $user['uid'], 0, 4);
  152. foreach ($productValue as $k => $v) {
  153. $productValue[$k]['product_stock'] = StoreProductAttrValue::where('product_id', $assistanceOne['product_id'])->where('suk', $v['suk'])->where('type', 0)->value('stock');
  154. }
  155. $data['store_assistance']['productAttr'] = $productAttr;
  156. $data['store_assistance']['productValue'] = $productValue;
  157. return app('json')->successful($data);
  158. }
  159. /**
  160. * 取消助力
  161. * @param Request $request
  162. * @return mixed
  163. * @throws Exception
  164. */
  165. public function remove(Request $request)
  166. {
  167. list($id, $cid) = UtilService::postMore([
  168. ['id', 0],
  169. ['cid', 0],
  170. ], $request, true);
  171. if (!$id || !$cid) return app('json')->fail('缺少参数');
  172. $res = StoreAssistanceActive::removeAssistance($request->uid(), $cid, $id);
  173. if ($res) {
  174. return app('json')->successful('取消成功');
  175. }
  176. $error = StoreAssistanceActive::getErrorInfo();
  177. if (is_array($error)) return app('json')->status($error['status'], $error['msg']);
  178. return app('json')->fail($error);
  179. }
  180. /**
  181. * 助力海报
  182. * @param Request $request
  183. * @return mixed
  184. * @throws Exception
  185. */
  186. public function poster(Request $request)
  187. {
  188. $mer_id = $request->mer_id();
  189. list($assistanceId, $from) = UtilService::postMore([['id', 0], ['from', 'wechat']], $request, true);
  190. if (!$assistanceId) return app('json')->fail('参数错误');
  191. $user = $request->user();
  192. $assistanceInfo = StoreAssistanceActive::getAssistanceUserOne($assistanceId, $request->mer_id());
  193. $storeAssistanceInfo = StoreAssistance::getAssistanceOne($assistanceInfo['cid']);
  194. $data['title'] = $storeAssistanceInfo['title'];
  195. $data['image'] = $storeAssistanceInfo['image'];
  196. $data['price'] = $assistanceInfo['total_price'];
  197. $data['label'] = $assistanceInfo['people'] . '人团';
  198. if ($assistanceInfo['k_id']) $assistanceAll = StoreAssistanceActive::getAssistanceMember($assistanceInfo['k_id']);
  199. else $assistanceAll = StoreAssistanceActive::getAssistanceMember($assistanceInfo['id']);
  200. $count = count($assistanceAll);
  201. $data['msg'] = '原价¥' . $storeAssistanceInfo['product_price'] . ' 还差' . (int)bcsub((int)$assistanceInfo['people'], $count, 0) . '人助力成功';
  202. try {
  203. $siteUrl = sys_config('site_url', '', $mer_id);
  204. if ($from == 'routine') {
  205. //小程序
  206. $name = $assistanceId . '_' . $user['uid'] . '_' . $user['is_promoter'] . '_assistance_share_routine.jpg';
  207. $imageInfo = SystemAttachment::getInfo($name, 'name');
  208. if (!$imageInfo) {
  209. $valueData = 'id=' . $assistanceId;
  210. if ($user['is_promoter'] || sys_config('store_brokerage_statu', '', $mer_id) == 2) $valueData .= '&pid=' . $user['uid'];
  211. $res = RoutineCode::getPageCode('pages/activity/goods_assistance_status/index', $valueData, 280, $mer_id);
  212. if (!$res) return app('json')->fail('二维码生成失败');
  213. $uploadType = (int)sys_config('upload_type', 1, $mer_id);
  214. $upload = UploadService::init(null, $mer_id);
  215. $res = $upload->to('routine/activity/assistance/code')->validate()->stream($res, $name);
  216. if ($res === false) {
  217. return app('json')->fail($upload->getError());
  218. }
  219. $imageInfo = $upload->getUploadInfo();
  220. $imageInfo['image_type'] = $uploadType;
  221. if ($imageInfo['image_type'] == 1) $remoteImage = UtilService::remoteImage($siteUrl . $imageInfo['dir']);
  222. else $remoteImage = UtilService::remoteImage($imageInfo['dir']);
  223. if (!$remoteImage['status']) return app('json')->fail($remoteImage['msg']);
  224. SystemAttachment::attachmentAdd($imageInfo['name'], $imageInfo['size'], $imageInfo['type'], $imageInfo['dir'], $imageInfo['thumb_path'], 1, $imageInfo['image_type'], $imageInfo['time'], 2);
  225. $url = $imageInfo['dir'];
  226. } else $url = $imageInfo['att_dir'];
  227. $data['url'] = $url;
  228. if ($imageInfo['image_type'] == 1)
  229. $data['url'] = $siteUrl . $url;
  230. $posterImage = UtilService::setShareMarketingPoster($data, 'routine/activity/assistance/poster');
  231. if (!is_array($posterImage)) return app('json')->fail('海报生成失败');
  232. SystemAttachment::attachmentAdd($posterImage['name'], $posterImage['size'], $posterImage['type'], $posterImage['dir'], $posterImage['thumb_path'], 1, $posterImage['image_type'], $posterImage['time'], 2);
  233. if ($posterImage['image_type'] == 1) $posterImage['dir'] = $siteUrl . $posterImage['dir'];
  234. $routinePosterImage = set_http_type($posterImage['dir'], 0);//小程序推广海报
  235. return app('json')->successful(['url' => $routinePosterImage]);
  236. } else if ($from == 'wechat') {
  237. //公众号
  238. $name = $assistanceId . '_' . $user['uid'] . '_' . $user['is_promoter'] . '_assistance_share_wap.jpg';
  239. $imageInfo = SystemAttachment::getInfo($name, 'name');
  240. if (!$imageInfo) {
  241. $codeUrl = set_http_type($siteUrl . '/pages/activity/goods_assistance_status/index?id=' . $assistanceId . '&spread=' . $user['uid'], 1);//二维码链接
  242. $imageInfo = UtilService::getQRCodePath($codeUrl, $name);
  243. if (is_string($imageInfo)) {
  244. return app('json')->fail('二维码生成失败', ['error' => $imageInfo]);
  245. }
  246. SystemAttachment::attachmentAdd($imageInfo['name'], $imageInfo['size'], $imageInfo['type'], $imageInfo['dir'], $imageInfo['thumb_path'], 1, $imageInfo['image_type'], $imageInfo['time'], 2);
  247. $url = $imageInfo['dir'];
  248. } else $url = $imageInfo['att_dir'];
  249. $data['url'] = $url;
  250. if ($imageInfo['image_type'] == 1) $data['url'] = $siteUrl . $url;
  251. $posterImage = UtilService::setShareMarketingPoster($data, 'wap/activity/assistance/poster');
  252. if (!is_array($posterImage)) return app('json')->fail('海报生成失败');
  253. SystemAttachment::attachmentAdd($posterImage['name'], $posterImage['size'], $posterImage['type'], $posterImage['dir'], $posterImage['thumb_path'], 1, $posterImage['image_type'], $posterImage['time'], 2);
  254. if ($posterImage['image_type'] == 1) $posterImage['dir'] = $siteUrl . $posterImage['dir'];
  255. $wapPosterImage = set_http_type($posterImage['dir'], 1);//公众号推广海报
  256. return app('json')->successful(['url' => $wapPosterImage]);
  257. }
  258. return app('json')->fail('参数错误');
  259. } catch (Exception $e) {
  260. return app('json')->fail(['line' => $e->getLine(), 'message' => $e->getMessage()]);
  261. }
  262. }
  263. /**
  264. * 获取助力小程序二维码
  265. * @param Request $request
  266. * @param $id
  267. * @return mixed
  268. */
  269. public function code(Request $request, $id)
  270. {
  271. $url = QrcodeService::getRoutineQrcodePath($id, $request->uid(), 3, [], $request->mer_id());
  272. if ($url) {
  273. return app('json')->success(['code' => $url]);
  274. } else {
  275. return app('json')->success(['code' => '']);
  276. }
  277. }
  278. /**
  279. * 获取助力页面二维码
  280. */
  281. public function zhuli_code(Request $request, $id)
  282. {
  283. $url = QrcodeService::getRoutineQrcodePath($id, $request->uid(), 4, [], $request->mer_id());
  284. if ($url) {
  285. return app('json')->success(['code' => $url]);
  286. } else {
  287. return app('json')->success(['code' => '']);
  288. }
  289. }
  290. /**
  291. * 参与助力
  292. */
  293. public function attend(Request $request, $id)
  294. {
  295. // 从redis缓存attend_user获取某uid的值,如果存在,不允许助力,返回异常
  296. $attend_uid = CacheService::redisHandler()->get('attend_user'. $request->uid());
  297. if (self::checktime($attend_uid)) return app('json')->fail('您今天助力过一次了,请明天再来');
  298. $assistanceActive = StoreAssistanceActive::get($id);
  299. // 查询可助力人数
  300. $assistanceActiveAll = StoreAssistanceActive::getAssistanceMember($id);
  301. $count = count($assistanceActiveAll);
  302. $count = (int)bcsub($assistanceActive['people'], $count, 0);
  303. // 判断是否可助力:如果人已满,或已经超过了可助力的时间,返回false,即不可助力
  304. if($count <= 0) return app('json')->fail('该助力人数已满');
  305. if($assistanceActive['stop_time'] < time()) return app('json')->fail('该助力已超过了可参与的时间');
  306. foreach ($assistanceActiveAll as $key => $value) {
  307. if ($value['uid'] == $request->uid()) {
  308. return app('json')->fail('您已参与过该助力了');
  309. }
  310. }
  311. // 新增一条redis缓存记录
  312. CacheService::redisHandler()->set('attend_user'. $request->uid(), time(), 24*60*60);
  313. // 记录助力次数
  314. $assistance = StoreAssistance::get($assistanceActive['cid']);
  315. $assistance->assistance_times += 1;
  316. $assistance->save();
  317. // 先加入,再做是否已满的处理
  318. $res = StoreAssistanceActive::attendAssistance($request->uid(), $id);
  319. if ($res) {
  320. // 执行已满后的处理
  321. list($assistanceAll, $assistanceT, $count, $idAll, $uidAll) = StoreAssistanceActive::getAssistanceMemberAndAssistanceK($assistanceActive);
  322. if ($assistanceT['status'] == 1) {
  323. if (!$count){//组团完成
  324. $this->isFull($assistanceActive['order_id_key'], $uidAll, $idAll, $request->uid(), $assistanceT, $request->mer_id());
  325. return app('json')->successful('参与成功!');
  326. }
  327. }
  328. return app('json')->successful('参与成功');
  329. } else {
  330. return app('json')->fail('参与失败,请稍后再试');
  331. }
  332. }
  333. /**
  334. * 处理已满
  335. */
  336. private function isFull($order_id, $uidAll, $idAll, $uid, $assistanceT, $mer_id = '')
  337. {
  338. // 更改助力订单状态
  339. StoreAssistanceActive::changeAssistanceActiveStatus($uidAll, $idAll, $uid, $assistanceT);
  340. // 发送订阅消息
  341. // $this->sendMessage($order_id);
  342. $order = StoreOrder::get($order_id);
  343. if($order['pay_type'] == 'weixin'){
  344. // 处理奖励
  345. StoreAssistanceActive::treatmentAward($order_id, $mer_id);
  346. // 记录本次助力分账奖励
  347. StoreAssistanceActive::recordAssistanceMoney($order_id);
  348. }
  349. }
  350. public function checktime($time)
  351. {
  352. $start = strtotime(date("Y-m-d"),time());
  353. $end = $start + 60*60*24;
  354. if($start < $time && $time < $end){
  355. return true;
  356. }else{
  357. return false;
  358. }
  359. }
  360. //霸屏广告
  361. public function popScreen($url)
  362. {
  363. $where['domain_name']=$url;
  364. $info = PopScreenModel::getOne($where);
  365. $info["click"] = $info["click"] + 1;
  366. PopScreenModel::edit(['click'=>$info["click"]],$info['id']);//增加推广人次
  367. $data['info'] = $info;
  368. return app('json')->successful($data);
  369. }
  370. }