Membercard.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\supermember\shop\controller;
  11. use addon\coupon\model\CouponType;
  12. use addon\supermember\model\Config;
  13. use addon\supermember\model\MemberLevelOrder;
  14. use app\model\member\Member;
  15. use app\model\member\MemberLevel;
  16. use app\shop\controller\BaseShop;
  17. use Carbon\Carbon;
  18. /**
  19. * 会员卡
  20. */
  21. class Membercard extends BaseShop
  22. {
  23. protected $replace = []; //视图输出字符串内容替换 相当于配置文件中的'view_replace_str'
  24. public function __construct()
  25. {
  26. parent::__construct();
  27. $this->replace = [
  28. 'SUPERMEMBER_IMG' => __ROOT__ . '/addon/supermember/shop/view/public/img',
  29. 'SUPERMEMBER_CSS' => __ROOT__ . '/addon/supermember/shop/view/public/css',
  30. 'SUPERMEMBER_JS' => __ROOT__ . '/addon/supermember/shop/view/public/js',
  31. ];
  32. }
  33. /**
  34. * 概况
  35. * @return mixed
  36. */
  37. public function index()
  38. {
  39. $order = new MemberLevelOrder();
  40. $yesterday = Carbon::yesterday();
  41. $data = [
  42. 'yesterday_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 00:00:00"), date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 23:59:59") ] ] ])[ 'data' ],
  43. 'today_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time(date('Y-m-d 00:00:00')), time() ] ] ])[ 'data' ],
  44. 'total_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ] ])[ 'data' ],
  45. 'yesterday_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 00:00:00"), date_to_time("{$yesterday->year}-{$yesterday->month}-{$yesterday->day} 23:59:59") ] ] ], 'order_money')[ 'data' ],
  46. 'today_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ date_to_time(date('Y-m-d 00:00:00')), time() ] ] ], 'order_money')[ 'data' ],
  47. 'total_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ] ], 'order_money')[ 'data' ],
  48. 'has_card_member' => ( new Member() )->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'member_level_type', '=', 1 ], [ 'is_delete', '=', 0 ] ])[ 'data' ], // 持有超级会员卡的人数
  49. 'no_has_card_member' => ( new Member() )->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'member_level_type', '=', 0 ], [ 'is_delete', '=', 0 ] ])[ 'data' ], // 未持有超级会员卡的人数
  50. 'card_list' => []
  51. ];
  52. $member_level_model = new MemberLevel();
  53. $card_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ], [ 'level_type', '=', 1 ] ], 'level_name,level_id');
  54. if (!empty($card_list[ 'data' ])) {
  55. foreach ($card_list[ 'data' ] as $k => $item) {
  56. $count = ( new Member() )->getMemberCount([ [ 'member_level', '=', $item[ 'level_id' ] ], [ 'is_delete', '=', 0 ] ]);
  57. $card_list[ 'data' ][ $k ][ 'member_num' ] = $count[ 'data' ];
  58. }
  59. array_multisort(array_column($card_list[ 'data' ], 'member_num'), SORT_DESC, $card_list[ 'data' ]);
  60. $data[ 'card_list' ] = $card_list[ 'data' ];
  61. }
  62. $this->assign('data', $data);
  63. return $this->fetch('membercard/index', [], $this->replace);
  64. }
  65. /**
  66. * 销售数据统计
  67. */
  68. public function salesStatistics()
  69. {
  70. if (request()->isAjax()) {
  71. $start_time = input('start_time', '');
  72. $end_time = input('end_time', '');
  73. $order = new MemberLevelOrder();
  74. $data = [
  75. 'sale_num' => $order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ strtotime($start_time), strtotime($end_time) ] ] ])[ 'data' ],
  76. 'sale_money' => $order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'pay_type', '<>', 'BALANCE' ], [ 'order_status', '=', MemberLevelOrder::ORDER_PAY ], [ 'pay_time', 'between', [ strtotime($start_time), strtotime($end_time) ] ] ], 'order_money')[ 'data' ],
  77. ];
  78. return success(0, '', $data);
  79. }
  80. }
  81. /**
  82. * 会员卡列表
  83. * @return mixed
  84. */
  85. public function lists()
  86. {
  87. if (request()->isAjax()) {
  88. $page = input('page', 1);
  89. $page_size = input('page_size', PAGE_LIST_ROWS);
  90. $search_text = input('search_text', '');
  91. $charge_type = input('charge_type', '');
  92. $status = input('status', '');
  93. $condition = [
  94. [ 'site_id', '=', $this->site_id ],
  95. [ 'level_type', '=', 1 ]
  96. ];
  97. if (!empty($search_text)) $condition[] = [ 'level_name', 'like', "%" . $search_text . "%" ];
  98. if ($charge_type != '') $condition[] = [ 'charge_type', '=', $charge_type ];
  99. if ($status != '') $condition[] = [ 'status', '=', $status ];
  100. $order = 'growth asc,level_id desc';
  101. $field = '*';
  102. $member_level_model = new MemberLevel();
  103. $list = $member_level_model->getMemberLevelPageList($condition, $page, $page_size, $order, $field);
  104. if (!empty($list[ 'data' ][ 'list' ])) {
  105. $member_model = new Member();
  106. foreach ($list[ 'data' ][ 'list' ] as $k => $item) {
  107. $count = $member_model->getMemberCount([ [ 'member_level', '=', $item[ 'level_id' ] ], [ 'is_delete', '=', 0 ] ]);
  108. $list[ 'data' ][ 'list' ][ $k ][ 'member_num' ] = $count[ 'data' ];
  109. }
  110. }
  111. return $list;
  112. } else {
  113. return $this->fetch('membercard/lists', [], $this->replace);
  114. }
  115. }
  116. /**
  117. * 添加会员卡
  118. * @return mixed
  119. */
  120. public function add()
  121. {
  122. $member_level_model = new MemberLevel();
  123. if (request()->isAjax()) {
  124. $data = [
  125. 'site_id' => $this->site_id,
  126. 'level_name' => input('level_name', ''),
  127. 'growth' => input('growth', 0),
  128. 'remark' => input('remark', ''),
  129. 'is_free_shipping' => input('is_free_shipping', 0),
  130. 'consume_discount' => input('consume_discount', 100),
  131. 'point_feedback' => input('point_feedback', 0),
  132. 'send_point' => input('send_point', 0),
  133. 'send_balance' => input('send_balance', 0),
  134. 'send_coupon' => input('send_coupon', ''),
  135. 'charge_rule' => input('charge_rule', ''),
  136. 'charge_type' => input('charge_type', 0),
  137. 'level_type' => 1,
  138. 'bg_color' => input('bg_color', '#333333'),
  139. 'level_text_color' => input('level_text_color', '#ffffff'),
  140. 'level_picture' => input('level_picture', ''),
  141. ];
  142. $this->addLog("添加会员卡:" . $data[ 'level_name' ]);
  143. $res = $member_level_model->addMemberLevel($data);
  144. return $res;
  145. } else {
  146. //获取优惠券列表
  147. $coupon_model = new CouponType();
  148. $condition = [
  149. [ 'status', '=', 1 ],
  150. [ 'site_id', '=', $this->site_id ],
  151. ];
  152. //优惠券字段
  153. $coupon_field = 'coupon_type_id,type,coupon_name,image,money,discount,validity_type,fixed_term,status,is_limit,at_least,count,lead_count,end_time';
  154. $coupon_list = $coupon_model->getCouponTypeList($condition, $coupon_field);
  155. $this->assign('coupon_list', $coupon_list);
  156. $this->assign('level_time', $member_level_model->level_time);
  157. return $this->fetch('membercard/add');
  158. }
  159. }
  160. /**
  161. * 编辑会员卡
  162. * @return mixed
  163. */
  164. public function edit()
  165. {
  166. $member_level_model = new MemberLevel();
  167. if (request()->isAjax()) {
  168. $data = [
  169. 'level_name' => input('level_name', ''),
  170. 'remark' => input('remark', ''),
  171. 'is_free_shipping' => input('is_free_shipping', 0),
  172. 'consume_discount' => input('consume_discount', 100),
  173. 'point_feedback' => input('point_feedback', 0),
  174. 'send_point' => input('send_point', 0),
  175. 'send_balance' => input('send_balance', 0),
  176. 'send_coupon' => input('send_coupon', ''),
  177. 'charge_rule' => input('charge_rule', ''),
  178. 'charge_type' => input('charge_type', 0),
  179. 'bg_color' => input('bg_color', '#333333'),
  180. 'level_text_color' => input('level_text_color', '#ffffff'),
  181. 'level_picture' => input('level_picture', ''),
  182. ];
  183. $level_id = input('level_id', 0);
  184. $this->addLog("编辑会员卡:" . $data[ 'level_name' ]);
  185. if ($data[ 'charge_type' ]) $data[ 'is_recommend' ] = 0;
  186. return $member_level_model->editMemberLevel($data, [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
  187. } else {
  188. $level_id = input('id', 0);
  189. $level_info = $member_level_model->getMemberLevelInfo([ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
  190. $this->assign('level_info', $level_info[ 'data' ]);
  191. if (empty($level_info[ 'data' ]))
  192. $this->error('未获取到会员卡数据', addon_url('supermember://shop/membercard/lists'));
  193. $this->assign('level_time', $member_level_model->level_time);
  194. //获取优惠券列表
  195. $coupon_model = new CouponType();
  196. $condition = [
  197. [ 'status', '=', 1 ],
  198. [ 'site_id', '=', $this->site_id ],
  199. ];
  200. //优惠券字段
  201. $coupon_field = 'coupon_type_id,type,coupon_name,image,money,discount,validity_type,fixed_term,status,is_limit,at_least,count,lead_count,end_time';
  202. $coupon_list = $coupon_model->getCouponTypeList($condition, $coupon_field);
  203. $this->assign('coupon_list', $coupon_list);
  204. return $this->fetch('membercard/edit');
  205. }
  206. }
  207. /**
  208. * 会员等级删除
  209. */
  210. public function delete()
  211. {
  212. if (request()->isAjax()) {
  213. $level_id = input('level_id', '');
  214. $member_level_model = new MemberLevel();
  215. $this->addLog("会员卡删除id:" . $level_id);
  216. return $member_level_model->deleteMemberLevel($level_id, $this->site_id);
  217. }
  218. }
  219. /**
  220. * 会员卡状态变更
  221. */
  222. public function status()
  223. {
  224. if (request()->isAjax()) {
  225. $member_level_model = new MemberLevel();
  226. $level_id = input('level_id', '');
  227. $status = input('status', 0);
  228. $res = $member_level_model->editMemberLevel([ 'status' => $status ], [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
  229. return $res;
  230. }
  231. }
  232. /**
  233. * 推荐
  234. * @return array
  235. */
  236. public function recommend()
  237. {
  238. if (request()->isAjax()) {
  239. $member_level_model = new MemberLevel();
  240. $level_id = input('level_id', '');
  241. $recommend = input('recommend', 1);
  242. $member_level_model->editMemberLevel([ 'is_recommend' => 0 ], [ [ 'level_id', '<>', $level_id ], [ 'is_recommend', '=', 1 ], [ 'site_id', '=', $this->site_id ] ]);
  243. $member_level_model->editMemberLevel([ 'is_recommend' => $recommend ], [ [ 'level_id', '=', $level_id ], [ 'site_id', '=', $this->site_id ] ]);
  244. return success();
  245. }
  246. }
  247. /**
  248. * 会员卡订单
  249. * @return mixed
  250. */
  251. public function order()
  252. {
  253. if (request()->isAjax()) {
  254. $page = input('page', 1);
  255. $page_size = input('page_size', PAGE_LIST_ROWS);
  256. $order_no = input('order_no', '');
  257. $start_time = input('start_time', '');
  258. $end_time = input('end_time', '');
  259. $nickname = input('nickname', '');
  260. $condition = [
  261. [ 'site_id', '=', $this->site_id ],
  262. [ 'order_status', '=', 1 ]
  263. ];
  264. if ($order_no) {
  265. $condition[] = [ 'order_no', '=', $order_no ];
  266. }
  267. if ($nickname) {
  268. $condition[] = [ 'nickname', '=', $nickname ];
  269. }
  270. if ($start_time && !$end_time) {
  271. $condition[] = [ 'pay_time', '>=', date_to_time($start_time) ];
  272. } elseif (!$start_time && $end_time) {
  273. $condition[] = [ 'pay_time', '<=', date_to_time($end_time) ];
  274. } elseif ($start_time && $end_time) {
  275. $condition[] = [ 'pay_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
  276. }
  277. $level_order = new MemberLevelOrder();
  278. $data = $level_order->getLevelOrderPageList($condition, $page, $page_size);
  279. return $data;
  280. } else {
  281. $level_order = new MemberLevelOrder();
  282. $buyer_num = $level_order->getOrderCount([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', 1 ] ], 'order_id', 'a', null, 'buyer_id')[ 'data' ];
  283. $this->assign('buyer_num', $buyer_num);
  284. $order_money = $level_order->getOrderSum([ [ 'site_id', '=', $this->site_id ], [ 'order_status', '=', 1 ] ], 'order_money')[ 'data' ];
  285. $this->assign('order_money', sprintf("%.2f", $order_money));
  286. return $this->fetch('membercard/order', [], $this->replace);
  287. }
  288. }
  289. /**
  290. * 会员卡订单详情
  291. * @return mixed
  292. */
  293. public function orderDetail()
  294. {
  295. $order_id = input('order_id', '');
  296. $level_order = new MemberLevelOrder();
  297. $condition = [
  298. [ 'order_id', '=', $order_id ],
  299. [ 'site_id', '=', $this->site_id ]
  300. ];
  301. $order = $level_order->getLevelOrderInfo($condition);
  302. if (empty($order[ 'data' ]))
  303. $this->error('未获取到订单数据', addon_url('supermember://shop/membercard/order'));
  304. $this->assign('order', $order);
  305. return $this->fetch('membercard/order_detail');
  306. }
  307. /**
  308. * 线下支付
  309. * @return array
  310. */
  311. public function offlinepay()
  312. {
  313. if (request()->isAjax()) {
  314. $out_trade_no = input('out_trade_no', 0);
  315. $level_order = new MemberLevelOrder();
  316. $res = $level_order->offlinePay($out_trade_no);
  317. return $res;
  318. }
  319. }
  320. /**
  321. * 开卡协议
  322. * @return mixed
  323. */
  324. public function agreement()
  325. {
  326. if (request()->isAjax()) {
  327. //设置注销协议
  328. $title = input('title', '');
  329. $content = input('content', '');
  330. $config_model = new Config();
  331. return $config_model->setMemberCardDocument($title, $content, $this->site_id, 'shop');
  332. } else {
  333. //获取注销协议
  334. $config_model = new Config();
  335. $document_info = $config_model->getMemberCardDocument($this->site_id, 'shop');
  336. $this->assign('document_info', $document_info);
  337. return $this->fetch('membercard/agreement');
  338. }
  339. }
  340. }