MemberCancel.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\membercancel\model;
  11. use addon\fenxiao\model\Fenxiao;
  12. use addon\fenxiao\model\FenxiaoOrder;
  13. use app\model\BaseModel;
  14. use app\model\member\Config as ConfigModel;
  15. use app\model\message\Message;
  16. use app\model\message\Sms;
  17. use app\model\order\OrderCommon;
  18. use app\model\order\OrderRefund;
  19. use app\model\shop\ShopAcceptMessage;
  20. use addon\wechat\model\Message as WechatMessage;
  21. use think\facade\Cache;
  22. /**
  23. * 会员注销
  24. */
  25. class MemberCancel extends BaseModel
  26. {
  27. /**
  28. * 申请注销
  29. * @param $member_id
  30. * @param $site_id
  31. * @return array
  32. */
  33. public function applyMemberCancel($param)
  34. {
  35. //获取注销配置
  36. $config_model = new ConfigModel();
  37. $config_info = $config_model->getCancelConfig($param[ 'site_id' ], 'shop');
  38. $value = $config_info[ 'data' ][ 'value' ];
  39. if ($value[ 'is_enable' ] == 0) {
  40. return $this->error('', '未开放注销');
  41. }
  42. //获取用户信息
  43. $member_info = model('member')->getInfo(
  44. [
  45. [ 'site_id', '=', $param[ 'site_id' ] ],
  46. [ 'member_id', '=', $param[ 'member_id' ] ],
  47. [ 'is_delete', '=', 0 ]
  48. ]
  49. );
  50. if (empty($member_info)) {
  51. return $this->error('', '会员不存在');
  52. }
  53. if ($member_info[ 'balance_withdraw_apply' ] > 0) {
  54. return $this->error('', '有余额正在提现中,请提现成功后在申请注销');
  55. }
  56. $member_json = json_encode($member_info);
  57. //判断是否申请过
  58. $member_cancel_info = model('member_cancel')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'member_id', '=', $param[ 'member_id' ] ] ]);
  59. if (!empty($member_cancel_info)) {
  60. if ($member_cancel_info[ 'status' ] != -1) {
  61. return $this->error('', '请勿重复申请注销');
  62. }
  63. }
  64. //判断是否有未完成的订单
  65. $order_condition = [
  66. [ 'site_id', '=', $param[ 'site_id' ] ],
  67. [ 'member_id', '=', $param[ 'member_id' ] ],
  68. [ 'order_status', 'in', [ 1, 3, 4 ] ]
  69. ];
  70. $order_count = model('order')->getCount($order_condition);
  71. if ($order_count > 0) {
  72. return $this->error('', '还有订单未完成,请等订单完成后在申请注销');
  73. }
  74. //分销
  75. $fenxiao_json = '';
  76. if (addon_is_exit('fenxiao', $param[ 'site_id' ]) == 1) {
  77. //获取分销商信息
  78. $fenxiao_info = model('fenxiao')->getInfo([ [ 'site_id', '=', $param[ 'site_id' ] ], [ 'member_id', '=', $param[ 'member_id' ] ] ]);
  79. if (!empty($fenxiao_info)) {
  80. if ($fenxiao_info[ 'account_withdraw_apply' ] > 0) {
  81. return $this->error('', '有分销佣金正在提现中,请提现成功后在申请注销');
  82. }
  83. //判断是否存在未结算的分销订单
  84. $fenxiao_condition = [
  85. [ 'site_id', '=', $param[ 'site_id' ] ],
  86. [ 'one_fenxiao_id|two_fenxiao_id|three_fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ],
  87. [ 'is_settlement', '=', 0 ]
  88. ];
  89. $fenxiao_order_count = model('fenxiao_order')->getCount($fenxiao_condition);
  90. if ($fenxiao_order_count > 0) {
  91. return $this->error('', '还有分销订单未结算,请等订单结算后在申请注销');
  92. }
  93. $fenxiao_json = json_encode($fenxiao_info);
  94. }
  95. }
  96. model('member_cancel')->startTrans();
  97. try {
  98. if (!empty($member_cancel_info)) {
  99. $id = $member_cancel_info[ 'id' ];
  100. $data = [
  101. 'status' => 0,
  102. 'audit_uid' => '',
  103. 'audit_username' => '',
  104. 'reason' => '',
  105. 'audit_time' => ''
  106. ];
  107. model('member_cancel')->update($data, [ [ 'id', '=', $id ] ]);
  108. } else {
  109. $data = [
  110. 'member_id' => $member_info[ 'member_id' ],
  111. 'site_id' => $param[ 'site_id' ],
  112. 'username' => $member_info[ 'username' ],
  113. 'mobile' => $member_info[ 'mobile' ],
  114. 'nickname' => $member_info[ 'nickname' ],
  115. 'create_time' => time(),
  116. 'member_json' => $member_json,
  117. 'fenxiao_json' => $fenxiao_json
  118. ];
  119. $id = model('member_cancel')->add($data);
  120. }
  121. //审核开关关闭
  122. if ($value[ 'is_audit' ] == 0) {
  123. //todo 调用审核成功接口
  124. $param[ 'id' ] = $id;
  125. $param[ 'audit_uid' ] = '';
  126. $param[ 'audit_username' ] = '';
  127. $res = $this->memberCancelAuditPass($param);
  128. if ($res[ 'code' ] < 0) {
  129. model('member_cancel')->rollback();
  130. return $res;
  131. }
  132. }
  133. model('member_cancel')->commit();
  134. //会员申请注销消息
  135. $message_model = new Message();
  136. $message_model->sendMessage([ 'keywords' => "USER_CANCEL_APPLY", 'member_id' => $member_info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
  137. $res[ 'is_audit' ] = $value[ 'is_audit' ];
  138. return $this->success($res);
  139. } catch (\Exception $e) {
  140. model('member_cancel')->rollback();
  141. return $this->error('', $e->getMessage());
  142. }
  143. }
  144. /**
  145. * 撤销申请注销
  146. * @param $member_id
  147. * @param $site_id
  148. * @return array
  149. */
  150. public function cancelApplyMemberCancel($member_id, $site_id)
  151. {
  152. $member_cancel_info = model('member_cancel')->getInfo(
  153. [
  154. [ 'member_id', '=', $member_id ],
  155. [ 'site_id', '=', $site_id ]
  156. ]
  157. );
  158. if (empty($member_cancel_info)) {
  159. return $this->error('', '数据不合法');
  160. }
  161. if ($member_cancel_info[ 'status' ] == 1) {
  162. return $this->error('', '数据不合法');
  163. }
  164. $res = model('member_cancel')->delete([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ] ]);
  165. return $this->success($res);
  166. }
  167. /**
  168. * 审核通过
  169. * @param $condition
  170. * @return array
  171. */
  172. public function memberCancelAuditPass($param)
  173. {
  174. $info = model('member_cancel')->getInfo([ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'member_id,status');
  175. if (empty($info)) {
  176. return $this->error('', '请核实数据后重试');
  177. }
  178. if ($info[ 'status' ] != 0) {
  179. return $this->error('', '该数据已审核,请勿重复审核');
  180. }
  181. model('member_cancel')->startTrans();
  182. try {
  183. //修改注销状态
  184. $data = [
  185. 'status' => 1,
  186. 'audit_uid' => $param[ 'audit_uid' ],
  187. 'audit_username' => $param[ 'audit_username' ],
  188. 'audit_time' => time()
  189. ];
  190. model('member_cancel')->update($data, [ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
  191. //删除会员信息
  192. model('member')->update([ 'is_delete' => 1, 'status' => 0 ], [ [ 'member_id', '=', $info[ 'member_id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
  193. Cache::set('member_blacklist_' . $param[ 'site_id' ], null);
  194. event('MemberCancel', [ 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
  195. model('member_cancel')->commit();
  196. //会员注销成功消息
  197. $message_model = new Message();
  198. $message_model->sendMessage([ 'keywords' => "USER_CANCEL_SUCCESS", 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
  199. return $this->success();
  200. } catch (\Exception $e) {
  201. model('member_cancel')->rollback();
  202. return $this->error('', $e->getMessage());
  203. }
  204. }
  205. /**
  206. * 审核拒绝
  207. * @param $param
  208. * @return array
  209. */
  210. public function memberCancelAuditRefuse($param)
  211. {
  212. $info = model('member_cancel')->getInfo([ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ], 'status,member_id');
  213. if (empty($info)) {
  214. return $this->error('', '请核实数据后重试');
  215. }
  216. if ($info[ 'status' ] != 0) {
  217. return $this->error('', '该数据已审核,请勿重复审核');
  218. }
  219. $data = [
  220. 'status' => -1,
  221. 'audit_uid' => $param[ 'audit_uid' ],
  222. 'audit_username' => $param[ 'audit_username' ],
  223. 'reason' => $param[ 'reason' ],
  224. 'audit_time' => time()
  225. ];
  226. $res = model('member_cancel')->update($data, [ [ 'id', '=', $param[ 'id' ] ], [ 'site_id', '=', $param[ 'site_id' ] ] ]);
  227. //会员注销失败消息
  228. $message_model = new Message();
  229. $message_model->sendMessage([ 'keywords' => "USER_CANCEL_FAIL", 'member_id' => $info[ 'member_id' ], 'site_id' => $param[ 'site_id' ] ]);
  230. return $this->success($res);
  231. }
  232. /**
  233. * 获取会员注销信息
  234. * @param array $condition
  235. * @param string $field
  236. * @return array
  237. */
  238. public function getMemberCancelInfo($condition = [], $field = '*')
  239. {
  240. $info = model('member_cancel')->getInfo($condition, $field);
  241. return $this->success($info);
  242. }
  243. /**
  244. * 获取会员注销分页列表
  245. * @param array $condition
  246. * @param int $page
  247. * @param int $page_size
  248. * @param string $order
  249. * @param string $field
  250. * @return array
  251. */
  252. public function getMemberCancelPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'id desc', $field = '*')
  253. {
  254. $list = model('member_cancel')->pageList($condition, $field, $order, $page, $page_size);
  255. return $this->success($list);
  256. }
  257. /**
  258. * 获取用户账户信息
  259. * @param $member_id
  260. * @param $site_id
  261. * @return array
  262. */
  263. public function getMemberAccountInfo($member_id, $site_id)
  264. {
  265. $data = [];
  266. //会员信息
  267. $member_info = model('member')->getInfo(
  268. [
  269. [ 'member_id', '=', $member_id ],
  270. [ 'site_id', '=', $site_id ],
  271. [ 'is_delete', '=', 0 ]
  272. ],
  273. 'is_fenxiao,point,balance,balance_money,balance_withdraw_apply'
  274. );
  275. $data[ 'member_info' ] = $member_info;
  276. //优惠券数量
  277. $data[ 'member_coupon_count' ] = model('promotion_coupon')->getCount(
  278. [
  279. [ 'member_id', '=', $member_id ],
  280. [ 'site_id', '=', $site_id ],
  281. [ 'state', '=', 1 ]
  282. ]
  283. );
  284. //订单待发货
  285. $data[ 'order_pay_count' ] = model('order')->getCount(
  286. [
  287. [ 'member_id', '=', $member_id ],
  288. [ 'site_id', '=', $site_id ],
  289. [ 'order_status', '=', OrderCommon::ORDER_PAY ]
  290. ]
  291. );
  292. //订单待收货
  293. $data[ 'order_delivery_count' ] = model('order')->getCount(
  294. [
  295. [ 'member_id', '=', $member_id ],
  296. [ 'site_id', '=', $site_id ],
  297. [ 'order_status', '=', OrderCommon::ORDER_DELIVERY ]
  298. ]
  299. );
  300. //订单待完成
  301. $data[ 'order_take_delivery_count' ] = model('order')->getCount(
  302. [
  303. [ 'member_id', '=', $member_id ],
  304. [ 'site_id', '=', $site_id ],
  305. [ 'order_status', '=', OrderCommon::ORDER_TAKE_DELIVERY ]
  306. ]
  307. );
  308. //退款订单
  309. $data[ 'order_refund_count' ] = model('order')->getCount(
  310. [
  311. [ 'member_id', '=', $member_id ],
  312. [ 'site_id', '=', $site_id ],
  313. [ 'refund_status', 'not in', [ 0, OrderRefund::REFUND_COMPLETE ] ]
  314. ]
  315. );
  316. //判断用户是否是分销商
  317. if ($member_info[ 'is_fenxiao' ] == 1 && addon_is_exit('fenxiao', $site_id)) {
  318. //分销商信息
  319. $fenxiao_model = new Fenxiao();
  320. $fenxiao_info = $fenxiao_model->getFenxiaoInfo(
  321. [
  322. [ 'member_id', '=', $member_id ],
  323. [ 'site_id', '=', $site_id ]
  324. ],
  325. 'account,account_withdraw,account_withdraw_apply,total_commission'
  326. );
  327. $data[ 'fenxiao_info' ] = $fenxiao_info[ 'data' ];
  328. //分销待结算订单
  329. $fenxiao_order_model = new FenxiaoOrder();
  330. $fenxiao_order_count = $fenxiao_order_model->getFenxiaoOrderCount(
  331. [
  332. [ 'member_id', '=', $member_id ],
  333. [ 'site_id', '=', $site_id ],
  334. [ 'is_settlement', '=', 0 ]
  335. ]
  336. );
  337. $data[ 'fenxiao_order_count' ] = $fenxiao_order_count[ 'data' ];
  338. }
  339. return $this->success($data);
  340. }
  341. /****************************************** 会员注销通知 start **********************************************/
  342. /**
  343. * 会员注销成功
  344. * @param $param
  345. * @return array
  346. */
  347. public function memberCancelSuccess($data)
  348. {
  349. $member_cancel = model('member_cancel')->getInfo(
  350. [
  351. [ 'member_id', '=', $data[ 'member_id' ] ],
  352. [ 'site_id', '=', $data[ 'site_id' ] ]
  353. ]
  354. );
  355. if (empty($member_cancel)) {
  356. return $this->success();
  357. }
  358. $member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
  359. //发送短信
  360. $sms_model = new Sms();
  361. $name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
  362. $var_parse = array (
  363. "username" => $name,
  364. );
  365. $data[ "sms_account" ] = $member_info[ "mobile" ] ?? '';//手机号
  366. $data[ "var_parse" ] = $var_parse;
  367. $sms_result = $sms_model->sendMessage($data);
  368. return $this->success();
  369. }
  370. /**
  371. * 会员注销失败
  372. * @param $param
  373. * @return array
  374. */
  375. public function memberCancelFail($data)
  376. {
  377. $member_cancel = model('member_cancel')->getInfo(
  378. [
  379. [ 'member_id', '=', $data[ 'member_id' ] ],
  380. [ 'site_id', '=', $data[ 'site_id' ] ]
  381. ]
  382. );
  383. if (empty($member_cancel)) {
  384. return $this->success();
  385. }
  386. $member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
  387. //发送短信
  388. $sms_model = new Sms();
  389. $name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
  390. $var_parse = array (
  391. "username" => $name,
  392. );
  393. $data[ "sms_account" ] = $member_info[ "mobile" ] ?? '';//手机号
  394. $data[ "var_parse" ] = $var_parse;
  395. $sms_result = $sms_model->sendMessage($data);
  396. return $this->success();
  397. }
  398. /**
  399. * 会员注销申请通知(店铺)
  400. * @param $data
  401. * @return array
  402. */
  403. public function memberCancelApply($data)
  404. {
  405. $member_cancel = model('member_cancel')->getInfo(
  406. [
  407. [ 'member_id', '=', $data[ 'member_id' ] ],
  408. [ 'site_id', '=', $data[ 'site_id' ] ]
  409. ]
  410. );
  411. if (empty($member_cancel)) {
  412. return $this->success();
  413. }
  414. $member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ] ], 'username,mobile,nickname');
  415. $name = $member_info[ "nickname" ] == '' ? $member_info[ "mobile" ] : $member_info[ "nickname" ];
  416. //发送短信
  417. $sms_model = new Sms();
  418. $var_parse = array (
  419. "username" => $name,
  420. );
  421. // $site_id = $data['site_id'];
  422. // $shop_info = model("shop")->getInfo([["site_id", "=", $site_id]], "mobile,email");
  423. // $message_data["sms_account"] = $shop_info["mobile"];//手机号
  424. $data[ "var_parse" ] = $var_parse;
  425. $shop_accept_message_model = new ShopAcceptMessage();
  426. $result = $shop_accept_message_model->getShopAcceptMessageList();
  427. $list = $result[ 'data' ];
  428. if (!empty($list)) {
  429. foreach ($list as $v) {
  430. $message_data = $data;
  431. $message_data[ "sms_account" ] = $v[ "mobile" ];//手机号
  432. $sms_model->sendMessage($message_data);
  433. if ($v[ 'wx_openid' ] != '') {
  434. $wechat_model = new WechatMessage();
  435. $data[ "openid" ] = $v[ 'wx_openid' ];
  436. $data[ "template_data" ] = [
  437. 'keyword1' => $name,
  438. 'keyword2' => $member_info[ 'mobile' ]
  439. ];
  440. $data[ "page" ] = "";
  441. $wechat_model->sendMessage($data);
  442. }
  443. }
  444. }
  445. }
  446. /****************************************** 会员注销通知 end ************************************************/
  447. }