MemberController.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101
  1. <?php
  2. namespace app\admin\controller\member;
  3. use app\admin\service\member\MemberService;
  4. use app\admin\service\order\OrderService;
  5. use app\admin\validate\member\MemberValidate;
  6. use app\model\Coupon;
  7. use app\model\CouponDetail;
  8. use app\model\Family;
  9. use app\model\FamilyMember;
  10. use app\model\Member;
  11. use app\model\MemberAccount;
  12. use app\model\MemberBenefit;
  13. use app\model\MemberQuota;
  14. use app\model\Order;
  15. use app\model\OrderReturn;
  16. use app\model\OrderSheet;
  17. use app\model\PayDetail;
  18. use support\Db;
  19. use support\exception\BusinessException;
  20. use support\Request;
  21. use Tinywan\Jwt\JwtToken;
  22. class MemberController
  23. {
  24. public function selectList(Request $request)
  25. {
  26. $keywords = $request->get('keywords');
  27. $isOwner = $request->get('member_is_owner', 'N');
  28. if (!$keywords) {
  29. return json_fail("查询错误");
  30. }
  31. $res = Db::table('member')
  32. ->leftjoin('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
  33. ->leftjoin('member_info', 'member.member_id', '=', 'member_info.join_info_member_id')
  34. ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name', 'member_info.member_info_nickname')
  35. ->where('member.member_is_owner', $isOwner)
  36. ->where('member_status', 'ACTIVED')
  37. // ->where('member_mobile','<>','0000')
  38. ->where(function ($query) use ($keywords) {
  39. $query->where('member.member_mobile', 'like', '%' . $keywords . '%')
  40. ->orWhere("member.member_id", 'like', '%' . $keywords . '%')
  41. ->orWhere("member_cert.member_cert_name", 'like', '%' . $keywords . '%')
  42. ->orWhere("member_info.member_info_nickname", 'like', '%' . $keywords . '%');
  43. })->get();
  44. $data = [];
  45. foreach ($res as $item) {
  46. // $item->member_mobile = substr($item->member_mobile,0,3).'****'.substr($item->member_mobile,7);
  47. $name = '';
  48. if (!empty($item->member_cert_name)) {
  49. $name = $item->member_cert_name;
  50. } else if (!empty($item->member_info_nickname)) {
  51. $name = $item->member_info_nickname;
  52. }
  53. $value = !empty($name) ? $name . '-' : '';
  54. if ($item->member_mobile != '0000') {
  55. $value .= $item->member_mobile;
  56. }
  57. if (empty($value)) {
  58. $value = $item->member_mobile;
  59. }
  60. $value = rtrim($value, '-');
  61. $data[] = [
  62. 'key' => $item->member_id,
  63. 'value' => $value,
  64. ];
  65. }
  66. return json_success('', $data);
  67. }
  68. public function exportMember(Request $request)
  69. {
  70. return MemberService::exportMember($request);
  71. }
  72. public function selectWriteOffMember()
  73. {
  74. $members = Member::with([
  75. 'cert' => function ($query) {
  76. $query->select('join_cert_member_id', 'member_cert_name');
  77. }
  78. ])->whereRaw("JSON_EXTRACT(`member_json`, '$.user') IS NOT NULL")
  79. ->select('member_id', 'member_mobile', 'member_json')
  80. ->get()
  81. ->toArray();
  82. foreach ($members as &$member) {
  83. // $member['member_mobile'] = substr($member['member_mobile'],0,3).'****'.substr($member['member_mobile'],7);
  84. $member['member_json'] = json_decode($member['member_json'], true);
  85. $member['username'] = $member['member_mobile'];
  86. $member['user_id'] = $member['member_json']['user'] ? $member['member_json']['user']['user_id'] : '';
  87. if (isset($member['cert']['member_cert_name'])) {
  88. $member['username'] = $member['cert']['member_cert_name'] . '-' . $member['username'];
  89. }
  90. }
  91. return json_success('', $members);
  92. }
  93. public function selectFamilyMemberList(Request $request)
  94. {
  95. $keywords = $request->get('keywords');
  96. if (!$keywords) {
  97. return json_fail("查询错误");
  98. }
  99. // 创建的家庭
  100. $family = Family::where('join_family_creator_member_id', $request->get('memberId'))->get()->toArray();
  101. if (!$family) {
  102. return json_success('暂无数据');
  103. }
  104. $familyIds = array_column($family, 'family_id');
  105. $res = FamilyMember::whereIn('join_family_id', $familyIds)
  106. ->where("family_member_name", 'like', '%' . $keywords . '%')
  107. ->get()
  108. ->toArray();
  109. $data = [];
  110. foreach ($res as $item) {
  111. $data[] = [
  112. 'key' => $item['join_family_member_id'],
  113. 'value' => $item['family_member_name']
  114. ];
  115. }
  116. return json_success('', $data);
  117. }
  118. public function selectMemberAllQuota(Request $request)
  119. {
  120. $memberId = $request->get('member_id', '');
  121. $orderId = $request->get('order_id', '');
  122. $goodsId = $request->get('goods_id', '');
  123. $person = $request->get('person', '');
  124. $selectType = $request->get('select_type', 'ALL');
  125. if (!$memberId) {
  126. return json_fail('参数异常');
  127. }
  128. $data = [];
  129. $benefit = MemberBenefit::where('join_benefit_member_id', $memberId)
  130. ->whereColumn('member_benefit_limit_count', '>', 'member_benefit_used_count')
  131. ->select('member_benefit_id as id', 'member_benefit_name as name', 'member_benefit_limit_count as total', 'member_benefit_used_count as used')
  132. ->when($orderId != '', function ($query) use ($orderId) {
  133. $query->where('join_benefit_order_id', $orderId);
  134. })->when($goodsId != '', function ($query) use ($goodsId) {
  135. $query->where('join_benefit_goods_id', $goodsId);
  136. })
  137. ->get()
  138. ->toArray();
  139. foreach ($benefit as $item) {
  140. if ($item['total'] - $item['used'] < $person) {
  141. $item['disabled'] = true;
  142. }
  143. $item['cut'] = $item['total'] - $item['used'];
  144. $data[] = $item;
  145. }
  146. if ($selectType == 'BENEFIT') {
  147. return json_success('', $data);
  148. }
  149. $quotas = MemberQuota::where('join_quota_member_id', $memberId)
  150. ->when($goodsId != '', function ($query) use ($goodsId) {
  151. $query->whereJsonContains('member_quota_json', ['goods_id' => $goodsId]);
  152. })
  153. ->selectRaw('join_quota_member_id,join_member_rule_added_component_id,COUNT(*) as total')
  154. ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id')
  155. ->get()
  156. ->toArray();
  157. foreach ($quotas as $quota) {
  158. $usedNum = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  159. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  160. ->where('member_quota_status', 'USED')
  161. ->count('*');
  162. if ($quota['total'] <= $usedNum) {
  163. continue;
  164. }
  165. $memberQuota = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  166. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  167. ->select('member_quota_id as id', 'member_quota_name as name')
  168. ->first()
  169. ->toArray();
  170. $memberQuota['total'] = $quota['total'];
  171. $memberQuota['used'] = $usedNum;
  172. if ($memberQuota['total'] - $memberQuota['used'] < $person) {
  173. $memberQuota['disabled'] = true;
  174. }
  175. $memberQuota['cut'] = $memberQuota['total'] - $memberQuota['used'];
  176. $data[] = $memberQuota;
  177. }
  178. if ($selectType == 'QUOTA') {
  179. return json_success('', $data);
  180. }
  181. return json_success('', $data);
  182. }
  183. /**
  184. * 预约核销用
  185. */
  186. public function selectMemberAllQuotaByAppointment(Request $request)
  187. {
  188. $memberId = $request->get('member_id', '');
  189. $orderId = $request->get('order_id', '');
  190. $goodsId = $request->get('goods_id', '');
  191. $person = $request->get('person', '');
  192. $selectType = $request->get('select_type', 'ALL');
  193. if (!$memberId) {
  194. return json_fail('参数异常');
  195. }
  196. $data = [];
  197. $benefit = MemberBenefit::where('join_benefit_member_id', $memberId)
  198. ->whereColumn('member_benefit_limit_count', '>', 'member_benefit_used_count')
  199. ->select('member_benefit_id as id', 'member_benefit_name as name', 'member_benefit_limit_count as total', 'member_benefit_used_count as used')
  200. ->when($orderId != '', function ($query) use ($orderId) {
  201. $query->where('join_benefit_order_id', $orderId);
  202. })->when($goodsId != '', function ($query) use ($goodsId) {
  203. $query->where('join_benefit_goods_id', $goodsId);
  204. })
  205. ->get()
  206. ->toArray();
  207. $data['benefit'] = [];
  208. foreach ($benefit as $item) {
  209. $item['benefit']['cut'] = $item['total'] - $item['used'];
  210. $data['benefit']['name'] = $item['name'];
  211. $data['benefit']['cut'] += $item['cut'];
  212. $data['benefit']['id'][] = $item['id'];
  213. }
  214. if ($selectType == 'BENEFIT') {
  215. return json_success('', $data);
  216. }
  217. $quotas = MemberQuota::where('join_quota_member_id', $memberId)
  218. ->when($goodsId != '', function ($query) use ($goodsId) {
  219. $query->whereJsonContains('member_quota_json', ['goods_id' => $goodsId]);
  220. })
  221. ->selectRaw('join_quota_member_id,join_member_rule_added_component_id,COUNT(*) as total')
  222. ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id')
  223. ->get()
  224. ->toArray();
  225. $data['quota'] = [];
  226. foreach ($quotas as $quota) {
  227. $usedNum = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  228. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  229. ->where('member_quota_status', 'USED')
  230. ->count('*');
  231. if ($quota['total'] <= $usedNum) {
  232. continue;
  233. }
  234. $memberQuota = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  235. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  236. ->select('member_quota_id as id', 'member_quota_name as name')
  237. ->first()
  238. ->toArray();
  239. $memberQuota['total'] = $quota['total'];
  240. $memberQuota['used'] = $usedNum;
  241. if ($memberQuota['total'] - $memberQuota['used'] < $person) {
  242. $memberQuota['disabled'] = true;
  243. }
  244. $memberQuota['cut'] = $memberQuota['total'] - $memberQuota['used'];
  245. $data['quota']['name'] = $memberQuota['name'];
  246. $data['quota']['cut'] += $memberQuota['cut'];
  247. $data['quota']['id'][] = $memberQuota['id'];
  248. // $data[] = $memberQuota;
  249. }
  250. if ($selectType == 'QUOTA') {
  251. return json_success('', $data);
  252. }
  253. return json_success('', $data);
  254. }
  255. public function selectMemberAllQuotaByGoods(Request $request)
  256. {
  257. $memberId = $request->get('member_id', '');
  258. $orderId = $request->get('order_id', '');
  259. $person = $request->get('person', '');
  260. $selectType = $request->get('select_type', 'ALL');
  261. if (!$memberId) {
  262. return json_fail('参数异常');
  263. }
  264. $data = [];
  265. $benefit = MemberBenefit::where('join_benefit_member_id', $memberId)
  266. // ->whereColumn('member_benefit_limit_count','>','member_benefit_used_count')
  267. ->select('member_benefit_id as id', 'member_benefit_name as name', 'member_benefit_limit_count as total', 'member_benefit_used_count as used')
  268. ->when($orderId != '', function ($query) use ($orderId) {
  269. $query->where('join_benefit_order_id', $orderId);
  270. })
  271. ->get()
  272. ->toArray();
  273. foreach ($benefit as $item) {
  274. if ($item['total'] - $item['used'] < $person) {
  275. $item['disabled'] = true;
  276. }
  277. $item['cut'] = $item['total'] - $item['used'];
  278. $data[] = $item;
  279. }
  280. if ($selectType == 'BENEFIT') {
  281. return json_success('', $data);
  282. }
  283. $quotas = MemberQuota::where('join_quota_member_id', $memberId)
  284. ->selectRaw('join_quota_member_id,join_member_rule_added_component_id,COUNT(*) as total')
  285. ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id')
  286. ->get()
  287. ->toArray();
  288. foreach ($quotas as $quota) {
  289. $usedNum = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  290. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  291. ->where('member_quota_status', 'USED')
  292. ->count('*');
  293. if ($quota['total'] <= $usedNum) {
  294. continue;
  295. }
  296. $memberQuota = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
  297. ->where('join_member_rule_added_component_id', $quota['join_member_rule_added_component_id'])
  298. ->select('member_quota_id as id', 'member_quota_name as name')
  299. ->first()
  300. ->toArray();
  301. $memberQuota['total'] = $quota['total'];
  302. $memberQuota['used'] = $usedNum;
  303. if ($memberQuota['total'] - $memberQuota['used'] < $person) {
  304. $memberQuota['disabled'] = true;
  305. }
  306. $memberQuota['cut'] = $memberQuota['total'] - $memberQuota['used'];
  307. $data[] = $memberQuota;
  308. }
  309. if ($selectType == 'QUOTA') {
  310. return json_success('', $data);
  311. }
  312. return json_success('', $data);
  313. }
  314. public function list(Request $request)
  315. {
  316. return MemberService::list($request);
  317. }
  318. public function info(Request $request)
  319. {
  320. $memberId = $request->get('member_id', '');
  321. if (!$memberId) {
  322. return json_fail("参数错误");
  323. }
  324. return MemberService::info($memberId);
  325. }
  326. public function vipInfo(Request $request)
  327. {
  328. $memberId = $request->get('member_id', '');
  329. if (!$memberId) {
  330. return json_fail("参数错误");
  331. }
  332. return MemberService::vipInfo($request);
  333. }
  334. public function welfareInfo(Request $request)
  335. {
  336. $memberId = $request->get('member_id');
  337. if (!$memberId) {
  338. return json_fail("参数错误");
  339. }
  340. return MemberService::welfareInfo($request);
  341. }
  342. public function commissionList(Request $request)
  343. {
  344. $memberId = $request->get('member_id');
  345. if (!$memberId) {
  346. return json_fail("参数错误");
  347. }
  348. return MemberService::commissionList($request);
  349. }
  350. /**
  351. * @Desc 我的粉丝列表
  352. * @Author Gorden
  353. * @Date 2024/9/20 10:22
  354. *
  355. * @param Request $request
  356. * @return \support\Response
  357. */
  358. public function fansList(Request $request)
  359. {
  360. $memberId = $request->get('member_id');
  361. if (!$memberId) {
  362. return json_fail("参数错误");
  363. }
  364. return MemberService::fansList($request);
  365. }
  366. public function clearWelfare(Request $request)
  367. {
  368. $memberId = $request->post('member_id', '');
  369. if (!$memberId) {
  370. return json_fail("参数错误");
  371. }
  372. return MemberService::clearWelfare($request);
  373. }
  374. public function balanceInfo(Request $request)
  375. {
  376. $memberId = $request->get('member_id', '');
  377. if (!$memberId) {
  378. return json_fail("参数错误");
  379. }
  380. return MemberService::balanceInfo($request);
  381. }
  382. public function pointInfo(Request $request)
  383. {
  384. $memberId = $request->get('member_id', '');
  385. if (!$memberId) {
  386. return json_fail("参数错误");
  387. }
  388. return MemberService::pointInfo($memberId);
  389. }
  390. /**
  391. * @Desc 添加会员
  392. * @Author Gorden
  393. * @Date 2024/3/25 13:40
  394. *
  395. * @param Request $request
  396. * @return \support\Response
  397. */
  398. public function add(Request $request)
  399. {
  400. $validate = new MemberValidate();
  401. if (!$validate->scene('add')->check($request->post())) {
  402. return json_fail($validate->getError());
  403. }
  404. _syslog("添加用户", "用户【" . $request->post('member_cert_name') . '】');
  405. return MemberService::add($request->post());
  406. }
  407. public function update(Request $request)
  408. {
  409. $validate = new MemberValidate();
  410. if (!$validate->scene('update')->check($request->post())) {
  411. return json_fail($validate->getError());
  412. }
  413. _syslog("编辑用户", "用户【" . $request->post('member_cert_name') ?? $request->post('member_id') . '】');
  414. return MemberService::update($request->post());
  415. }
  416. /**
  417. * @Desc 绑定的设备
  418. * @Author Gorden
  419. * @Date 2024/4/7 10:20
  420. *
  421. * @param $id
  422. * @return \support\Response
  423. */
  424. public function device($id)
  425. {
  426. return MemberService::deviceList($id);
  427. }
  428. public function addDevice(Request $request)
  429. {
  430. return MemberService::addDevice($request);
  431. }
  432. public function updateDevice(Request $request)
  433. {
  434. return MemberService::updateDevice($request);
  435. }
  436. public function deleteDevice(Request $request)
  437. {
  438. return MemberService::deleteDevice($request);
  439. }
  440. /**
  441. * @Desc 卡券数量
  442. * @Author Gorden
  443. * @Date 2024/8/22 18:51
  444. *
  445. * @param Request $request
  446. * @return \support\Response
  447. */
  448. public function couponCount(Request $request)
  449. {
  450. $memberId = $request->get('member_id', '');
  451. $coupons = CouponDetail::leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
  452. ->where('join_coupon_detail_member_id', $memberId)
  453. ->select('coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
  454. ->get()
  455. ->toArray();
  456. $data = ['manjian' => 0, 'diyong' => 0, 'zhekou' => 0, 'lijian' => 0, 'zengpin' => 0, 'fuli' => 0, 'nianka' => 0, 'jika' => 0, 'yueka' => 0];
  457. foreach ($coupons as $item) {
  458. if ($item['coupon_classify'] == '满减券') {
  459. $data['manjian'] += 1;
  460. } elseif ($item['coupon_classify'] == '抵用券') {
  461. $data['diyong'] += 1;
  462. } elseif ($item['coupon_classify'] == '折扣券') {
  463. $data['zhekou'] += 1;
  464. } elseif ($item['coupon_classify'] == '立减券') {
  465. $data['lijian'] += 1;
  466. } elseif ($item['coupon_classify'] == '赠品券') {
  467. $data['zengpin'] += 1;
  468. } elseif ($item['coupon_classify'] == '福利券') {
  469. $data['fuli'] += 1;
  470. } elseif ($item['coupon_classify'] == '年卡') {
  471. $data['nianka'] += 1;
  472. } elseif ($item['coupon_classify'] == '季卡') {
  473. $data['jika'] += 1;
  474. } elseif ($item['coupon_classify'] == '月卡') {
  475. $data['yueka'] += 1;
  476. }
  477. }
  478. $data['total'] = $data['manjian'] + $data['diyong'] + $data['zhekou'] + $data['lijian'] + $data['zengpin'] + $data['fuli'] + $data['nianka'] + $data['jika'] + $data['yueka'];
  479. return json_success('', $data);
  480. }
  481. /**
  482. * @Desc 我的卡券
  483. * @Author Gorden
  484. * @Date 2024/8/22 18:45
  485. *
  486. * @param Request $request
  487. * @return \support\Response
  488. */
  489. public function coupon(Request $request)
  490. {
  491. $memberId = $request->get('member_id', '');
  492. $classify = $request->get('classify', '');
  493. $page = $request->get('page', 1);
  494. $pageSize = $request->get('pageSize', 20);
  495. $coupons = CouponDetail::with([
  496. 'member' => function ($query) {
  497. $query->select('member_id', 'member_mobile');
  498. },
  499. 'cert' => function ($query) {
  500. $query->select('join_cert_member_id', 'member_cert_name');
  501. },
  502. 'info' => function ($query) {
  503. $query->select('join_info_member_id', 'member_info_nickname');
  504. }
  505. ])
  506. ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
  507. ->where('join_coupon_detail_member_id', $memberId)
  508. ->where('coupon.coupon_classify', $classify)
  509. ->groupBy('join_coupon_detail_member_id', 'join_detail_coupon_id');
  510. // $total = $coupons->count();
  511. $totalModel = Db::select("select count(a.join_detail_coupon_id) as total from (select join_detail_coupon_id from app_coupon_detail as d left join app_coupon as c ON d.join_detail_coupon_id = c.coupon_id where d.join_coupon_detail_member_id='" . $memberId . "' and c.coupon_classify='" . $classify . "' group by d.join_coupon_detail_member_id,d.join_detail_coupon_id) as a");
  512. $total = 0;
  513. if (!empty($totalModel) && !empty($totalModel[0])) {
  514. $total = $totalModel[0]->total;
  515. }
  516. $rows = $coupons->select('coupon_detail.join_coupon_detail_member_id', 'coupon_detail.join_detail_coupon_id'
  517. , 'coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
  518. ->selectRaw('COUNT(1) as total,
  519. COUNT(IF(app_coupon_detail.coupon_detail_status="USED",1,NULL)) as used_total,
  520. COUNT(IF(app_coupon_detail.coupon_detail_status="ACTIVED" or app_coupon_detail.coupon_detail_status="WAITING",1,NULL)) as unused_total,
  521. MAX(app_coupon_detail.coupon_detail_deadline_datetime) as deadline_datetime')
  522. ->orderBy('deadline_datetime', 'DESC')
  523. ->forPage($page, $pageSize)
  524. ->get()
  525. ->toArray();
  526. foreach ($rows as &$item) {
  527. $mobile = $certName = $nickname = '';
  528. if (!empty($item['member']) && !empty($item['member']['member_mobile'])) {
  529. $mobile = $item['member']['member_mobile'];
  530. }
  531. if (!empty($item['cert']) && !empty($item['cert']['member_cert_name'])) {
  532. $certName = $item['cert']['member_cert_name'];
  533. }
  534. if (!empty($item['info']) && !empty($item['info']['member_info_nickname'])) {
  535. $nickname = $item['info']['member_info_nickname'];
  536. }
  537. $item['member_name'] = MemberService::getMemberName($mobile, $certName, $nickname);
  538. unset($item['member'], $item['cert'], $item['info']);
  539. $item['invalid_total'] = $item['total'] - $item['used_total'] - $item['unused_total'];
  540. // 优惠券分类
  541. $coupon = Coupon::with('category')->where('coupon_id', $item['join_detail_coupon_id'])
  542. ->select('coupon_id', 'join_coupon_category_id')
  543. ->first();
  544. if (!empty($coupon) && !empty($coupon->category)) {
  545. $item['category_name'] = $coupon->category->category_name;
  546. }
  547. }
  548. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  549. }
  550. /**
  551. * @Desc 我的卡券
  552. * @Author Gorden
  553. * @Date 2024/8/22 18:45
  554. *
  555. * @param Request $request
  556. * @return \support\Response
  557. */
  558. public function allCoupon(Request $request)
  559. {
  560. $memberId = $request->get('member_id', '');
  561. $page = $request->get('page', 1);
  562. $pageSize = $request->get('pageSize', 20);
  563. $coupons = CouponDetail::with([
  564. 'member' => function ($query) {
  565. $query->select('member_id', 'member_mobile');
  566. },
  567. 'cert' => function ($query) {
  568. $query->select('join_cert_member_id', 'member_cert_name');
  569. },
  570. 'info' => function ($query) {
  571. $query->select('join_info_member_id', 'member_info_nickname');
  572. }
  573. ])
  574. ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
  575. ->where('join_coupon_detail_member_id', $memberId)
  576. ->groupBy('join_coupon_detail_member_id', 'join_detail_coupon_id');
  577. // $total = $coupons->count();
  578. $totalModel = Db::select("select count(a.join_detail_coupon_id) as total from (select join_detail_coupon_id from app_coupon_detail as d left join app_coupon as c ON d.join_detail_coupon_id = c.coupon_id where d.join_coupon_detail_member_id='" . $memberId . "' group by d.join_coupon_detail_member_id,d.join_detail_coupon_id) as a");
  579. $total = 0;
  580. if (!empty($totalModel) && !empty($totalModel[0])) {
  581. $total = $totalModel[0]->total;
  582. }
  583. $rows = $coupons->select('coupon_detail.join_coupon_detail_member_id', 'coupon_detail.join_detail_coupon_id'
  584. , 'coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
  585. ->selectRaw('COUNT(1) as total,
  586. COUNT(IF(app_coupon_detail.coupon_detail_status="USED",1,NULL)) as used_total,
  587. COUNT(IF(app_coupon_detail.coupon_detail_status="ACTIVED" or app_coupon_detail.coupon_detail_status="WAITING",1,NULL)) as unused_total,
  588. MAX(app_coupon_detail.coupon_detail_deadline_datetime) as deadline_datetime')
  589. ->orderBy('deadline_datetime', 'DESC')
  590. ->forPage($page, $pageSize)
  591. ->get()
  592. ->toArray();
  593. foreach ($rows as &$item) {
  594. $mobile = $certName = $nickname = '';
  595. if (!empty($item['member']) && !empty($item['member']['member_mobile'])) {
  596. $mobile = $item['member']['member_mobile'];
  597. }
  598. if (!empty($item['cert']) && !empty($item['cert']['member_cert_name'])) {
  599. $certName = $item['cert']['member_cert_name'];
  600. }
  601. if (!empty($item['info']) && !empty($item['info']['member_info_nickname'])) {
  602. $nickname = $item['info']['member_info_nickname'];
  603. }
  604. $item['member_name'] = MemberService::getMemberName($mobile, $certName, $nickname);
  605. unset($item['member'], $item['cert'], $item['info']);
  606. $item['invalid_total'] = $item['total'] - $item['used_total'] - $item['unused_total'];
  607. // 优惠券分类
  608. $coupon = Coupon::with('category')->where('coupon_id', $item['join_detail_coupon_id'])
  609. ->select('coupon_id', 'join_coupon_category_id')
  610. ->first();
  611. if (!empty($coupon) && !empty($coupon->category)) {
  612. $item['category_name'] = $coupon->category->category_name;
  613. }
  614. }
  615. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  616. }
  617. /**
  618. * @Desc 我的卡券 领取记录
  619. * @Author Gorden
  620. * @Date 2024/8/22 18:45
  621. *
  622. * @param Request $request
  623. * @return \support\Response
  624. */
  625. public function couponDetail(Request $request)
  626. {
  627. $memberId = $request->get('member_id', '');
  628. $couponId = $request->get('coupon_id', '');
  629. $page = $request->get('page', 1);
  630. $pageSize = $request->get('pageSize', 20);
  631. $coupons = CouponDetail::with([
  632. 'member' => function ($query) {
  633. $query->select('member_id', 'member_mobile');
  634. },
  635. 'cert' => function ($query) {
  636. $query->select('join_cert_member_id', 'member_cert_name');
  637. },
  638. 'info' => function ($query) {
  639. $query->select('join_info_member_id', 'member_info_nickname');
  640. }
  641. ])
  642. ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
  643. ->where('join_coupon_detail_member_id', $memberId)
  644. ->where('coupon.coupon_id', $couponId);
  645. $total = $coupons->count();
  646. $rows = $coupons->select('coupon_detail.*', 'coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
  647. ->orderBy('coupon_detail_deadline_datetime', 'desc')
  648. ->forPage($page, $pageSize)
  649. ->get()
  650. ->toArray();
  651. foreach ($rows as &$item) {
  652. $mobile = $certName = $nickname = '';
  653. if (!empty($item['member']) && !empty($item['member']['member_mobile'])) {
  654. $mobile = $item['member']['member_mobile'];
  655. }
  656. if (!empty($item['cert']) && !empty($item['cert']['member_cert_name'])) {
  657. $certName = $item['cert']['member_cert_name'];
  658. }
  659. if (!empty($item['info']) && !empty($item['info']['member_info_nickname'])) {
  660. $nickname = $item['info']['member_info_nickname'];
  661. }
  662. $item['member_name'] = MemberService::getMemberName($mobile, $certName, $nickname);
  663. unset($item['member'], $item['cert'], $item['info']);
  664. if (!empty($coupon) && !empty($coupon->category)) {
  665. $item['category_name'] = $coupon->category->category_name;
  666. }
  667. }
  668. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  669. }
  670. /**
  671. * @Desc 新会员充值备份记录
  672. * @Author Gorden
  673. * @Date 2024/10/15 10:27
  674. *
  675. * @param Request $request
  676. * @return \support\Response
  677. */
  678. public function rechargeBackupsList(Request $request)
  679. {
  680. $page = $request->get('page', 1);
  681. $pageSize = $request->get('pageSize', 20);
  682. $memberId = $request->get('member_id');
  683. if (!$memberId) {
  684. return json_fail("参数异常");
  685. }
  686. $member = Member::where('member_id', $memberId)
  687. ->select('member_id', 'member_extend_json')
  688. ->first();
  689. $data = [];
  690. if (!empty($member->member_extend_json)) {
  691. $extendJson = json_decode($member->member_extend_json, true);
  692. if (isset($extendJson['snap'])) {
  693. foreach ($extendJson['snap'] as $key => $item) {
  694. $data[] = [
  695. 'recharge_times' => $key,
  696. 'member_account_surplus' => $item['member_account_surplus'],
  697. 'member_account_added' => $item['member_account_added'],
  698. 'pay_amount' => $item['pay_amount'],
  699. 'added_rate' => floatval($item['added_rate']) * 100,
  700. 'added_amount' => $item['added_amount']
  701. ];
  702. }
  703. }
  704. }
  705. $total = count($data);
  706. $start = ($page - 1) * $pageSize;
  707. $rows = array_slice($data, $start, $pageSize);
  708. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  709. }
  710. /**
  711. * @Desc 会员权益使用记录
  712. * @Author Gorden
  713. * @Date 2024/10/15 11:13
  714. *
  715. * @param Request $request
  716. * @return \support\Response
  717. */
  718. public function roleBenefitUsedList(Request $request)
  719. {
  720. $page = $request->get('page', 1);
  721. $pageSize = $request->get('pageSize', 20);
  722. $memberId = $request->get('member_id');
  723. if (!$memberId) {
  724. return json_fail('参数异常');
  725. }
  726. $data = $this->getRoleBenefitUsedList($memberId);
  727. $total = count($data);
  728. $start = ($page - 1) * $pageSize;
  729. $rows = array_slice($data, $start, $pageSize);
  730. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  731. }
  732. public function consumptionList(Request $request)
  733. {
  734. $page = $request->get('page', 1);
  735. $pageSize = $request->get('pageSize', 20);
  736. $memberId = $request->get('member_id');
  737. if (!$memberId) {
  738. return json_fail('参数异常');
  739. }
  740. $member = Member::where('member_id', $memberId)->first();
  741. $firstRechargeTime = 0;
  742. if (!empty($member->member_extend_json)) {
  743. $memberExtendJson = json_decode($member->member_extend_json, true);
  744. if (isset($memberExtendJson['snap'])) {
  745. foreach ($memberExtendJson['snap'] as $key => $value) {
  746. $firstRechargeTime = strtotime($key);
  747. break;
  748. }
  749. }
  750. }
  751. $payDetailIds = PayDetail::where('pay_addtimes', '>', $firstRechargeTime)
  752. ->where('pay_prepayid', $memberId . '-CASH')
  753. ->where('pay_status', 'SUCCESS')
  754. ->pluck('join_pay_order_id')
  755. ->toArray();
  756. $orders = Order::with([
  757. 'payDetail' => function ($query) {
  758. $query->where('pay_prepayid', 'like', '%CASH%');
  759. }
  760. ])->whereIn('order_groupby', $payDetailIds)
  761. ->where('order_addtimes', '>', $firstRechargeTime);
  762. $total = $orders->count();
  763. $rows = $orders->orderBy('order_addtimes', 'DESC')
  764. ->forPage($page, $pageSize)
  765. ->get()
  766. ->toArray();
  767. $data = [];
  768. foreach ($rows as $row) {
  769. $sheets = OrderSheet::with([
  770. 'goods' => function ($query) {
  771. $query->select('goods_id', 'goods_name');
  772. }
  773. ])->where('join_sheet_order_id', $row['order_id'])
  774. ->get()
  775. ->toArray();
  776. $deng = "";
  777. if (count($sheets) > 1) {
  778. $deng = '等';
  779. }
  780. $data[] = [
  781. 'order_classify' => $row['order_classify'],
  782. 'order_id' => $row['order_id'],
  783. 'goods_name' => !empty($sheets[0]) && !empty($sheets[0]['goods']) ? ($sheets[0]['goods']['goods_name'] . $deng) : '',
  784. 'order_amount_total' => $row['order_amount_total'],
  785. 'order_amount_pay' => $row['order_amount_pay'],
  786. 'pay_paytimes' => !empty($row['payDetail'][0]) ? $row['payDetail'][0]['pay_paytimes'] : "",
  787. 'order_addtimes' => $row['order_addtimes'],
  788. ];
  789. }
  790. $rows = $data;
  791. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  792. }
  793. /**
  794. * @Desc 获取权益使用记录
  795. * @Author Gorden
  796. * @Date 2024/10/15 11:35
  797. *
  798. * @param $memberId
  799. * @param $orderIds
  800. * @return array
  801. */
  802. public function getRoleBenefitUsedList($memberId, $orderIds = [])
  803. {
  804. $couponDetails = CouponDetail::where('join_coupon_detail_member_id', $memberId)
  805. ->where('coupon_detail_status', 'USED')
  806. ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
  807. ->get()
  808. ->toArray();
  809. $data = [];
  810. foreach ($couponDetails as $couponDetail) {
  811. $orders = Order::where('order_discount_json', 'like', '%' . $couponDetail['coupon_detail_id'] . '%')
  812. ->whereIn('order_is_complete', ['Y', 'N'])
  813. ->where('order_status_payment', 'SUCCESS')
  814. ->when(!empty($orderIds), function ($query) use ($orderIds) {
  815. $query->whereIn('order_id', $orderIds);
  816. })->get()
  817. ->toArray();
  818. foreach ($orders as $order) {
  819. $sheets = OrderSheet::with([
  820. 'goods' => function ($query) {
  821. $query->select('goods_id', 'goods_name');
  822. }
  823. ])->where('join_sheet_order_id', $order['order_id'])
  824. ->get()
  825. ->toArray();
  826. $deng = "";
  827. if (count($sheets) > 1) {
  828. $deng = '等';
  829. }
  830. $discountJson = json_decode($order['order_discount_json'], true);
  831. $couponName = '';
  832. $discountAmount = 0;
  833. foreach ($discountJson as $item) {
  834. $discountAmount = $item['coupon_value'];
  835. $couponName = Coupon::where('coupon_id', $item['coupon_id'])->value('coupon_name');
  836. }
  837. $payDetailTimes = PayDetail::whereJsonContains('join_pay_object_json->order_id', $order['order_id'])->value('pay_paytimes');
  838. $data[] = [
  839. 'order_id' => $order['order_id'],
  840. 'goods_name' => !empty($sheets[0]) && !empty($sheets[0]['goods']) ? ($sheets[0]['goods']['goods_name'] . $deng) : '',
  841. 'order_classify' => $order['order_classify'],
  842. 'order_amount_total' => $order['order_amount_total'],
  843. 'order_amount_pay' => $order['order_amount_pay'],
  844. 'coupon_name' => $couponName,
  845. 'discountAmount' => $discountAmount,
  846. 'order_status_system' => $order['order_status_system'],
  847. 'order_addtimes' => $order['order_addtimes'],
  848. 'pay_paytimes' => $payDetailTimes
  849. ];
  850. }
  851. }
  852. return $data;
  853. }
  854. public function roleBenefitExport(Request $request)
  855. {
  856. $orderIds = $request->post('order_id', []);
  857. $memberId = $request->post('member_id');
  858. $applyUsername = $request->post('apply_username', '');
  859. $applyMobile = $request->post('apply_mobile', '');
  860. $applyAmount = $request->post('apply_amount', '');
  861. if (!$memberId) {
  862. return json_fail("参数异常");
  863. }
  864. $data = $this->getRoleBenefitUsedList($memberId, $orderIds);
  865. $dicountAmount = 0;
  866. foreach ($data as $key => $item) {
  867. $data[$key]['order_classify'] = OrderService::$orderClassify[$item['order_classify']];
  868. $dicountAmount += $item['discountAmount'];
  869. }
  870. $returnApplayData['data'] = $data;
  871. $returnApplayData['amount'] = $applyAmount;
  872. $returnApplayData['apply_username'] = $applyUsername;
  873. $returnApplayData['apply_mobile'] = $applyMobile;
  874. $returnApplayData['reason'] = "会员权益退款";
  875. $data[] = [
  876. 'discountAmount' => '优惠合计:¥' . sprintf('%.2f', $dicountAmount)
  877. ];
  878. $data[] = [
  879. 'order_classify' => '申请人:' . $applyUsername,
  880. ];
  881. $data[] = [
  882. 'order_classify' => '电话:' . $applyMobile,
  883. ];
  884. $data[] = [
  885. 'order_classify' => '退款金额:' . $applyAmount,
  886. ];
  887. // 产生退款记录
  888. $this->refundOrder($memberId, $returnApplayData);
  889. return json_success('success', $data);
  890. }
  891. public function refundOrder($memberId, $data)
  892. {
  893. try {
  894. OrderReturn::where('join_return_member_id', $memberId)
  895. ->where('order_return_status', '<>', 'DONE')
  896. ->where('order_return_category', '会员权益退款')
  897. ->delete();
  898. OrderReturn::insert([
  899. 'join_order_return_user_id' => JwtToken::getCurrentId(),
  900. 'join_return_member_id' => $memberId,
  901. 'join_return_order_id' => 'ROLE_REFUND',
  902. 'order_return_status' => 'DOING',
  903. 'order_return_category' => '会员权益退款',
  904. 'order_return_apply_datetime' => date('Y-m-d H:i:s'),
  905. 'order_return_apply_json' => json_encode($data),
  906. 'order_return_addtimes' => time()
  907. ]);
  908. } catch (\Exception $e) {
  909. return json_fail("创建退款记录失败");
  910. }
  911. }
  912. public function roleBenefitRefund(Request $request)
  913. {
  914. $memberId = $request->post('member_id');
  915. if (!$memberId) {
  916. return json_fail('参数异常');
  917. }
  918. $returnOrder = OrderReturn::where('join_return_member_id', $memberId)
  919. ->where('order_return_status', 'DOING')
  920. ->where('order_return_category', '会员权益退款')
  921. ->first();
  922. if (!$returnOrder) {
  923. return json_fail("退款数据异常");
  924. }
  925. $memberAccount = MemberAccount::where('join_account_member_id', $memberId)
  926. ->where('member_account_classify', 'CASH')
  927. ->where('member_account_status', 'ACTIVED')
  928. ->first();
  929. if (!$memberAccount) {
  930. return json_fail('会员账户异常');
  931. }
  932. try {
  933. Db::beginTransaction();
  934. $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
  935. $amount = $refundApplyJson['amount'];
  936. $refundApplyJson['user_id'] = JwtToken::getCurrentId();
  937. $refundApplyJson['datetime'] = date('Y-m-d H:i:s');
  938. $returnOrder->order_return_refund_json = json_encode($refundApplyJson);
  939. $returnOrder->order_return_status = 'DONE';
  940. $returnOrder->save();
  941. // 账户剩余
  942. if ($memberAccount->member_account_surplus + $memberAccount->member_account_added < $amount) {
  943. throw new BusinessException("账户余额不足");
  944. }
  945. // 本金
  946. if ($memberAccount->member_account_surplus >= $amount) {
  947. $memberAccount->member_account_surplus = $memberAccount->member_account_surplus - $amount;
  948. } else {
  949. $memberAccount->member_account_added = $memberAccount->member_account_added - ($amount - $memberAccount->member_account_surplus);
  950. $memberAccount->member_account_surplus = 0;
  951. }
  952. $memberAccount->save();
  953. // 删除会员身份
  954. Member::where('member_id', $memberId)
  955. ->update([
  956. 'join_member_role_id' => '',
  957. 'member_role_begintime' => '',
  958. 'member_role_config_json' => '[]'
  959. ]);
  960. // 没用的优惠券失效
  961. CouponDetail::where('join_coupon_detail_member_id', $memberId)
  962. ->where('coupon_detail_status', '<>', 'USED')
  963. ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
  964. ->update([
  965. 'coupon_detail_status' => 'DISABLED'
  966. ]);
  967. // 产生一条退款记录 (pay_detail)
  968. PayDetail::insert([
  969. 'join_pay_member_id' => $memberId,
  970. 'join_pay_order_id' => 'ROLE_REFUND',
  971. 'join_pay_object_json' => '[]',
  972. 'pay_status' => 'SUCCESS',
  973. 'pay_category' => 'ROLE_REFUND',
  974. 'pay_amount' => $amount,
  975. 'pay_paytimes' => date('Y-m-d H:i:s'),
  976. 'pay_prepayid' => $memberId . '-CASH',
  977. 'pay_addtimes' => time()
  978. ]);
  979. Db::commit();
  980. return json_success('success');
  981. } catch (BusinessException $e) {
  982. Db::rollBack();
  983. return json_fail($e->getMessage());
  984. } catch (\Exception $e) {
  985. Db::rollBack();
  986. return json_fail('退款失败');
  987. }
  988. }
  989. }