MemberController.php 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232
  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. foreach ($rows as $row) {
  849. $sheets = OrderSheet::with([
  850. 'goods' => function ($query) {
  851. $query->select('goods_id', 'goods_name');
  852. }
  853. ])->where('join_sheet_order_id', $row['order_id'])
  854. ->get()
  855. ->toArray();
  856. $deng = "";
  857. if (count($sheets) > 1) {
  858. $deng = '等';
  859. }
  860. foreach ($row['pay_detail'] as $item) {
  861. if (!empty($item['join_pay_object_json'])) {
  862. $payObjectJson = json_decode($item['join_pay_object_json'], true);
  863. if ($payObjectJson['order_id'] != $row['order_id']) {
  864. continue;
  865. }
  866. }
  867. $data[] = [
  868. 'order_classify' => OrderService::$orderClassify[$row['order_classify']],
  869. 'order_id' => $row['order_id'],
  870. 'goods_name' => !empty($sheets[0]) && !empty($sheets[0]['goods']) ? ($sheets[0]['goods']['goods_name'] . $deng) : '',
  871. 'order_amount_total' => $row['order_amount_total'],
  872. 'order_amount_pay' => $row['order_amount_pay'],
  873. 'pay_paytimes' => $item['pay_paytimes'] ?? "",
  874. 'order_addtimes' => $row['order_addtimes'],
  875. 'pay_amount' => $item['pay_amount']
  876. ];
  877. }
  878. }
  879. return json_success('success', $data);
  880. }
  881. /**
  882. * @Desc 获取权益使用记录
  883. * @Author Gorden
  884. * @Date 2024/10/15 11:35
  885. *
  886. * @param $memberId
  887. * @param $orderIds
  888. * @return array
  889. */
  890. public function getRoleBenefitUsedList($memberId, $orderIds = [])
  891. {
  892. $couponDetails = CouponDetail::where('join_coupon_detail_member_id', $memberId)
  893. ->where('coupon_detail_status', 'USED')
  894. ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
  895. ->get()
  896. ->toArray();
  897. $data = [];
  898. foreach ($couponDetails as $couponDetail) {
  899. $orders = Order::where('order_discount_json', 'like', '%' . $couponDetail['coupon_detail_id'] . '%')
  900. ->whereIn('order_is_complete', ['Y', 'N'])
  901. ->where('order_status_payment', 'SUCCESS')
  902. ->when(!empty($orderIds), function ($query) use ($orderIds) {
  903. $query->whereIn('order_id', $orderIds);
  904. })->get()
  905. ->toArray();
  906. foreach ($orders as $order) {
  907. $sheets = OrderSheet::with([
  908. 'goods' => function ($query) {
  909. $query->select('goods_id', 'goods_name');
  910. }
  911. ])->where('join_sheet_order_id', $order['order_id'])
  912. ->get()
  913. ->toArray();
  914. $deng = "";
  915. if (count($sheets) > 1) {
  916. $deng = '等';
  917. }
  918. $discountJson = json_decode($order['order_discount_json'], true);
  919. $couponName = '';
  920. $discountAmount = 0;
  921. foreach ($discountJson as $item) {
  922. $discountAmount = $item['coupon_value'];
  923. $couponName = Coupon::where('coupon_id', $item['coupon_id'])->value('coupon_name');
  924. }
  925. $payDetailTimes = PayDetail::whereJsonContains('join_pay_object_json->order_id', $order['order_id'])->value('pay_paytimes');
  926. $data[] = [
  927. 'order_id' => $order['order_id'],
  928. 'goods_name' => !empty($sheets[0]) && !empty($sheets[0]['goods']) ? ($sheets[0]['goods']['goods_name'] . $deng) : '',
  929. 'order_classify' => $order['order_classify'],
  930. 'order_amount_total' => $order['order_amount_total'],
  931. 'order_amount_pay' => $order['order_amount_pay'],
  932. 'coupon_name' => $couponName,
  933. 'discountAmount' => $discountAmount,
  934. 'order_status_system' => $order['order_status_system'],
  935. 'order_addtimes' => $order['order_addtimes'],
  936. 'pay_paytimes' => $payDetailTimes
  937. ];
  938. }
  939. }
  940. return $data;
  941. }
  942. public function roleBenefitExport(Request $request)
  943. {
  944. $orderIds = $request->post('order_id', []);
  945. $memberId = $request->post('member_id');
  946. $applyUsername = $request->post('apply_username', '');
  947. $applyMobile = $request->post('apply_mobile', '');
  948. $applyAmount = $request->post('apply_amount', '');
  949. if (!$memberId) {
  950. return json_fail("参数异常");
  951. }
  952. $data = $this->getRoleBenefitUsedList($memberId, $orderIds);
  953. $dicountAmount = 0;
  954. foreach ($data as $key => $item) {
  955. $data[$key]['order_classify'] = OrderService::$orderClassify[$item['order_classify']];
  956. $dicountAmount += $item['discountAmount'];
  957. }
  958. $returnApplayData['data'] = $data;
  959. $returnApplayData['amount'] = $applyAmount;
  960. $returnApplayData['apply_username'] = $applyUsername;
  961. $returnApplayData['apply_mobile'] = $applyMobile;
  962. $returnApplayData['reason'] = "会员权益退款";
  963. $data[] = [
  964. 'discountAmount' => '优惠合计:¥' . sprintf('%.2f', $dicountAmount)
  965. ];
  966. // $data[] = [
  967. // 'order_classify' => '申请人:' . $applyUsername,
  968. // ];
  969. // $data[] = [
  970. // 'order_classify' => '电话:' . $applyMobile,
  971. // ];
  972. // $data[] = [
  973. // 'order_classify' => '退款金额:' . $applyAmount,
  974. // ];
  975. // 产生退款记录
  976. // $this->refundOrder($memberId, $returnApplayData);
  977. return json_success('success', $data);
  978. }
  979. public function refundOrder(Request $request)
  980. {
  981. $params = $request->post();
  982. Db::beginTransaction();
  983. try {
  984. // 查出所有的充值订单
  985. $orders = Order::where('join_order_member_id', $params['member_id'])
  986. ->where('order_classify', 'RECHARGE')
  987. ->where('order_is_complete', 'Y')
  988. ->get()
  989. ->toArray();
  990. $orderIds = array_column($orders, 'order_id');
  991. // 订单改为退款订单
  992. Order::whereIn('order_id', $orderIds)->update([
  993. 'order_is_complete' => 'R'
  994. ]);
  995. OrderReturn::where('join_return_member_id', $params['member_id'])
  996. ->where('order_return_status', '<>', 'DONE')
  997. ->where('order_return_category', '会员退款')
  998. ->delete();
  999. $returnApplyJson = [
  1000. 'reason' => '会员退款',
  1001. 'order_id' => $orderIds,
  1002. 'classify' => 'ROLE_REFUND',
  1003. 'username' => $params['username'],
  1004. 'mobile' => $params['mobile'],
  1005. 'surplus' => $params['surplus'],
  1006. 'added' => $params['added'],
  1007. 'bank_name' => $params['bank_name'],
  1008. 'bank_acount' => $params['bank_acount'],
  1009. 'bank_cardno' => $params['bank_cardno']
  1010. ];
  1011. // 退款记录
  1012. OrderReturn::insert([
  1013. 'join_order_return_user_id' => JwtToken::getCurrentId(),
  1014. 'join_return_member_id' => $params['member_id'],
  1015. 'join_return_order_id' => $orderIds[0],
  1016. 'order_return_status' => 'PENDING',
  1017. 'order_return_category' => '会员退款',
  1018. 'order_return_apply_datetime' => date('Y-m-d H:i:s'),
  1019. 'order_return_apply_json' => json_encode($returnApplyJson),
  1020. 'order_return_remark' => $params['remark'] ?? '',
  1021. 'order_return_addtimes' => time()
  1022. ]);
  1023. Db::commit();
  1024. return json_success("success");
  1025. } catch (\Exception $e) {
  1026. Db::rollBack();
  1027. Log::error("创建退款记录失败:" . $e->getMessage());
  1028. return json_fail("创建退款记录失败");
  1029. }
  1030. }
  1031. public function roleBenefitRefund(Request $request)
  1032. {
  1033. $memberId = $request->post('member_id');
  1034. if (!$memberId) {
  1035. return json_fail('参数异常');
  1036. }
  1037. $returnOrder = OrderReturn::where('join_return_member_id', $memberId)
  1038. ->where('order_return_status', 'DOING')
  1039. ->where('order_return_category', '会员权益退款')
  1040. ->first();
  1041. if (!$returnOrder) {
  1042. return json_fail("退款数据异常");
  1043. }
  1044. $memberAccount = MemberAccount::where('join_account_member_id', $memberId)
  1045. ->where('member_account_classify', 'CASH')
  1046. ->where('member_account_status', 'ACTIVED')
  1047. ->first();
  1048. if (!$memberAccount) {
  1049. return json_fail('会员账户异常');
  1050. }
  1051. try {
  1052. Db::beginTransaction();
  1053. $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
  1054. $amount = $refundApplyJson['amount'];
  1055. $refundApplyJson['user_id'] = JwtToken::getCurrentId();
  1056. $refundApplyJson['datetime'] = date('Y-m-d H:i:s');
  1057. $returnOrder->order_return_refund_json = json_encode($refundApplyJson);
  1058. $returnOrder->order_return_status = 'DONE';
  1059. $returnOrder->save();
  1060. // 账户剩余
  1061. if ($memberAccount->member_account_surplus + $memberAccount->member_account_added < $amount) {
  1062. throw new BusinessException("账户余额不足");
  1063. }
  1064. // 本金
  1065. if ($memberAccount->member_account_surplus >= $amount) {
  1066. $memberAccount->member_account_surplus = $memberAccount->member_account_surplus - $amount;
  1067. } else {
  1068. $memberAccount->member_account_added = $memberAccount->member_account_added - ($amount - $memberAccount->member_account_surplus);
  1069. $memberAccount->member_account_surplus = 0;
  1070. }
  1071. $memberAccount->save();
  1072. // 删除会员身份
  1073. Member::where('member_id', $memberId)
  1074. ->update([
  1075. 'join_member_role_id' => '',
  1076. 'member_role_begintime' => '',
  1077. 'member_role_config_json' => '[]'
  1078. ]);
  1079. // 没用的优惠券失效
  1080. CouponDetail::where('join_coupon_detail_member_id', $memberId)
  1081. ->where('coupon_detail_status', '<>', 'USED')
  1082. ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
  1083. ->update([
  1084. 'coupon_detail_status' => 'DISABLED'
  1085. ]);
  1086. // 产生一条退款记录 (pay_detail)
  1087. PayDetail::insert([
  1088. 'join_pay_member_id' => $memberId,
  1089. 'join_pay_order_id' => 'ROLE_REFUND',
  1090. 'join_pay_object_json' => '[]',
  1091. 'pay_status' => 'SUCCESS',
  1092. 'pay_category' => 'ROLE_REFUND',
  1093. 'pay_amount' => $amount,
  1094. 'pay_paytimes' => date('Y-m-d H:i:s'),
  1095. 'pay_prepayid' => $memberId . '-CASH',
  1096. 'pay_addtimes' => time()
  1097. ]);
  1098. Db::commit();
  1099. return json_success('success');
  1100. } catch (BusinessException $e) {
  1101. Db::rollBack();
  1102. return json_fail($e->getMessage());
  1103. } catch (\Exception $e) {
  1104. Db::rollBack();
  1105. return json_fail('退款失败');
  1106. }
  1107. }
  1108. }