Hongbao.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. <?php
  2. // +---------------------------------------------------------------------+
  3. // | NiuCloud | [ WE CAN DO IT JUST NiuCloud ]  |
  4. // +---------------------------------------------------------------------+
  5. // | Copy right 2019-2029 www.niucloud.com  |
  6. // +---------------------------------------------------------------------+
  7. // | Author | NiuCloud <niucloud@outlook.com>  |
  8. // +---------------------------------------------------------------------+
  9. // | Repository | https://github.com/niucloud/framework.git  |
  10. // +---------------------------------------------------------------------+
  11. namespace addon\hongbao\model;
  12. use app\model\BaseModel;
  13. use app\model\member\MemberAccount as MemberAccountModel;
  14. use app\model\system\Config as ConfigModel;
  15. use app\model\system\Cron;
  16. use app\model\system\User;
  17. use extend\Poster as PosterExtend;
  18. use think\facade\Db;
  19. /**
  20. * 裂变红包活动表
  21. * Class hongbao
  22. * @package addon\hongbao\model
  23. */
  24. class Hongbao extends BaseModel
  25. {
  26. private $status = [
  27. 0 => '未开始',
  28. 1 => '进行中',
  29. 2 => '已结束',
  30. -1 => '已关闭'
  31. ];
  32. /**
  33. * 获取预售活动状态
  34. * @return array
  35. */
  36. public function getHongbaoStatus()
  37. {
  38. return $this->success($this->status);
  39. }
  40. /**
  41. * 获取分页列表
  42. * @param array $condition
  43. * @param number $page
  44. * @param string $page_size
  45. * @param string $order
  46. * @param string $field
  47. */
  48. public function getHongbaoPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = '*')
  49. {
  50. $list = model('promotion_hongbao')->pageList($condition, $field, $order, $page, $page_size);
  51. return $this->success($list);
  52. }
  53. /**
  54. * 获取优惠券活动信息
  55. * @param array $condition
  56. * @param string $field
  57. * @param string $alias
  58. * @param unknown $join
  59. * @param unknown $data
  60. * @return array
  61. */
  62. public function getHongbaoInfo($condition = [], $field = true, $alias = 'a', $join = null, $data = null)
  63. {
  64. $res = model('promotion_hongbao')->getInfo($condition, $field, $alias, $join, $data);
  65. return $this->success($res);
  66. }
  67. /**
  68. * 新增瓜分红包活动
  69. * @param $data
  70. * @return array
  71. */
  72. public function addHongbao($data)
  73. {
  74. if ($data['start_time'] > time()) {
  75. $data['status'] = 0;
  76. $data['status_name'] = $this->status[0];
  77. } else {
  78. $data['status'] = 1;
  79. $data['status_name'] = $this->status[1];
  80. }
  81. model('promotion_hongbao')->startTrans();
  82. try {
  83. $res = model("promotion_hongbao")->add($data);
  84. $cron = new Cron();
  85. //增加定时更改活动状态自动事件
  86. if (!empty($data['start_time'])) {
  87. $cron->addCron(1, 0, "裂变红包变更活动状态", "CronChangeHongbaoStatus", $data['start_time'], $res);
  88. }
  89. if (!empty($data['end_time'])) {
  90. $cron->addCron(1, 0, "裂变红包变更活动状态", "CronChangeHongbaoStatus", $data['end_time'], $res);
  91. }
  92. model('promotion_hongbao')->commit();
  93. return $this->success($res);
  94. } catch (\Exception $e) {
  95. model('promotion_hongbao')->rollback();
  96. return $this->error($e->getMessage());
  97. }
  98. }
  99. public function editHongbao($data)
  100. {
  101. $data['update_time'] = time();
  102. if ($data['start_time'] > time()) {
  103. $data['status'] = 0;
  104. $data['status_name'] = $this->status[0];
  105. } else {
  106. $data['status'] = 1;
  107. $data['status_name'] = $this->status[1];
  108. }
  109. $hongbao_id = $data['hongbao_id'];
  110. unset($data['hongbao_id']);
  111. #(修改发放量与库存)
  112. $old_info = model("promotion_hongbao")->getInfo([['hongbao_id', '=', $hongbao_id]], 'inventory,count');
  113. $data['count'] = $old_info['count'] + $data['inventory'] - $old_info['inventory'];
  114. $res = model("promotion_hongbao")->update($data, [['hongbao_id', '=', $hongbao_id]]);
  115. $cron = new Cron();
  116. $cron->deleteCron([['event', '=', 'CronChangeHongbaoStatus'], ['relate_id', '=', $hongbao_id]]);
  117. if ($data['status'] == 0) {
  118. $cron->addCron(1, 0, "裂变红包变更活动状态", "CronChangeHongbaoStatus", $data['start_time'], $hongbao_id);
  119. $cron->addCron(1, 0, "裂变红包变更活动状态", "CronChangeHongbaoStatus", $data['end_time'], $hongbao_id);
  120. } else if ($data['status'] == 1) {
  121. $cron->addCron(1, 0, "裂变红包变更活动状态", "CronChangeHongbaoStatus", $data['end_time'], $hongbao_id);
  122. }
  123. return $this->success($res);
  124. }
  125. /**
  126. * 更改活动状态
  127. * @param $hongbao_id
  128. * @return array
  129. */
  130. public function changeHongbaoStatus($hongbao_id)
  131. {
  132. $info = model('promotion_hongbao')->getInfo([['hongbao_id', '=', $hongbao_id]]);
  133. if (empty($info)) $this->success();
  134. if ($info['end_time'] <= time()) {
  135. $status = 2;
  136. $status_name = $this->status[2];
  137. model('promotion_hongbao_group')->update(['is_look' => 1],[['hongbao_id', '=', $hongbao_id],['status','=',2]]);
  138. } else if ($info['start_time'] <= time() && $info['end_time'] > time()) {
  139. $status = 1;
  140. $status_name = $this->status[1];
  141. } else {
  142. $status = 0;
  143. $status_name = $this->status[0];
  144. }
  145. $res = model('promotion_hongbao')->update(['status' => $status, 'status_name' => $status_name], [['hongbao_id', '=', $hongbao_id]]);
  146. return $this->success($res);
  147. }
  148. /**
  149. * 关闭活动
  150. * @param $data
  151. * @return array
  152. */
  153. public function closeHongbao($data)
  154. {
  155. $hongbao_id = $data['hongbao_id'];
  156. $site_id = $data['site_id'];
  157. $condition = [
  158. ['hongbao_id', '=', $hongbao_id],
  159. ['site_id', '=', $site_id],
  160. ];
  161. model('promotion_hongbao')->startTrans();
  162. try {
  163. $res = model('promotion_hongbao')->update(['status' => -1, 'status_name' => '已关闭'], $condition);
  164. model('promotion_hongbao_group')->update(['status' => 2], [['hongbao_id', '=', $hongbao_id], ['status', '=', 0]]);
  165. model('promotion_hongbao_group')->update(['is_look' => 1],[['hongbao_id', '=', $hongbao_id],['status','=',2]]);
  166. $cron = new Cron();
  167. $cron->deleteCron([['event', '=', 'CronChangeHongbaoStatus'], ['relate_id', '=', $hongbao_id]]);
  168. model('promotion_hongbao')->commit();
  169. return $this->success($res);
  170. } catch (\Exception $e) {
  171. model('promotion_hongbao')->rollback();
  172. return $this->error($e->getMessage());
  173. }
  174. }
  175. /**
  176. * 删除活动
  177. * @param $data
  178. * @return array
  179. */
  180. public function deleteHongbao($data)
  181. {
  182. $hongbao_id = $data['hongbao_id'];
  183. $site_id = $data['site_id'];
  184. model('promotion_hongbao')->startTrans();
  185. try {
  186. $condition = [
  187. ['hongbao_id', '=', $hongbao_id],
  188. ['site_id', '=', $site_id],
  189. ];
  190. $res = model("promotion_hongbao")->delete($condition);
  191. #删除活动所建分组
  192. model('promotion_hongbao_group')->delete([['hongbao_id', '=', $hongbao_id]]);
  193. $cron = new Cron();
  194. $cron->deleteCron([['event', '=', 'CronChangeHongbaoStatus'], ['relate_id', '=', $hongbao_id]]);
  195. model('promotion_hongbao')->commit();
  196. return $this->success($res);
  197. } catch (\Exception $e) {
  198. model('promotion_hongbao')->rollback();
  199. return $this->error($e->getMessage());
  200. }
  201. }
  202. /**
  203. * 发起瓜分
  204. */
  205. public function launch($hongbao_id, $member_id, $site_id)
  206. {
  207. $hongbao_info = model('promotion_hongbao')->getInfo(
  208. [
  209. ['hongbao_id', '=', $hongbao_id],
  210. ['site_id', '=', $site_id],
  211. ['status', '=', 1],
  212. ]
  213. );
  214. if (empty($hongbao_info)) return $this->error('', '未查到瓜分活动信息');
  215. if ($hongbao_info['inventory'] <= 0) return $this->error('', '红包已被抢完了,下次再来吧!');
  216. $launch_info = model('promotion_hongbao_group')->getInfo([['hongbao_id', '=', $hongbao_info['hongbao_id']], ['header_id', '=', $member_id]], 'group_id,status');
  217. if (!empty($launch_info) && $launch_info['status'] == 0) return $this->error('', '正在瓜分中');
  218. if (!empty($launch_info) && $launch_info['status'] == 1) return $this->error('', '已参与过此活动,无法重复发起瓜分');
  219. $member_info = model('member')->getInfo([['site_id', '=', $site_id], ['member_id', '=', $member_id]], 'nickname,headimg');
  220. if (empty($member_info)) return $this->error('', '未获取到会员信息');
  221. model('promotion_hongbao_group')->startTrans();
  222. $end_time = time() + ($hongbao_info['divide_time'] * 3600);
  223. try {
  224. $data = [
  225. 'hongbao_id' => $hongbao_info['hongbao_id'],
  226. 'start_time' => time(),
  227. 'header_id' => $member_id,
  228. 'status' => 0,
  229. 'num' => $hongbao_info['divide_num'],
  230. 'site_id' => $site_id,
  231. 'group_member_ids' => $member_id,
  232. ];
  233. if ($hongbao_info['end_time'] < $end_time) {
  234. $data['end_time'] = $hongbao_info['end_time'];
  235. } else {
  236. $data['end_time'] = $end_time;
  237. }
  238. $launch_id = model('promotion_hongbao_group')->add($data);
  239. model('promotion_hongbao_group')->update(['is_look' => 1],[['hongbao_id', '=', $hongbao_info['hongbao_id']], ['header_id', '=', $member_id],['status','=',2]]);
  240. model('promotion_hongbao')->setDec([['hongbao_id', '=', $hongbao_id], ['site_id', '=', $site_id]], 'inventory');
  241. $cron = new Cron();
  242. #是否模拟好友 1 是 2 否
  243. if ($hongbao_info['is_simulation'] == 1) {
  244. #加个 瓜分时间到期自动补齐
  245. $cron->addCron(1, 0, '未成团自动模拟好友瓜分', 'HongbaoSimulation', $data['end_time'], $launch_id);
  246. } else {
  247. $cron->addCron(1, 0, '瓜分发起自动关闭', 'HongbaoLaunchClose', $data['end_time'], $launch_id);
  248. }
  249. model('promotion_hongbao_group')->commit();
  250. return $this->success($launch_id);
  251. } catch (\Exception $e) {
  252. model('promotion_hongbao_group')->rollback();
  253. return $this->error($e->getMessage());
  254. }
  255. }
  256. /**
  257. * 帮瓜分
  258. * @param $launch_id
  259. * @param $member_id
  260. * @param $site_id
  261. */
  262. public function divide($launch_id, $member_id, $site_id)
  263. {
  264. $hongbao_group = model('promotion_hongbao_group')->getInfo(
  265. [
  266. ['group_id', '=', $launch_id],
  267. ['site_id', '=', $site_id],
  268. ]
  269. );
  270. if (empty($hongbao_group)) return $this->error('', '未查到瓜分红包参与活动组信息');
  271. if ($hongbao_group['status'] == 1) return $this->error('', '已经被瓜分完了');
  272. if ($hongbao_group['status'] == 2) return $this->error('', '瓜分过期请重新发起瓜分');
  273. $member_info = model('member')->getInfo([['site_id', '=', $site_id], ['member_id', '=', $member_id]], 'nickname,headimg');
  274. if (empty($member_info)) return $this->error('', '未获取到会员信息');
  275. model('promotion_hongbao_group')->startTrans();
  276. try {
  277. $hongbao_info = model('promotion_hongbao')->getInfo(
  278. [
  279. ['hongbao_id', '=', $hongbao_group['hongbao_id']],
  280. ['site_id', '=', $site_id],
  281. ['status', '=', 1],
  282. ]
  283. );
  284. if (empty($hongbao_info)) return $this->error('', '未查到瓜分活动信息');
  285. #判断此用户是否是新人
  286. $hongbao_member_group = model('promotion_hongbao_group')->getList([['hongbao_id', '=', $hongbao_info['hongbao_id']]], 'member_ids');
  287. $is_new = 0;
  288. if (!empty($hongbao_member_group)) {
  289. foreach ($hongbao_member_group as $k => $v) {
  290. if (in_array($member_id, explode(",", $v['member_ids']))) {
  291. $is_new = $is_new + 1;
  292. }
  293. }
  294. }
  295. #活动限制仅新人可瓜
  296. if ($hongbao_info['is_new'] == 1) {
  297. if ($is_new > 0) return $this->error('', '您已参加过此活动了,此活动只可参与一次');
  298. }
  299. $member_arr = [];#帮瓜分用户
  300. $group_member_arr = [];#瓜分组用户
  301. if (!empty($hongbao_group['group_member_ids'])) {
  302. $group_member_arr = explode(",", $hongbao_group['group_member_ids']);
  303. }
  304. if (!empty($hongbao_group['member_ids'])) {
  305. $member_arr = explode(",", $hongbao_group['member_ids']);
  306. }
  307. if (in_array($member_id, $member_arr)) {
  308. return $this->error('', '已经帮助瓜分过啦');
  309. }
  310. #插入瓜分的用户组
  311. array_push($member_arr, $member_id);
  312. array_push($group_member_arr, $member_id);
  313. #达到人数(瓜分成功)
  314. if (count($group_member_arr) == $hongbao_group['num']) {
  315. model('promotion_hongbao')->setInc([['hongbao_id', '=', $hongbao_group['hongbao_id']], ['site_id', '=', $site_id]], 'success_count');
  316. model('promotion_hongbao_group')->update(['status' => 1,'is_look' => 1, 'member_ids' => implode(',', $member_arr), 'group_member_ids' => implode(',', $group_member_arr)], [['group_id', '=', $launch_id], ['site_id', '=', $site_id]]);
  317. $user_model = new User();
  318. $user_admin_info = $user_model->getUserInfo([['app_module', '=', 'shop'], ['is_admin', '=', 1], ['site_id', '=', $site_id]])['data'];
  319. $balance_data = [
  320. 'site_id' => $site_id,
  321. 'uid' => $user_admin_info['uid'],
  322. 'username' => $user_admin_info['username'],
  323. 'balance_set' => $hongbao_info['balance_set']
  324. ];
  325. #固定的瓜分金额
  326. if ($hongbao_info['divide_type'] == 0) {
  327. $discount_coupon_money = round($hongbao_info['money'] / $hongbao_info['divide_num'], 2);
  328. $balance_data['money'] = $discount_coupon_money;
  329. foreach ($group_member_arr as $k => $v) {
  330. $balance_data['member_id'] = $v;
  331. #发放不可提现余额
  332. $this->addBalance($balance_data, $launch_id);
  333. }
  334. } else {
  335. #新人组
  336. $couple_group = [];
  337. #旧人组
  338. $old_group = [];
  339. #判断参与活动的用户是否是新人
  340. if (!empty($hongbao_member_group)) {
  341. foreach ($group_member_arr as $key => $value) {
  342. $fresh_num = 0;
  343. foreach ($hongbao_member_group as $k => $v) {
  344. if (in_array($value, explode(",", $v['member_ids']))) {
  345. $fresh_num = $fresh_num + 1;
  346. }
  347. }
  348. if ($fresh_num == 0) array_push($couple_group, $value);
  349. }
  350. $old_group = array_diff($group_member_arr, $couple_group);
  351. } else {
  352. $couple_group = $group_member_arr;
  353. }
  354. #随机获取比例(整数)
  355. $proportion = $this->rand_bouns($hongbao_info['divide_num'], $hongbao_info['money']);
  356. #比例从大到小排序
  357. arsort($proportion);
  358. $proportion = array_values($proportion);
  359. #有新人
  360. if (!empty($couple_group)) {
  361. #打乱新人组排序
  362. shuffle($couple_group);
  363. #新人组 重置下标
  364. $couple_group = array_values($couple_group);
  365. foreach ($couple_group as $k => $v) {
  366. $balance_data['money'] = round($proportion[$k], 2);
  367. $balance_data['member_id'] = $v;
  368. $this->addBalance($balance_data, $launch_id);
  369. unset($proportion[$k]);
  370. }
  371. if (!empty($old_group)) {
  372. shuffle($old_group);
  373. $old_group = array_values($old_group);
  374. $proportion = array_values($proportion);
  375. foreach ($old_group as $k => $v) {
  376. $balance_data['money'] = round($proportion[$k], 2);
  377. $balance_data['member_id'] = $v;
  378. $this->addBalance($balance_data, $launch_id);
  379. }
  380. }
  381. } else {
  382. #打乱旧人组排序
  383. shuffle($old_group);
  384. $old_group = array_values($old_group);
  385. foreach ($old_group as $k => $v) {
  386. $balance_data['money'] = round($proportion[$k], 2);
  387. $balance_data['member_id'] = $v;
  388. $this->addBalance($balance_data, $launch_id);
  389. }
  390. }
  391. #修改 人组顺序
  392. $new_group_member_ids = array_merge($couple_group,$old_group);
  393. model('promotion_hongbao_group')->update(['group_member_ids' => implode(',', $new_group_member_ids)], [['group_id', '=', $launch_id], ['site_id', '=', $site_id]]);
  394. }
  395. } else {
  396. #增加参与人
  397. model('promotion_hongbao_group')->update(['member_ids' => implode(',', $member_arr), 'group_member_ids' => implode(',', $group_member_arr)], [['group_id', '=', $launch_id], ['site_id', '=', $site_id]]);
  398. }
  399. model('promotion_hongbao_group')->commit();
  400. return $this->success();
  401. } catch (\Exception $e) {
  402. model('promotion_hongbao_group')->rollback();
  403. return $this->error($e->getMessage());
  404. }
  405. }
  406. #发放红包(余额)
  407. public function addBalance($data, $launch_id)
  408. {
  409. model('promotion_hongbao_group')->startTrans();
  410. try {
  411. $member_account_model = new MemberAccountModel();
  412. $user_model = new User();
  413. if($data['balance_set'] == 1){
  414. #奖励不可提现余额
  415. $member_account_model->addMemberAccount($data['site_id'], $data['member_id'], 'balance', $data['money'], 'hongbao', 0, '裂变红包发放,不可提现余额:' . $data['money'],$launch_id);
  416. }else{
  417. #奖励可提现余额
  418. $member_account_model->addMemberAccount($data['site_id'], $data['member_id'], 'balance_money', $data['money'], 'hongbao', 0, '裂变红包发放,可提现余额:' . $data['money'],$launch_id);
  419. }
  420. $user_model->addUserLog($data['uid'], $data['username'], $data['site_id'], "裂变红包:会员余额调整id:" . $data['member_id'] . "金额" . $data['money']);
  421. $hongbao_group = model('promotion_hongbao_group')->getInfo(
  422. [
  423. ['group_id', '=', $launch_id],
  424. ]
  425. );
  426. if (empty($hongbao_group)) return $this->error('', '未查到瓜分红包参与活动组信息');
  427. $balance_data = [];
  428. if (!empty($hongbao_group['balance_data'])) {
  429. $balance_data = explode(",", $hongbao_group['balance_data']);
  430. }
  431. array_push($balance_data, $data['money']);
  432. $res = model('promotion_hongbao_group')->update(['balance_data' => implode(',', $balance_data)], [['group_id', '=', $launch_id]]);
  433. $cron = new Cron();
  434. #删除瓜分组定时结束
  435. $cron->deleteCron([['event', '=', 'HongbaoLaunchClose'], ['relate_id', '=', $launch_id]]);
  436. model('promotion_hongbao_group')->commit();
  437. return $res;
  438. } catch (\Exception $e) {
  439. model('promotion_hongbao_group')->rollback();
  440. return $this->error($e->getMessage());
  441. }
  442. }
  443. /**
  444. * @param $person 人数
  445. * @param $percent 金额
  446. * @return array
  447. */
  448. public static function rand_bouns($person, $percent)
  449. { //百分比
  450. $now_person = $person;
  451. $bouns = array();
  452. for ($i = 0; $i <= $person - 1; $i++) {
  453. $bouns[$i] = self::get_bouns($now_person, $percent);
  454. $percent = $percent - $bouns[$i];
  455. $now_person = $now_person - 1;
  456. }
  457. return $bouns;
  458. }
  459. public static function get_bouns($person, $percent)
  460. {
  461. if ($person == 1) return $percent;
  462. $max = 30;
  463. if ($percent < $max) $max = $percent;
  464. $min = $percent - $max * ($person - 1) <= 0 ? 1 : $percent - $max * ($person - 1);
  465. $max = $max - ($person) <= 0 ? 1 : $max - ($person);
  466. return rand($min, $max);
  467. }
  468. /**
  469. * 海报
  470. */
  471. public function poster($arr, $app_type, $site_id, $member_id)
  472. {
  473. try {
  474. $qrcode_info = $this->getQrcode($arr, $app_type, $site_id);
  475. if ($qrcode_info['code'] < 0) return $qrcode_info;
  476. $member_info = $this->getMemberInfo($member_id);
  477. if (empty($member_info)) return $this->error('未获取到会员信息');
  478. $poster = new PosterExtend(740, 1250);
  479. $option = [
  480. [
  481. 'action' => 'imageCopy', // 背景图
  482. 'data' => [
  483. 'upload/uniapp/hongbao/poster.png',
  484. 0,
  485. 0,
  486. 740,
  487. 1250,
  488. 'square',
  489. 0,
  490. 1
  491. ]
  492. ],
  493. [
  494. 'action' => 'imageCopy', // 二维码
  495. 'data' => [
  496. $qrcode_info['data']['path'],
  497. 505,
  498. 980,
  499. 205,
  500. 205,
  501. 'square',
  502. 0,
  503. 1
  504. ]
  505. ],
  506. [
  507. 'action' => 'imageCircularCopy', // 写入用户头像
  508. 'data' => [
  509. !empty($member_info['headimg']) ? $member_info['headimg'] : 'upload/uniapp/default_headimg.png',
  510. 82,
  511. 852,
  512. 112,
  513. 112
  514. ]
  515. ],
  516. [
  517. 'action' => 'imageText', // 写入分享人昵称
  518. 'data' => [
  519. $member_info['nickname'],
  520. 22,
  521. [255, 129, 61],
  522. 40,
  523. 1030,
  524. 440,
  525. 1,
  526. true,
  527. 1
  528. ]
  529. ]
  530. ];
  531. $option_res = $poster->create($option);
  532. if (is_array($option_res)) return $option_res;
  533. $res = $option_res->jpeg('upload/poster/hongbao', 'hongbao_id_' . $arr['hid'] . 'group_id_' . $arr['gid'] . '_' . $app_type);
  534. return $res;
  535. } catch (\Exception $e) {
  536. return $this->error($e->getMessage());
  537. }
  538. }
  539. /**
  540. * 获取用户信息
  541. * @param unknown $member_id
  542. */
  543. private function getMemberInfo($member_id)
  544. {
  545. $info = model('member')->getInfo(['member_id' => $member_id], 'nickname,headimg');
  546. return $info;
  547. }
  548. /**
  549. * 生成优惠券二维码
  550. * @param $hongbao_id
  551. * @param string $app_type all为全部
  552. * @param string $type 类型 create创建 get获取
  553. * @return mixed|array
  554. */
  555. public function getQrcode($arr, $app_type, $site_id, $type = 'create')
  556. {
  557. $res = event('Qrcode', [
  558. 'site_id' => $site_id,
  559. 'app_type' => $app_type,
  560. 'type' => $type,
  561. 'data' => $arr,
  562. 'page' => '/otherpages/hongbao/index/index',
  563. 'qrcode_path' => 'upload/qrcode/hongbao',
  564. 'qrcode_name' => 'hongbao_id_' . $arr['hid'] . 'inviter_id_' . $arr['id'] . 'group_id_' . $arr['gid'] . '_' . $site_id,
  565. ], true);
  566. return $res;
  567. }
  568. /**
  569. * 到时模拟瓜分
  570. */
  571. public function cronHongbaoSimulation($launch_id)
  572. {
  573. $launch_info = model('promotion_hongbao_group')->getInfo([['group_id', '=', $launch_id]]);
  574. $hongbao_info = model('promotion_hongbao')->getInfo([['hongbao_id', '=', $launch_info['hongbao_id']]]);
  575. model('promotion_hongbao')->setInc([['hongbao_id', '=', $launch_info['hongbao_id']]], 'success_count');
  576. model('promotion_hongbao_group')->update(['status' => 1], [['group_id', '=', $launch_id]]);
  577. $group_member_arr = [];#瓜分组用户
  578. if (!empty($launch_info['group_member_ids'])) {
  579. $group_member_arr = explode(",", $launch_info['group_member_ids']);
  580. }
  581. $user_model = new User();
  582. $user_admin_info = $user_model->getUserInfo([['app_module', '=', 'shop'], ['is_admin', '=', 1], ['site_id', '=', $launch_info['site_id']]])['data'];
  583. $balance_data = [
  584. 'site_id' => $launch_info['site_id'],
  585. 'uid' => $user_admin_info['uid'],
  586. 'username' => $user_admin_info['username'],
  587. 'balance_set' => $hongbao_info['balance_set']
  588. ];
  589. #固定的瓜分金额
  590. if ($hongbao_info['divide_type'] == 0) {
  591. $discount_coupon_money = round($hongbao_info['money'] / $hongbao_info['divide_num'], 2);
  592. $balance_data['money'] = $discount_coupon_money;
  593. foreach ($group_member_arr as $k => $v) {
  594. $balance_data['member_id'] = $v;
  595. $this->addBalance($balance_data, $launch_id);
  596. }
  597. } else {
  598. #新人组
  599. $couple_group = [];
  600. #旧人组
  601. $old_group = [];
  602. #判断参与活动的用户是否是新人
  603. if (!empty($hongbao_member_group)) {
  604. foreach ($group_member_arr as $key => $value) {
  605. $fresh_num = 0;
  606. foreach ($hongbao_member_group as $k => $v) {
  607. if (in_array($value, explode(",", $v['member_ids']))) {
  608. $fresh_num = $fresh_num + 1;
  609. }
  610. }
  611. if ($fresh_num == 0) array_push($couple_group, $value);
  612. }
  613. $old_group = array_diff($group_member_arr, $couple_group);
  614. } else {
  615. $couple_group = $group_member_arr;
  616. }
  617. #随机获取比例(整数)
  618. $proportion = $this->rand_bouns($hongbao_info['divide_num'], $hongbao_info['money']);
  619. #比例从大到小排序
  620. arsort($proportion);
  621. $proportion = array_values($proportion);
  622. #有新人
  623. if (!empty($couple_group)) {
  624. #打乱新人组排序
  625. shuffle($couple_group);
  626. #新人组 重置下标
  627. $couple_group = array_values($couple_group);
  628. foreach ($couple_group as $k => $v) {
  629. $balance_data['money'] = round($proportion[$k], 2);
  630. $balance_data['member_id'] = $v;
  631. $this->addBalance($balance_data, $launch_id);
  632. unset($proportion[$k]);
  633. }
  634. if (!empty($old_group)) {
  635. shuffle($old_group);
  636. $old_group = array_values($old_group);
  637. $proportion = array_values($proportion);
  638. foreach ($old_group as $k => $v) {
  639. $balance_data['money'] = round($proportion[$k], 2);
  640. $balance_data['member_id'] = $v;
  641. $this->addBalance($balance_data, $launch_id);
  642. }
  643. }
  644. } else {
  645. #打乱旧人组排序
  646. shuffle($old_group);
  647. $old_group = array_values($old_group);
  648. foreach ($old_group as $k => $v) {
  649. $balance_data['money'] = round($proportion[$k], 2);
  650. $balance_data['member_id'] = $v;
  651. $this->addBalance($balance_data, $launch_id);
  652. }
  653. }
  654. #修改 人组顺序
  655. $new_group_member_ids = array_merge($couple_group,$old_group);
  656. model('promotion_hongbao_group')->update(['group_member_ids' => implode(',', $new_group_member_ids)], [['group_id', '=', $launch_id], ['site_id', '=', $launch_info['site_id']]]);
  657. }
  658. }
  659. /**
  660. * @param $hongbao_id
  661. * @param $name
  662. * @param $site_id
  663. * @param string $type
  664. * @return array
  665. * shop端推广
  666. */
  667. public function spread($hongbao_id, $name, $site_id, $type = "create")
  668. {
  669. $data = [
  670. 'site_id' => $site_id,
  671. 'app_type' => "all", // all为全部
  672. 'type' => $type, // 类型 create创建 get获取
  673. 'data' => [
  674. "hongbao_id" => $hongbao_id
  675. ],
  676. 'page' => '/otherpages/hongbao/index/index',
  677. 'qrcode_path' => 'upload/qrcode/hongbao',
  678. 'qrcode_name' => 'hongbao_id_' . $hongbao_id,
  679. ];
  680. event('Qrcode', $data, true);
  681. $app_type_list = config('app_type');
  682. $path = [];
  683. foreach ($app_type_list as $k => $v) {
  684. switch ($k) {
  685. case 'h5':
  686. $wap_domain = getH5Domain();
  687. $path[$k]['status'] = 1;
  688. $path[$k]['url'] = $wap_domain . $data['page'] . '?hongbao_id=' . $hongbao_id;
  689. $path[$k]['img'] = "upload/qrcode/hongbao/hongbao_id_" . $hongbao_id . "_" . $k . ".png";
  690. break;
  691. case 'weapp' :
  692. $config = new ConfigModel();
  693. $res = $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'WEAPP_CONFIG']]);
  694. if (!empty($res['data'])) {
  695. if (empty($res['data']['value']['qrcode'])) {
  696. $path[$k]['status'] = 2;
  697. $path[$k]['message'] = '未配置微信小程序';
  698. } else {
  699. $path[$k]['status'] = 1;
  700. $path[$k]['img'] = $res['data']['value']['qrcode'];
  701. }
  702. } else {
  703. $path[$k]['status'] = 2;
  704. $path[$k]['message'] = '未配置微信小程序';
  705. }
  706. break;
  707. case 'wechat' :
  708. $config = new ConfigModel();
  709. $res = $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'WECHAT_CONFIG']]);
  710. if (!empty($res['data'])) {
  711. if (empty($res['data']['value']['qrcode'])) {
  712. $path[$k]['status'] = 2;
  713. $path[$k]['message'] = '未配置微信公众号';
  714. } else {
  715. $path[$k]['status'] = 1;
  716. $path[$k]['img'] = $res['data']['value']['qrcode'];
  717. }
  718. } else {
  719. $path[$k]['status'] = 2;
  720. $path[$k]['message'] = '未配置微信公众号';
  721. }
  722. break;
  723. }
  724. }
  725. $return = [
  726. 'path' => $path,
  727. 'name' => $name,
  728. ];
  729. return $this->success($return);
  730. }
  731. }