MemberMarketmanage.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace app\api\controller;
  3. use think\facade\Db;
  4. use think\facade\Lang;
  5. /**
  6. * ============================================================================
  7. *
  8. * ============================================================================
  9. *
  10. * ----------------------------------------------------------------------------
  11. *
  12. * ============================================================================
  13. * 用户营销活动控制器
  14. */
  15. class MemberMarketmanage extends MobileMember
  16. {
  17. public function initialize()
  18. {
  19. parent::initialize();
  20. Lang::load(base_path() . 'home/lang/' . config('lang.default_lang') . '/membermarketmanage.lang.php');
  21. }
  22. /**
  23. * @api {POST} api/MemberMarketmanage/get_log 活动记录
  24. * @apiVersion 1.0.0
  25. * @apiGroup MemberMarketmanage
  26. *
  27. * @apiHeader {String} X-DS-KEY 用户授权token
  28. *
  29. * @apiSuccess {String} code 返回码,10000为成功
  30. * @apiSuccess {String} message 返回消息
  31. * @apiSuccess {Object} result 返回数据
  32. */
  33. public function get_log()
  34. {
  35. $marketmanage_model = model('marketmanage');
  36. $marketmanagelog_list = $marketmanage_model->getMarketmanageLogList(array('member_id' => $this->member_info['member_id']), $this->pagesize);
  37. $result = array_merge(array('log_list' => $marketmanagelog_list), mobile_page($marketmanage_model->page_info));
  38. ds_json_encode(10000, '', $result);
  39. }
  40. /**
  41. * @api {POST} api/MemberMarketmanage/add_log 参加活动
  42. * @apiVersion 1.0.0
  43. * @apiGroup MemberMarketmanage
  44. *
  45. * @apiHeader {String} X-DS-KEY 用户授权token
  46. *
  47. * @apiParam {Int} marketmanage_id 活动ID
  48. *
  49. * @apiSuccess {String} code 返回码,10000为成功
  50. * @apiSuccess {String} message 返回消息
  51. * @apiSuccess {Object} result 返回数据
  52. */
  53. public function add_log()
  54. {
  55. $can_draw = true;
  56. $count_left = 0;
  57. $marketmanage_id = intval(input('param.marketmanage_id'));
  58. if ($marketmanage_id < 0) {
  59. ds_json_encode(10001, lang('param_error'));
  60. }
  61. $marketmanage_model = model('marketmanage');
  62. $predeposit_model = model('predeposit');
  63. try {
  64. Db::startTrans();
  65. $condition = array();
  66. $condition[] = array('marketmanage_id', '=', $marketmanage_id);
  67. $marketmanage = $marketmanage_model->getOneMarketmanage($condition, true);
  68. if (!$marketmanage) {
  69. throw new \think\Exception(lang('market_activity_not_exist'), 10006);
  70. }
  71. if ($marketmanage['marketmanage_begintime'] > TIMESTAMP) {
  72. throw new \think\Exception(lang('market_activity_not_begin'), 10006);
  73. }
  74. if ($marketmanage['marketmanage_endtime'] < TIMESTAMP) {
  75. throw new \think\Exception(lang('market_activity_not_end'), 10006);
  76. }
  77. //是否有足够的积分
  78. if ($this->member_info['member_points'] < $marketmanage['marketmanage_point']) {
  79. throw new \think\Exception(lang('point_not_enough'), 10006);
  80. }
  81. if ($marketmanage['marketmanage_jointype'] != 2) { //有参与次数限制
  82. //判断当前用户是否参与过
  83. $condition = array();
  84. $condition[] = array('marketmanage_id', '=', $marketmanage_id);
  85. $condition[] = array('member_id', '=', $this->member_info['member_id']);
  86. $marketmanage_joincount = $marketmanage['marketmanage_joincount'];
  87. switch ($marketmanage['marketmanage_jointype']) {
  88. case 0:
  89. break;
  90. case 1:
  91. $condition[] = array('marketmanagelog_time', 'between', array(strtotime(date('Y-m-d 0:0:0')), TIMESTAMP));
  92. break;
  93. default:
  94. throw new \think\Exception(lang('marketmanage_jointype_set_error'), 10006);
  95. }
  96. $marketmanagelog = $marketmanage_model->getMarketmanageLogList($condition);
  97. if (count($marketmanagelog) >= $marketmanage_joincount) {
  98. throw new \think\Exception(sprintf(lang('marketmanage_joincount_error'), count($marketmanagelog)), 10006);
  99. }
  100. $count_left = $marketmanage_joincount - count($marketmanagelog) - 1;
  101. if ($count_left == 0) {
  102. $can_draw = false;
  103. }
  104. }
  105. $marketmanage_type_list = $marketmanage_model->marketmanage_type_list();
  106. if (!isset($marketmanage_type_list[$marketmanage['marketmanage_type']])) {
  107. throw new \think\Exception(lang('marketmanage_type_error'), 10006);
  108. }
  109. if ($marketmanage['marketmanage_point'] > 0) {
  110. //扣除会员积分
  111. $insert_arr = array();
  112. $insert_arr['pl_memberid'] = $this->member_info['member_id'];
  113. $insert_arr['pl_membername'] = $this->member_info['member_name'];
  114. $insert_arr['pl_points'] = -$marketmanage['marketmanage_point'];
  115. $insert_arr['pl_desc'] = sprintf(lang('marketmanage_sub_pl_desc'), $marketmanage_type_list[$marketmanage['marketmanage_type']]);
  116. $flag = model('points')->savePointslog('marketmanage', $insert_arr, true);
  117. if (!$flag) {
  118. throw new \think\Exception(lang('point_sub_fail'), 10006);
  119. }
  120. }
  121. //查看是否还有奖品
  122. $condition = 'marketmanage_id=' . $marketmanage_id . ' AND marketmanageaward_count>marketmanageaward_send AND marketmanageaward_probability>0';
  123. $marketmanageaward = $marketmanage_model->getMarketmanageAwardList($condition, true);
  124. if (empty($marketmanageaward)) {
  125. $result = array('draw_result' => false); //未中奖
  126. } else {
  127. $pro = array();
  128. $sum = 0;
  129. $marketmanageaward_list = array();
  130. foreach ($marketmanageaward as $val) {
  131. $sum += $val['marketmanageaward_probability'];
  132. $pro[] = array('marketmanageaward_probability' => $val['marketmanageaward_probability'], 'marketmanageaward_id' => $val['marketmanageaward_id']);
  133. $marketmanageaward_list[$val['marketmanageaward_id']] = $val;
  134. }
  135. $total_percent = count($pro) * 100;
  136. $pro[] = array('marketmanageaward_probability' => ($total_percent - $sum), 'marketmanageaward_id' => 0); //未中奖概率
  137. $pro = array_reverse($pro); //从未中奖到一等奖排序
  138. $sum = $total_percent;
  139. foreach ($pro as $v) {
  140. $r = mt_rand(1, $sum);
  141. if ($r <= $v['marketmanageaward_probability']) {
  142. if ($v['marketmanageaward_id'] == 0) {
  143. $result = array('draw_result' => false); //未中奖
  144. } else {
  145. $result = array('draw_result' => true, 'draw_info' => $marketmanageaward_list[$v['marketmanageaward_id']]); //已中奖
  146. }
  147. break;
  148. } else {
  149. $sum = max(0, $sum - $v['marketmanageaward_probability']);
  150. }
  151. }
  152. if ($result['draw_result']) { //中奖后续操作
  153. switch ($result['draw_info']['marketmanageaward_type']) {
  154. case 1: //奖励积分
  155. $result['draw_info']['marketmanageaward_text'] = $result['draw_info']['marketmanageaward_point'] . lang('ds_point');
  156. //扣除会员积分
  157. $insert_arr = array();
  158. $insert_arr['pl_memberid'] = $this->member_info['member_id'];
  159. $insert_arr['pl_membername'] = $this->member_info['member_name'];
  160. $insert_arr['pl_points'] = $result['draw_info']['marketmanageaward_point'];
  161. $insert_arr['pl_desc'] = sprintf(lang('marketmanage_add_pl_desc'), $marketmanage_type_list[$marketmanage['marketmanage_type']]);
  162. $flag = model('points')->savePointslog('marketmanage', $insert_arr, true);
  163. if (!$flag) {
  164. throw new \think\Exception(lang('point_add_fail'), 10006);
  165. }
  166. break;
  167. case 2: //奖励红包
  168. $bonus_model = model('bonus');
  169. $condition = array('bonus_id' => $result['draw_info']['bonus_id']);
  170. $bonus = $bonus_model->getOneBonus($condition); //获取当前红包的领取金额
  171. if (!$bonus) {
  172. throw new \think\Exception(lang('bonus_set_error'), 10006);
  173. }
  174. if ($bonus['bonus_type'] != 3) {
  175. throw new \think\Exception(lang('bonus_set_error'), 10006);
  176. }
  177. //获取未领取单个红包
  178. $condition = array();
  179. $condition[] = array('bonus_id', '=', $result['draw_info']['bonus_id']);
  180. $condition[] = array('member_id', '=', 0);
  181. $bonusreceive = $bonus_model->getOneBonusreceive($condition);
  182. if (empty($bonusreceive)) {
  183. throw new \think\Exception(lang('bonus_send_over'), 10006);
  184. }
  185. $result['draw_info']['marketmanageaward_text'] = $bonusreceive['bonusreceive_price'] . lang('bonus_fixedprice_notice');
  186. $res = $bonus_model->receiveBonus($this->member_info, $bonus, $bonusreceive, $marketmanage_type_list[$marketmanage['marketmanage_type']] . lang('bonus'));
  187. if (!$res['code']) {
  188. throw new \think\Exception($res['msg'], 10006);
  189. }
  190. break;
  191. case 3: //奖励优惠券
  192. $voucher_model = model('voucher');
  193. //验证是否可以兑换代金券
  194. $data = $voucher_model->getCanChangeTemplateInfo($result['draw_info']['vouchertemplate_id'], $this->member_info['member_id'], 0, true);
  195. if ($data['state'] == false) {
  196. throw new \think\Exception($data['msg'], 10006);
  197. }
  198. if ($data['info']['vouchertemplate_store_id'] == $this->member_info['store_id']) { //如果是自己店铺的代金券
  199. $result = array('draw_result' => false); //未中奖
  200. break;
  201. }
  202. $result['draw_info']['marketmanageaward_text'] = $data['info']['vouchertemplate_price'] . lang('vouchertemplate_notice');
  203. //添加代金券信息
  204. $data = $voucher_model->exchangeVoucher($data['info'], $this->member_info['member_id'], $this->member_info['member_name'], true);
  205. if ($data['state'] != true) {
  206. throw new \think\Exception($data['msg'], 10006);
  207. }
  208. break;
  209. default:
  210. throw new \think\Exception(lang('marketmanageaward_type_error'), 10006);
  211. }
  212. if ($result['draw_result']) {
  213. //增加中奖数量
  214. $condition = array();
  215. $condition[] = array('marketmanageaward_id', '=', $result['draw_info']['marketmanageaward_id']);
  216. $flag = $marketmanage_model->editMarketmanageAward($condition, array('marketmanageaward_send' => $result['draw_info']['marketmanageaward_send'] + 1));
  217. if (!$flag) {
  218. // echo $marketmanage_model->getLastSql();
  219. throw new \think\Exception(lang('marketmanageaward_send_update_fail'), 10006);
  220. }
  221. //更新中奖总数
  222. $condition = array();
  223. $condition[] = array('marketmanage_id', '=', $marketmanage_id);
  224. $flag = $marketmanage_model->editMarketmanage($condition, array('marketmanage_totalwin' => $marketmanage['marketmanage_totalwin'] + 1));
  225. if (!$flag) {
  226. throw new \think\Exception(lang('marketmanageaward_send_update_fail'), 10006);
  227. }
  228. }
  229. }
  230. //增加参与记录
  231. $flag = $marketmanage_model->addMarketmanageLog(array(
  232. 'member_id' => $this->member_info['member_id'],
  233. 'member_name' => $this->member_info['member_name'],
  234. 'marketmanage_id' => $marketmanage_id,
  235. 'marketmanageaward_id' => $result['draw_result'] ? $result['draw_info']['marketmanageaward_id'] : 0,
  236. 'marketmanagelog_win' => $result['draw_result'] ? 1 : 0,
  237. 'marketmanagelog_time' => TIMESTAMP,
  238. 'marketmanagelog_remark' => lang('join') . $marketmanage['marketmanage_name'] . ($result['draw_result'] ? (lang('draw') . $result['draw_info']['marketmanageaward_level'] . lang('prize')) : lang('not_draw')),
  239. ));
  240. if (!$flag) {
  241. throw new \think\Exception(lang('marketmanagelog_add_fail'), 10006);
  242. }
  243. //更新参与总数
  244. $condition = array();
  245. $condition[] = array('marketmanage_id', '=', $marketmanage_id);
  246. $flag = $marketmanage_model->editMarketmanage($condition, array('marketmanage_totalcount' => $marketmanage['marketmanage_totalcount'] + 1));
  247. if (!$flag) {
  248. throw new \think\Exception(lang('marketmanage_totalcount_update_fail'), 10006);
  249. }
  250. Db::commit();
  251. }
  252. } catch (\Exception $e) {
  253. Db::rollback();
  254. ds_json_encode(10001, $e->getMessage());
  255. }
  256. $result['can_draw'] = $can_draw;
  257. $result['count_left'] = $count_left;
  258. ds_json_encode(10000, '', $result);
  259. }
  260. }