MemberController.php 48 KB

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