MemberController.php 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/2
  6. * Time: 下午2:03
  7. */
  8. namespace app\backend\modules\member\controllers;
  9. use app\backend\modules\charts\modules\phone\models\PhoneAttribution;
  10. use app\backend\modules\charts\modules\phone\services\PhoneAttributionService;
  11. use app\backend\modules\member\models\McMappingFans;
  12. use app\backend\modules\member\models\Member;
  13. use app\backend\modules\member\models\MemberChildren;
  14. use app\backend\modules\member\models\MemberGroup;
  15. use app\backend\modules\member\models\MemberLevel;
  16. use app\backend\modules\member\models\MemberParent;
  17. use app\backend\modules\member\models\MemberRecord;
  18. use app\backend\modules\member\models\MemberShopInfo;
  19. use app\backend\modules\member\models\MemberUnique;
  20. use app\backend\modules\member\services\HandleNickname;
  21. use app\common\events\member\MergeMemberEvent;
  22. use app\common\exceptions\ShopException;
  23. use app\common\models\member\MemberMerge;
  24. use app\common\services\credit\ConstService;
  25. use app\common\services\finance\BalanceChange;
  26. use app\common\services\finance\PointService;
  27. use app\common\services\member\MemberMergeService;
  28. use app\common\services\Session;
  29. use app\backend\modules\member\services\FansItemService;
  30. use app\frontend\modules\member\services\MemberService;
  31. use app\common\components\BaseController;
  32. use app\common\events\member\MemberDelEvent;
  33. use app\common\events\member\MemberLevelUpgradeEvent;
  34. use app\common\events\member\MemberRelationEvent;
  35. use app\common\exceptions\AppException;
  36. use app\common\facades\Setting;
  37. use app\common\helpers\Cache;
  38. use app\common\helpers\PaginationHelper;
  39. use app\common\helpers\Url;
  40. use app\common\models\Member as Members;
  41. use app\common\models\member\MemberChangeMobileLog;
  42. use app\common\models\member\MemberMergeLog;
  43. use app\common\models\member\ParentOfMember;
  44. use app\common\models\MemberAlipay;
  45. use app\common\models\MemberGroup as Member_Group;
  46. use app\common\models\MemberMiniAppModel;
  47. use app\common\models\MemberShopInfo as MemberShop_Info;
  48. use app\common\models\MemberWechatModel;
  49. use app\common\services\ExportService;
  50. use app\frontend\modules\member\models\MemberModel;
  51. use app\frontend\modules\member\models\SubMemberModel;
  52. use app\frontend\modules\member\models\SubMemberModel as SubMember_Model;
  53. use app\Jobs\ChangeMemberRelationJob;
  54. use app\Jobs\ModifyRelationshipChainJob;
  55. use Illuminate\Support\Facades\DB;
  56. use Illuminate\Support\Str;
  57. use Yunshop\Love\Common\Models\MemberLove;
  58. use Yunshop\Love\Common\Services\LoveChangeService;
  59. use Yunshop\MemberTags\Common\models\MemberTagsModel;
  60. use Yunshop\TeamDividend\models\TeamDividendLevelModel;
  61. use Illuminate\Support\Facades\Schema;
  62. use app\common\events\member\MemberLevelDemotionEvent;
  63. class MemberController extends BaseController
  64. {
  65. private $pageSize = 20;
  66. protected $publicAction = ['addMember'];
  67. protected $ignoreAction = ['addMember'];
  68. private $exportRoute = "member.member.index";
  69. public function index()
  70. {
  71. $set = Setting::getByGroup('pay_password') ?: [];
  72. $member_tag = [];
  73. if (app('plugins')->isEnabled('member-tags')) {
  74. $member_tag = MemberTagsModel::uniacid()->select(['id','title','type'])->get();
  75. }
  76. $groups = MemberGroup::uniacid()->select(['id','group_name'])->get();
  77. $levels = MemberLevel::uniacid()->select(['id','level','level_name'])->get();
  78. return view('member.index', [
  79. 'is_verify' => !empty($set['withdraw_verify']['is_member_export_verify'])?true:false,
  80. 'expire_time' => Session::get('withdraw_verify')?:null,
  81. 'verify_phone' => $set['withdraw_verify']['phone']?:"",
  82. 'verify_expire' => $set['withdraw_verify']['verify_expire']?intval($set['withdraw_verify']['verify_expire']):10,
  83. 'member_tag' => $member_tag,
  84. 'groups' => $groups,
  85. 'levels' => $levels,
  86. ])->render();
  87. }
  88. public function show()
  89. {
  90. $parames = \YunShop::request();
  91. $list = Member::searchNewMembers($parames);
  92. if ($parames['search']['first_count'] ||
  93. $parames['search']['second_count'] ||
  94. $parames['search']['third_count'] ||
  95. $parames['search']['team_count']
  96. ) {
  97. //------------------new-------------------
  98. $result_ids = [];
  99. if ($parames['search']['first_count']) {
  100. $result_ids = $this->getChildCount($parames['search']['first_count'], 1);
  101. }
  102. if ($parames['search']['second_count']) {
  103. $second_ids = $this->getChildCount($parames['search']['second_count'], 2);
  104. $result_ids = empty($result_ids) ? $second_ids : array_intersect($result_ids, $second_ids);
  105. unset($second_ids);
  106. }
  107. if ($parames['search']['third_count']) {
  108. $third_ids = $this->getChildCount($parames['search']['third_count'], 3);
  109. $result_ids = empty($result_ids) ? $third_ids : array_intersect($result_ids, $third_ids);
  110. unset($third_ids);
  111. }
  112. if ($parames['search']['team_count']) {
  113. $team_ids = $this->getChildCount($parames['search']['team_count']);
  114. $result_ids = empty($result_ids) ? $team_ids : array_intersect($result_ids, $team_ids);
  115. unset($team_ids);
  116. }
  117. $list = $list->whereIn('uid', $result_ids);
  118. }
  119. $list = $list->orderBy('uid', 'desc')
  120. ->paginate($this->pageSize)
  121. ->toArray();
  122. foreach ($list['data'] as $key => $item) {
  123. $list['data'][$key]['createtime'] = date('Y-m-d H:i:s', $item['createtime']);
  124. }
  125. $is_customers = 0;
  126. if (app('plugins')->isEnabled('wechat-customers')) {
  127. $is_customers = 1;
  128. }
  129. $is_member_tags = 0;
  130. if (app('plugins')->isEnabled('member-tags')) {
  131. $res = array_pluck(Setting::getAllByGroup('member-tags')->toArray(), 'value', 'key');
  132. if ($res['is_open'] == 1) $is_member_tags = 1;
  133. }
  134. $list = (new FansItemService())->setFansItem($list);
  135. $level = MemberLevel::uniacid()->select('id', 'level', 'level_name')->get()->toArray();
  136. $member_group = MemberGroup::uniacid()->select('id', 'group_name')->get()->toArray();
  137. $shop_set = \Setting::get('shop.member');
  138. $level[] = [
  139. 'id' => 0,
  140. 'level' => 0,
  141. 'level_name' => $shop_set['level_name'] ?: '普通会员',
  142. ];
  143. $member_group[] = [
  144. 'id' => 0,
  145. 'group_name' => '无分组'
  146. ];
  147. $datas = [
  148. 'list' => $list,
  149. 'rest' => [
  150. 'default_level_name' => $shop_set['level_name'] ?: '普通会员',
  151. 'total' => $list['current_page'] <= $list['last_page'] ? $list['total'] : 0,
  152. 'opencommission' => 1,
  153. 'is_customers' => $is_customers,
  154. 'is_member_tags' => $is_member_tags,
  155. ],
  156. 'level' => $level,
  157. 'member_group' => $member_group
  158. ];
  159. return $this->successJson('ok', $datas);
  160. }
  161. /**
  162. * 获取$level级下线人数超过$countNum的会员id
  163. * @param int $countNum
  164. * @param string $level
  165. * @return array
  166. */
  167. public function getChildCount($countNum = 0, $level = '')
  168. {
  169. $model = MemberChildren::uniacid()->select(DB::raw('member_id,COUNT(*) as count_num'));
  170. if (!empty($level)) {
  171. $model->where('level', $level);
  172. }
  173. $ids = $model->groupBy('member_id')->having('count_num', '>=', $countNum)
  174. ->get()->toArray();
  175. return array_column($ids, 'member_id');
  176. }
  177. //会员下线导出
  178. public function doExport()
  179. {
  180. if (!$this->checkVerify()) {
  181. return $this->message('二次校验失败','','error');
  182. }
  183. $export_page = request()->export_page ? request()->export_page : 1;
  184. //清除之前没有导出的文件
  185. if ($export_page == 1) {
  186. $fileNameArr = file_tree(storage_path('exports'));
  187. foreach ($fileNameArr as $val) {
  188. if (file_exists(storage_path('exports/' . basename($val)))) {
  189. unlink(storage_path('exports/') . basename($val)); // 路径+文件名称
  190. }
  191. }
  192. }
  193. $request = \YunShop::request();
  194. $member_info = Member::getUserInfos($request->id)->first();
  195. if (empty($member_info)) {
  196. return $this->message('会员不存在', '', 'error');
  197. }
  198. $list = Member::getAgentInfoByMemberId($request);
  199. if ($list->get()->isEmpty()) {
  200. return $this->message('订单导出数据为空', '', 'error');
  201. }
  202. $export_model = new ExportService($list, $export_page);
  203. if (!$export_model->builder_model->isEmpty()) {
  204. $file_name = date('Ymdhis', time()) . '订单导出';//返现记录导出
  205. $export_data[0] = ['会员ID', '推荐人', '粉丝', '姓名', '手机号码', '状态', '下线状态', '注册时间', '关注'];
  206. $status_name = [
  207. 0 => "未审核",
  208. 1 => "审核中",
  209. 2 => "已审核"
  210. ];
  211. $inviter_name = [
  212. 0 => "暂定下线",
  213. 1 => "锁定关系下线"
  214. ];
  215. foreach ($export_model->builder_model->toArray() as $key => $value) {
  216. if (empty($value['has_one_fans']['followed'])) {
  217. if (empty($value['has_one_fans']['uid'])) {
  218. $follow = "未关注";
  219. } else {
  220. $follow = "取消关注";
  221. }
  222. } else {
  223. $follow = "已关注";
  224. }
  225. $export_data[$key + 1] = [
  226. $value['uid'],
  227. $value['yz_member']['agent']['nickname'],
  228. $value['nickname'],
  229. $value['realname'],
  230. $value['mobile'],
  231. $value['yz_member']['is_agent'] == 0 ? "-" : $status_name[$value["yz_member"]['status']],
  232. $inviter_name[$value['yz_member']['inviter']],
  233. date("Y-m-d H:i", $value['createtime']),
  234. $follow
  235. ];
  236. }
  237. $export_model->export($file_name, $export_data, 'member.member.agent-old');
  238. }
  239. }
  240. /**
  241. * 加载模板 -- 添加会员
  242. * @return string
  243. * @throws \Throwable
  244. */
  245. public function addMember()
  246. {
  247. return view('member.add-member', [])->render();
  248. }
  249. public function addMemberData()
  250. {
  251. $item = request()->item;
  252. $mobile = \YunShop::request()['mobile'];
  253. $password = \YunShop::request()['password'];
  254. $uniacid = \YunShop::app()->uniacid;
  255. $member = Setting::get('shop.member');
  256. //获取图片
  257. $member_set = \Setting::get('shop.member');
  258. if (isset($member_set) && $member_set['headimg']) {
  259. $avatar = yz_tomedia($member_set['headimg']);
  260. } else {
  261. $avatar = Url::shopUrl('static/images/photo-mr.jpg');
  262. }
  263. if ((\Request::getMethod() == 'POST') && ($item == 1)) {
  264. //判断是否已注册
  265. $member_info = MemberModel::getId($uniacid, $mobile);
  266. if (!empty($member_info)) {
  267. throw new AppException('该手机号已被注册');
  268. }
  269. //添加mc_members表
  270. $default_groupid = Member_Group::getDefaultGroupId($uniacid)->first();
  271. $data = array(
  272. 'uniacid' => $uniacid,
  273. 'mobile' => $mobile,
  274. 'groupid' => $default_groupid->id ? $default_groupid->id : 0,
  275. 'createtime' => time(),
  276. 'nickname' => $mobile,
  277. 'avatar' => $avatar,
  278. 'gender' => 0,
  279. 'residecity' => '',
  280. );
  281. //随机数
  282. $data['salt'] = Str::random(8);
  283. //加密
  284. $data['password'] = md5($password . $data['salt']);
  285. $memberModel = MemberModel::create($data);
  286. $member_id = $memberModel->uid;
  287. //手机归属地查询插入
  288. $phoneData = file_get_contents((new PhoneAttributionService())->getPhoneApi($mobile));
  289. $phoneArray = json_decode($phoneData);
  290. $phone['uid'] = $member_id;
  291. $phone['uniacid'] = $uniacid;
  292. $phone['province'] = $phoneArray->data->province;
  293. $phone['city'] = $phoneArray->data->city;
  294. $phone['sp'] = $phoneArray->data->sp;
  295. $phoneModel = new PhoneAttribution();
  296. $phoneModel->updateOrCreate(['uid' => $member_id], $phone);
  297. //默认分组表
  298. //添加yz_member表
  299. $default_sub_group_id = Member_Group::getDefaultGroupId()->first();
  300. if (!empty($default_sub_group_id)) {
  301. $default_subgroup_id = $default_sub_group_id->id;
  302. } else {
  303. $default_subgroup_id = 0;
  304. }
  305. $sub_data = array(
  306. 'member_id' => $member_id,
  307. 'uniacid' => $uniacid,
  308. 'group_id' => $default_subgroup_id,
  309. 'level_id' => 0,
  310. 'invite_code' => \app\frontend\modules\member\models\MemberModel::generateInviteCode(),
  311. 'system_type' => 'pc',
  312. 'parent_id' => 0,
  313. 'inviter' => 1,
  314. );
  315. //添加用户子表
  316. SubMember_Model::insertData($sub_data);
  317. $record_data = [
  318. 'uid' => $member_id,
  319. 'parent_id' => 0,
  320. 'after_parent_id' => 0,
  321. 'status' => 1,
  322. 'uniacid' => \YunShop::app()->uniacid
  323. ];
  324. //记录
  325. MemberRecord::create($record_data);
  326. $password = $data['password'];
  327. $member_info = MemberModel::getUserInfo($uniacid, $mobile, $password)->first();
  328. $yz_member = MemberShop_Info::getMemberShopInfo($member_id)->toArray();
  329. $data = MemberModel::userData($member_info, $yz_member);
  330. return $this->successJson('添加用户成功', ['data' => true]);
  331. }
  332. if (empty($member['headimg'])) {
  333. $val = static_url('resource/images/nopic.jpg');
  334. $headimg = yz_tomedia($val);
  335. } else {
  336. $headimg = yz_tomedia($member['headimg']);
  337. }
  338. return $this->successJson('ok', ['img' => $headimg]);
  339. }
  340. public function import()
  341. {
  342. return view('member.import')->render();
  343. }
  344. public function memberExcelDemo()
  345. {
  346. $exportData['0'] = ['手机号', '密码'];
  347. $file_name = '会员批量导入模板';
  348. app('excel')->store(new \app\exports\FromArray($exportData), $file_name . '.xlsx', 'export');
  349. app('excel')->download(new \app\exports\FromArray($exportData), $file_name . '.xlsx')->send();
  350. }
  351. public function memberExcel()
  352. {
  353. $data = request()->input();
  354. $uniacid = \YunShop::app()->uniacid;
  355. //excel 本身就重复的值
  356. if (!$data['data']['0']['手机号']) {
  357. $this->errorJson('第一项开头必须为手机号');
  358. }
  359. if (!$data['data']['0']['密码']) {
  360. $this->errorJson('第二项开头必须为密码');
  361. }
  362. $data = array_column($data['data'], null, '手机号');
  363. foreach ($data['data'] as $key => $value) {
  364. if (!preg_match("/^1[3456789]{1}\d{9}$/", $value['手机号'])) {
  365. unset($data[$key]);
  366. }
  367. }
  368. $phone = array_keys($data);
  369. $phones = MemberModel::uniacid()->select('mobile')->whereIn('mobile', $phone)->pluck('mobile');
  370. if (!empty($phones)) {
  371. // 存在重复值 取交集
  372. $repeatPhone = array_intersect($phone, $phones->toArray());
  373. //删除重复值
  374. foreach ($repeatPhone as $value) {
  375. if (isset($data[$value])) {
  376. unset($data[$value]);
  377. }
  378. }
  379. if (empty($data)) {
  380. return $this->errorJson('表格所有信息已存在,请勿重复导入!');
  381. }
  382. }
  383. $defaultGroupId = Member_Group::getDefaultGroupId()->first();
  384. $defaultSubGroupId = $defaultGroupId->id ?: 0;
  385. //整理数据入库
  386. $i = 0;
  387. $array = array();
  388. //获取图片
  389. $memberSet = \Setting::get('shop.member');
  390. \Log::info('member_set', $memberSet);
  391. if (isset($memberSet) && $memberSet['headimg']) {
  392. $avatar = yz_tomedia($memberSet['headimg']);
  393. } else {
  394. $avatar = Url::shopUrl('static/images/photo-mr.jpg');
  395. }
  396. foreach ($data as $v) {
  397. $salt = Str::random(8);
  398. $array[$i] = [
  399. 'uniacid' => $uniacid,
  400. 'mobile' => $v['手机号'],
  401. 'groupid' => $defaultSubGroupId,
  402. 'createtime' => $_SERVER['REQUEST_TIME'],
  403. 'nickname' => $v['手机号'],
  404. 'avatar' => $avatar,
  405. 'gender' => 0,
  406. 'residecity' => '',
  407. 'salt' => $salt,
  408. 'password' => md5($v['密码'] . $salt),
  409. ];
  410. $i++;
  411. }
  412. if (!MemberModel::insert($array)) {
  413. return $this->errorJson('批量添加失败');
  414. }
  415. //todo 批量插入同时无法返回主键ID故查询一次
  416. $idArray = MemberModel::uniacid()->select('uid', 'mobile')->whereIn('mobile', array_keys($data))->get();
  417. $subData = [];
  418. $change_log = [];
  419. foreach ($idArray as $key => $value) {
  420. $subData[$key] = array(
  421. 'member_id' => $value->uid,
  422. 'uniacid' => $uniacid,
  423. 'group_id' => $defaultSubGroupId,
  424. 'level_id' => 0,
  425. 'parent_id' => 0,
  426. 'inviter' => 1,
  427. 'invite_code' => \app\frontend\modules\member\models\MemberModel::generateInviteCode(),
  428. 'created_at' => $_SERVER['REQUEST_TIME'],
  429. 'updated_at' => $_SERVER['REQUEST_TIME']
  430. );
  431. $change_log[$key] = [
  432. 'uid' => $value->uid,
  433. 'parent_id' => 0,
  434. 'after_parent_id' => 0,
  435. 'status' => 1,
  436. 'uniacid' => \YunShop::app()->uniacid,
  437. 'created_at' => time(),
  438. 'updated_at' => time(),
  439. ];
  440. }
  441. if (SubMember_Model::insert($subData) && MemberRecord::insert($change_log)) {
  442. return $this->successJson('导入成功', ['data' => true]);
  443. } else {
  444. return $this->errorJson('导入失败');
  445. }
  446. }
  447. private function getResultIds(array $result_ids, $member_id, $compare, $compared, $is_added)
  448. {
  449. if ($compare < $compared) {
  450. ($is_added && !in_array($member_id, $result_ids)) && $result_ids[] = $member_id;
  451. } else {
  452. $key = array_search($member_id, $result_ids);
  453. $key !== false && array_splice($result_ids, $key, 1);
  454. }
  455. return $result_ids;
  456. }
  457. private function getMembersLower($memberId, $level = '')
  458. {
  459. $array = $level ? [$memberId, $level] : [$memberId];
  460. $condition = $level ? ' = ?' : '';
  461. return MemberShopInfo::select('member_id')->whereRaw('FIND_IN_SET(?,relation)' . $condition, $array)->count();
  462. }
  463. private function getMemberTeam($memberId)
  464. {
  465. $first = MemberShopInfo::select('member_id', 'parent_id')->where('parent_id', $memberId)->get();
  466. $result_ids = [];
  467. if ($first) {
  468. foreach ($first as $key => $member) {
  469. $result_ids[] = $member->member_id;
  470. $second = MemberShopInfo::select('member_id', 'parent_id')->where('parent_id', $member->member_id)->get();
  471. if ($second) {
  472. $ids = $this->getMemberTeamRecursion($second);
  473. $result_ids = array_merge($result_ids, $ids);
  474. }
  475. }
  476. }
  477. return count($result_ids);
  478. }
  479. private function getMemberTeamRecursion($memberIds)
  480. {
  481. $result_ids = [];
  482. foreach ($memberIds as $key => $member) {
  483. $result_ids[] = $member->member_id;
  484. $first = MemberShopInfo::select('member_id', 'parent_id')->where('parent_id', $member->member_id)->get();
  485. if ($first) {
  486. $ids = $this->getMemberTeamRecursion($first);
  487. $result_ids = array_merge($result_ids, $ids);
  488. }
  489. }
  490. return $result_ids;
  491. }
  492. /**
  493. * 详情
  494. *
  495. */
  496. public function detail()
  497. {
  498. $exists_groupId = false;
  499. $uid = \YunShop::request()->id ? intval(\YunShop::request()->id) : 0;
  500. $type = request()->type ? 1 : 0; //用来判断返回模板还是json数据
  501. if ($uid == 0 || !is_int($uid)) {
  502. $this->message('参数错误', '', 'error');
  503. exit;
  504. }
  505. $member = Member::getMemberDetailBlackById($uid);
  506. if (!$member) {
  507. $this->message('该会员已被删除或者已注销', '', 'error');
  508. exit;
  509. }
  510. if (!$member->avatar) {
  511. if (Setting::get('shop.member')['headimg_url']) {
  512. $member->avatar = yz_tomedia(Setting::get('shop.member')['headimg_url']);
  513. } else {
  514. $member->avatar = yz_tomedia(Setting::get('shop.shop')['logo']);
  515. }
  516. }
  517. if (!$member->nickname && $member->mobile) {
  518. $member->nickname = substr($member->mobile, 0, 2) . '*******' . substr($member->mobile, -2);
  519. }
  520. $groups = MemberGroup::getMemberGroupList();
  521. $levels = MemberLevel::uniacid()->select('id', 'level', 'level_name')->get();
  522. $myform = [];
  523. if (!empty($member)) {
  524. $member = $member->toArray();
  525. if ($member['yz_member']['is_agent'] == 1 && $member['yz_member']['status'] == 2) {
  526. $member['agent'] = 1;
  527. } else {
  528. $member['agent'] = 0;
  529. }
  530. $member['createtime'] = date('Y-m-d H:i:s', $member['createtime']);
  531. $myform = json_decode($member['yz_member']['member_form'], true);
  532. }
  533. $set = \Setting::get('shop.member');
  534. if (empty($set['level_name'])) {
  535. $set['level_name'] = '普通会员';
  536. }
  537. if ($member['yz_member']['parent_id'] == 0) {
  538. $parent_name = '总店';
  539. } else {
  540. $parent = Member::getMemberById($member['yz_member']['parent_id']);
  541. $parent_name = $parent->nickname;
  542. }
  543. if (!$member['yz_member']['validity']) {
  544. $member['yz_member']['validity'] = 0;
  545. }
  546. foreach($groups as $rows) {
  547. if ($rows['id']== $member['yz_member']['group_id']) {
  548. $exists_groupId = true;
  549. }
  550. }
  551. if (!$exists_groupId) {
  552. $member['yz_member']['group_id'] = 0;
  553. }
  554. if ($type) {
  555. return $this->successJson('ok', [
  556. 'member' => $member,
  557. 'levels' => $levels,
  558. 'groups' => $groups,
  559. 'set' => $set,
  560. 'myform' => $myform,
  561. 'parent_name' => $parent_name
  562. ]);
  563. }
  564. return view('member.detail1', [
  565. 'member' => $member,
  566. 'levels' => $levels,
  567. 'groups' => $groups,
  568. 'set' => $set,
  569. 'myform' => $myform,
  570. 'parent_name' => $parent_name
  571. ])->render();
  572. }
  573. /**
  574. * 更新
  575. *
  576. */
  577. public function update()
  578. {
  579. $uid = request()->id;
  580. if ($uid == 0 || !is_numeric($uid)) {
  581. return $this->errorJson('参数错误');
  582. }
  583. $shopInfoModel = MemberShopInfo::getMemberShopInfo($uid) ?: new MemberShopInfo();
  584. $parame = request()->member;
  585. $invite_code = $parame['invite_code'];
  586. if ($invite_code == '') {
  587. $invite_code = '';
  588. } else {
  589. if (strlen($invite_code) != 8) {
  590. return $this->errorJson('会员邀请码8个字符');
  591. }
  592. /* if(preg_match("/^[a-zA-Z\s]+$/",$invite_code) || preg_match("/^[0-9\s]+$/",$invite_code)){
  593. return $this->message('会员邀请码必须大写字母拼加数字组成8个字符', '', 'error');
  594. }*/
  595. if (preg_match("/^[0-9a-zA-Z\s]+$/", $invite_code)) {
  596. $invite_code = strtoupper($invite_code);
  597. }
  598. $invite = MemberShopInfo::select('invite_code')
  599. ->where('invite_code', $invite_code)
  600. ->where('member_id', '!=', $uid)
  601. ->count();
  602. if ($invite) {
  603. return $this->errorJson('会员邀请码已存在或参数错误');
  604. }
  605. }
  606. $member_model = Member::find($uid);
  607. $member_model->widgets = $parame['widgets'];
  608. $member_model->realname = $parame['realname'];
  609. $member_model->nickname = $parame['nickname'];
  610. $member_model->avatar = $parame['avatar'];
  611. $member_model->save();
  612. // $mc = [
  613. // 'realname' => $parame['realname']
  614. // ];
  615. // Member::updateMemberInfoById($mc, $uid);
  616. $yz = [
  617. 'member_id' => $uid,
  618. 'wechat' => $parame['wechat'],
  619. 'uniacid' => \YunShop::app()->uniacid,
  620. 'level_id' => $parame['level_id'] ?: 0,
  621. 'group_id' => $parame['group_id'],
  622. 'alipayname' => $parame['alipayname'],
  623. 'alipay' => $parame['alipay'],
  624. 'is_black' => $parame['is_black'],
  625. 'content' => $parame['content'],
  626. 'custom_value' => $parame['custom_value'],
  627. 'validity' => $parame['validity'] ? $parame['validity'] : 0,
  628. 'invite_code' => $invite_code,
  629. ];
  630. if ($parame['agent']) {
  631. $yz['is_agent'] = 1;
  632. $yz['status'] = 2;
  633. $yz['agent_time'] = !empty($shopInfoModel->agent_time) ? $shopInfoModel->agent_time : time();
  634. if ($shopInfoModel->inviter == 0) {
  635. $shopInfoModel->inviter = 1;
  636. $shopInfoModel->parent_id = 0;
  637. }
  638. } else {
  639. $yz['is_agent'] = 0;
  640. $yz['status'] = 0;
  641. $yz['agent_time'] = 0;
  642. }
  643. //判断会员等级是否升级
  644. $is_upgrade = false;
  645. $new_level = MemberLevel::find($yz['level_id'])->level;
  646. if ($shopInfoModel->level_id != $yz['level_id'] && $new_level > $shopInfoModel->level->level) {
  647. $is_upgrade = true;
  648. }
  649. $data['customDatas'] = request()->myform;
  650. //自定义表单
  651. $member_form = (new MemberService())->updateMemberForm($data);
  652. if (!empty($member_form)) {
  653. $yz['member_form'] = json_encode($member_form);
  654. }
  655. $shopInfoModel->fill($yz);
  656. $validator = $shopInfoModel->validator();
  657. // 如果会员期限延长, 那么就清理降级时间
  658. if ($shopInfoModel->validity > 0) {
  659. $shopInfoModel->downgrade_at = 0;
  660. }
  661. if ($validator->fails()) {
  662. $this->error($validator->messages());
  663. } else {
  664. if ($shopInfoModel->save()) {
  665. if ($is_upgrade) {
  666. //会员等级升级触发事件
  667. event(new MemberLevelUpgradeEvent($shopInfoModel, true));
  668. } else {
  669. //会员等级降级
  670. event(new MemberLevelDemotionEvent($shopInfoModel));
  671. }
  672. if ($parame['agent']) {
  673. $member = Member::getMemberByUid($uid)->with('hasOneFans')->first();
  674. event(new MemberRelationEvent($member));
  675. }
  676. return $this->successJson("用户资料更新成功");
  677. }
  678. }
  679. return $this->errorJson("用户资料更新失败");
  680. }
  681. /**
  682. * 删除
  683. *
  684. */
  685. public function delete()
  686. {
  687. $del = false;
  688. $uid = \YunShop::request()->id ? intval(\YunShop::request()->id) : 0;
  689. if ($uid == 0 || !is_int($uid)) {
  690. return $this->message('参数错误', '', 'error');
  691. }
  692. $member = Member::getMemberBaseInfoById($uid);
  693. if (empty($member)) {
  694. return $this->message('用户不存在', '', 'error');
  695. }
  696. $del = DB::transaction(function () use ($uid, $member) {
  697. //商城会员表
  698. //MemberShopInfo::deleteMemberInfoById($uid);
  699. //unionid关联表
  700. if (isset($member->hasOneFans->unionid) && !empty($member->hasOneFans->unionid)) {
  701. $uniqueModel = MemberUnique::getMemberInfoById($member->hasOneFans->unionid)->first();
  702. if (!is_null($uniqueModel)) {
  703. if ($uniqueModel->member_id != $uid) {
  704. //删除会员
  705. Member::UpdateDeleteMemberInfoById($uniqueModel->member_id);
  706. //小程序会员表
  707. MemberMiniAppModel::deleteMemberInfoById($uniqueModel->member_id);
  708. //app会员表
  709. MemberWechatModel::deleteMemberInfoById($uniqueModel->member_id);
  710. //删除微擎mc_mapping_fans 表数据
  711. McMappingFans::deleteMemberInfoById($uniqueModel->member_id);
  712. //清空 yz_member 关联
  713. MemberShopInfo::deleteMemberInfoOpenid($uniqueModel->member_id);
  714. //Member::deleteMemberInfoById($uniqueModel->member_id);
  715. }
  716. }
  717. }
  718. MemberUnique::deleteMemberInfoById($uid);
  719. if (app('plugins')->isEnabled('alipay-onekey-login')) {
  720. //删除支付宝会员表
  721. MemberAlipay::deleteMemberInfoById($uid);
  722. }
  723. //小程序会员表
  724. MemberMiniAppModel::deleteMemberInfoById($uid);
  725. //app会员表
  726. MemberWechatModel::deleteMemberInfoById($uid);
  727. //删除微擎mc_mapping_fans 表数据
  728. McMappingFans::deleteMemberInfoById($uid);
  729. //清空 yz_member 关联
  730. MemberShopInfo::deleteMemberInfoOpenid($uid);
  731. //删除会员
  732. Member::UpdateDeleteMemberInfoById($uid);
  733. event(new MemberDelEvent($uid));
  734. return true;
  735. });
  736. if ($del) {
  737. return $this->message('用户删除成功', yzWebUrl('member.member.index'));
  738. }
  739. return $this->message('用户删除失败', yzWebUrl('member.member.index'), 'error');
  740. }
  741. /**
  742. * 设置黑名单
  743. *
  744. */
  745. public function black()
  746. {
  747. $uid = \YunShop::request()->id ? intval(\YunShop::request()->id) : 0;
  748. if ($uid == 0 || !is_int($uid)) {
  749. $this->message('参数错误', '', 'error');
  750. exit;
  751. }
  752. $data = array(
  753. 'is_black' => \YunShop::request()->black
  754. );
  755. if (MemberShopInfo::setMemberBlack($uid, $data)) {
  756. (new \app\common\services\operation\MemberBankCardLog(['uid' => $uid, 'is_black' => \YunShop::request()->black], 'special'));
  757. return $this->message('黑名单设置成功', yzWebUrl('member.member.index'));
  758. } else {
  759. return $this->message('黑名单设置失败', yzWebUrl('member.member.index'), 'error');
  760. }
  761. }
  762. /**
  763. * 获取搜索会员
  764. * @return html
  765. */
  766. public function getSearchMember()
  767. {
  768. $keyword = \YunShop::request()->keyword;
  769. $member = Member::getMemberByName($keyword);
  770. $member = set_medias($member, array('avatar', 'share_icon'));
  771. return view('member.query', [
  772. 'members' => $member->toArray(),
  773. ])->render();
  774. }
  775. /**
  776. * 获取搜索会员(json)
  777. * @return html
  778. */
  779. public function getSearchMemberJson()
  780. {
  781. $keyword = request()->keyword;
  782. $member = Member::getMemberJsonByName($keyword);
  783. $member = set_medias($member, array('avatar', 'share_icon'));
  784. return $this->successJson('请求接口成功', [
  785. 'members' => $member->toArray(),
  786. ]);
  787. }
  788. /**
  789. * 获取搜索会员(json)
  790. * @return html
  791. */
  792. public function searchMemberList()
  793. {
  794. $keyword = request()->keyword;
  795. $member = Member::uniacid()->searchLike($keyword)
  796. ->select('uid', 'nickname', 'avatar', 'mobile')
  797. ->whereHas('yzMember', function ($query) {
  798. $query->whereNull('deleted_at');
  799. })->paginate(10000);
  800. $member = set_medias($member, array('avatar', 'share_icon'));
  801. return $this->successJson('请求接口成功', $member->toArray());
  802. }
  803. /**
  804. * 加载模板 -- 直推客户
  805. * @return string
  806. * @throws \Throwable
  807. */
  808. public function agentOld()
  809. {
  810. $set = Setting::getByGroup('pay_password') ?: [];
  811. return view('member.agent-old', [
  812. 'is_verify' => !empty($set['withdraw_verify']['is_member_export_verify'])?true:false,
  813. 'expire_time' => Session::get('withdraw_verify')?:null,
  814. 'verify_phone' => $set['withdraw_verify']['phone']?:"",
  815. 'verify_expire' => $set['withdraw_verify']['verify_expire']?intval($set['withdraw_verify']['verify_expire']):10
  816. ])->render();
  817. }
  818. /**
  819. * 推广下线
  820. *
  821. * @return mixed
  822. */
  823. public function agentOldShow()
  824. {
  825. $request = \YunShop::request();
  826. $member_info = Member::memberCustomer($request->id)->first();
  827. if (empty($member_info)) {
  828. return $this->message('会员不存在', '', 'error');
  829. }
  830. $list = Member::getAgentInfoByMemberId($request)
  831. ->paginate($this->pageSize)
  832. ->toArray();
  833. return $this->successJson('ok', [
  834. 'member' => $member_info,
  835. 'list' => (new FansItemService())->setFansItem($list),
  836. 'total' => $list['total'],
  837. ]);
  838. }
  839. /**
  840. * 加载模板 -- 推广下线
  841. * @return string
  842. * @throws \Throwable
  843. */
  844. public function agent()
  845. {
  846. $set = Setting::getByGroup('pay_password') ?: [];
  847. return view('member.agent', [
  848. 'is_verify' => !empty($set['withdraw_verify']['is_member_export_verify'])?true:false,
  849. 'expire_time' => Session::get('withdraw_verify')?:null,
  850. 'verify_phone' => $set['withdraw_verify']['phone']?:"",
  851. 'verify_expire' => $set['withdraw_verify']['verify_expire']?intval($set['withdraw_verify']['verify_expire']):10
  852. ])->render();
  853. }
  854. public function getLevels()
  855. {
  856. $levels = MemberParent::selectRaw('count(member_id) as total, level, max(parent_id) as parent_id')
  857. ->where('parent_id', \YunShop::request()->id)
  858. ->groupBy('level')
  859. ->get();
  860. return $this->successJson('ok', $levels);
  861. }
  862. /**
  863. * 推广下线
  864. *
  865. * @return mixed
  866. */
  867. public function agentShow()
  868. {
  869. $request = \YunShop::request();
  870. $member_info = Member::memberCustomer($request->id)->first();
  871. if (empty($member_info)) {
  872. return $this->error('会员不存在');
  873. }
  874. $list = MemberParent::children($request)
  875. ->orderBy('level', 'asc')
  876. ->orderBy('id', 'asc')
  877. ->paginate($this->pageSize)
  878. ->toArray();
  879. return $this->successJson('ok', [
  880. 'member' => $member_info,
  881. 'list' => (new FansItemService())->setAgentFansItem($list),
  882. 'total' => $list['total'],
  883. 'request' => $request,
  884. ]);
  885. }
  886. public function agentExport()
  887. {
  888. if (!$this->checkVerify()) {
  889. return $this->message('二次校验失败','','error');
  890. }
  891. $file_name = date('Ymdhis', time()) . '会员下级导出';
  892. $export_data[0] = ['ID', '昵称', '真实姓名', '电话','会员注册时间'];
  893. $member_id = request()->id;
  894. $aid = request()->aid;
  895. $keyword = request()->keyword;
  896. $followed = request()->followed;
  897. $isblack = request()->isblack;
  898. $level = request()->level;
  899. $export_page = request()->export_page ? request()->export_page : 1;
  900. $child = MemberParent::select('yz_member_parent.*')
  901. ->leftJoin('yz_member', 'yz_member_parent.member_id', '=', 'yz_member.member_id')
  902. ->where('yz_member_parent.parent_id', $member_id);
  903. if ($level) {
  904. $child = $child->where('yz_member_parent.level', $level);
  905. }
  906. if (isset($isblack) && $isblack !== '') {
  907. $child = $child->where('yz_member.is_black', intval($isblack));
  908. }
  909. if ($aid) {
  910. $child = $child->where('yz_member_parent.member_id', intval($aid));
  911. }
  912. $child = $child->with('hasOneChildMember', 'hasOneChildFans');
  913. $rows = 0;
  914. foreach ($child->get() as $key => $item) {
  915. $member = $item->hasOneChildMember;
  916. $hasOneChildFans = $item->hasOneChildFans;
  917. if (!$member) {
  918. continue;
  919. }
  920. if ($followed == '1' && !$hasOneChildFans) {
  921. continue;
  922. }
  923. if ($followed == '0' && $hasOneChildFans) {
  924. continue;
  925. }
  926. if ($keyword && $keyword != $member->mobile && $keyword != $member->nickname && $keyword != $member->realname) {
  927. continue;
  928. }
  929. $rows++;
  930. $export_data[$rows] = [
  931. $member->uid,
  932. changeSpecialSymbols($member->nickname),
  933. $member->realname,
  934. $member->mobile,
  935. date('Y-m-d H:i:s',$member->createtime),
  936. ];
  937. }
  938. // 此处参照商城订单管理的导出接口
  939. app('excel')->store(new \app\exports\FromArray($export_data), $file_name . '.xlsx', 'export');
  940. app('excel')->download(new \app\exports\FromArray($export_data), $file_name . '.xlsx')->send();
  941. }
  942. /**
  943. * 导出验证
  944. * @return bool
  945. */
  946. private function checkVerify()
  947. {
  948. $set = Setting::getByGroup('pay_password')['withdraw_verify'] ?: [];
  949. if (empty($set) || empty($set['is_member_export_verify'])) {
  950. return true;
  951. }
  952. $verify = Session::get('withdraw_verify'); //没获取到
  953. if ($verify && $verify >= time()) {
  954. return true;
  955. }
  956. return false;
  957. }
  958. /**
  959. * 加载模板 -- 推广上线
  960. * @return string
  961. * @throws \Throwable
  962. */
  963. public function agentParent()
  964. {
  965. $set = Setting::getByGroup('pay_password') ?: [];
  966. return view('member.agent-parent', [
  967. 'is_verify' => !empty($set['withdraw_verify']['is_member_export_verify'])?true:false,
  968. 'expire_time' => Session::get('withdraw_verify')?:null,
  969. 'verify_phone' => $set['withdraw_verify']['phone']?:"",
  970. 'verify_expire' => $set['withdraw_verify']['verify_expire']?intval($set['withdraw_verify']['verify_expire']):10
  971. ])->render();
  972. }
  973. /**
  974. * 推广上线
  975. * @throws \Throwable
  976. */
  977. public function agentParentShow()
  978. {
  979. $request = \YunShop::request();
  980. $member_info = Member::memberCustomer($request->id)->first();
  981. if (empty($member_info)) {
  982. return $this->message('会员不存在', '', 'error');
  983. }
  984. $list = MemberParent::parent($request)->orderBy('level', 'asc')->paginate($this->pageSize)->toArray();
  985. $pager = PaginationHelper::show($list['total'], $list['current_page'], $this->pageSize);
  986. return $this->successJson('ok', [
  987. 'member' => $member_info,
  988. 'list' => (new FansItemService())->setParentFansItem($list),
  989. 'pager' => $pager,
  990. 'total' => $list['total'],
  991. 'request' => $request
  992. ]);
  993. }
  994. /**
  995. * 推广上线导出
  996. */
  997. public function agentParentExport()
  998. {
  999. if (!$this->checkVerify()) {
  1000. return $this->message('二次校验失败','','error');
  1001. }
  1002. $file_name = date('Ymdhis', time()) . '会员上级导出';
  1003. $export_data[0] = ['ID', '昵称', '真实姓名', '电话'];
  1004. $member_id = request()->id;
  1005. $export_page = request()->export_page ? request()->export_page : 1;
  1006. $child = MemberParent::where('member_id', $member_id)->with(['hasOneMember']);
  1007. $export_model = new ExportService($child, $export_page);
  1008. foreach ($child->get() as $key => $item) {
  1009. $member = $item->hasOneMember;
  1010. $export_data[$key + 1] = [
  1011. $member->uid,
  1012. changeSpecialSymbols($member->nickname),
  1013. $member->realname,
  1014. $member->mobile,
  1015. ];
  1016. }
  1017. // 此处参照商城订单管理的导出接口
  1018. app('excel')->store(new \app\exports\FromArray($export_data), $file_name . '.xlsx', 'export');
  1019. app('excel')->download(new \app\exports\FromArray($export_data), $file_name . '.xlsx')->send();
  1020. }
  1021. public function firstAgentExport()
  1022. {
  1023. if (!$this->checkVerify()) {
  1024. return $this->message('二次校验失败','','error');
  1025. }
  1026. $export_data = [];
  1027. $file_name = date('Ymdhis', time()) . '会员直推上级导出';
  1028. $member_id = request()->id;
  1029. $export_page = request()->export_page ? request()->export_page : 1;
  1030. $levelId = [];
  1031. if (app('plugins')->isEnabled('team-dividend')) {
  1032. $team_list = TeamDividendLevelModel::getList()->get();
  1033. foreach ($team_list as $level) {
  1034. $export_data[0][] = $level->level_name;
  1035. $levelId[] = $level->id;
  1036. }
  1037. }
  1038. array_push($export_data[0], '会员ID', '会员', '姓名/手机号码');
  1039. $child = MemberParent::where('member_id', $member_id)
  1040. ->where('level', 1)
  1041. ->with(['hasManyParent' => function ($q) {
  1042. $q->orderBy('level', 'asc');
  1043. }])
  1044. ->get();
  1045. foreach ($child as $key => $item) {
  1046. $level = $this->getLevel($item, $levelId);
  1047. $export_data[$key + 1] = $level;
  1048. array_push($export_data[$key + 1],
  1049. $item->member_id,
  1050. $item->hasOneMember->nickname,
  1051. $item->hasOneMember->realname . '/' . $item->hasOneMember->mobile);
  1052. }
  1053. // 此处参照商城订单管理的导出接口
  1054. app('excel')->store(new \app\exports\FromArray($export_data), $file_name . '.xlsx', 'export');
  1055. app('excel')->download(new \app\exports\FromArray($export_data), $file_name . '.xlsx')->send();
  1056. }
  1057. public function getLevel($member, $levelId)
  1058. {
  1059. $data = [];
  1060. // $num = count($member->hasManyParentTeam);
  1061. foreach ($levelId as $k => $value) {
  1062. foreach ($member->hasManyParent as $key => $parent) {
  1063. if ($parent->hasOneTeamDividend->hasOneLevel->id == $value) {
  1064. $data[$k] = $parent->hasOneMember->nickname . ' ' . $parent->hasOneMember->realname . ' ' . $parent->hasOneMember->mobile;
  1065. break;
  1066. }
  1067. }
  1068. $data[$k] = $data[$k] ?: '';
  1069. }
  1070. return $data;
  1071. }
  1072. /**
  1073. * 数据导出
  1074. *
  1075. */
  1076. public function export()
  1077. {
  1078. if (!$this->checkVerify()) {
  1079. return $this->message('二次校验失败','','error');
  1080. }
  1081. $parames = \YunShop::request();
  1082. $member_builder = Member::searchNewMembers($parames);
  1083. $export_page = request()->export_page ? request()->export_page : 1;
  1084. $export_model = new ExportService($member_builder, $export_page);
  1085. $handle_nickname = new HandleNickname();
  1086. $file_name = date('Ymdhis', time()) . '会员导出' . $export_page;
  1087. $export_data[0] = ['会员ID', '推荐人', '推荐人ID', '推荐人手机号', '粉丝', '姓名', '手机号', '等级', '分组', '注册时间', '积分', '余额', '订单', '金额', '关注', '提现手机号'];
  1088. $export_model_data = $export_model->builder_model;
  1089. if (empty($export_model_data)) exit;
  1090. if ($parames['search']['first_count'] ||
  1091. $parames['search']['second_count'] ||
  1092. $parames['search']['third_count'] ||
  1093. $parames['search']['team_count']
  1094. ) {
  1095. $result_ids = [];
  1096. if ($parames['search']['first_count']) {
  1097. $result_ids = $this->getChildCount($parames['search']['first_count'], 1);
  1098. }
  1099. if ($parames['search']['second_count']) {
  1100. $second_ids = $this->getChildCount($parames['search']['second_count'], 2);
  1101. $result_ids = empty($result_ids) ? $second_ids : array_intersect($result_ids, $second_ids);
  1102. unset($second_ids);
  1103. }
  1104. if ($parames['search']['third_count']) {
  1105. $third_ids = $this->getChildCount($parames['search']['third_count'], 3);
  1106. $result_ids = empty($result_ids) ? $third_ids : array_intersect($result_ids, $third_ids);
  1107. unset($third_ids);
  1108. }
  1109. if ($parames['search']['team_count']) {
  1110. $team_ids = $this->getChildCount($parames['search']['team_count']);
  1111. $result_ids = empty($result_ids) ? $team_ids : array_intersect($result_ids, $team_ids);
  1112. unset($team_ids);
  1113. }
  1114. $export_model_data = $export_model_data->whereIn('uid', $result_ids);
  1115. }
  1116. foreach ($export_model_data->toArray() as $key => $item) {
  1117. if (!empty($item['yz_member']) && !empty($item['yz_member']['agent'])) {
  1118. $agent = $handle_nickname->removeEmoji($item['yz_member']['agent']['nickname']);
  1119. } else {
  1120. $agent = '总店';
  1121. }
  1122. if (!empty($item['yz_member']) && !empty($item['yz_member']['group'])) {
  1123. $group = $item['yz_member']['group']['group_name'];
  1124. } else {
  1125. $group = '';
  1126. }
  1127. if (!empty($item['yz_member']) && !empty($item['yz_member']['level'])) {
  1128. $level = $item['yz_member']['level']['level_name'];
  1129. } else {
  1130. $level = '';
  1131. }
  1132. $order = $item['has_one_order']['total'] ?: 0;
  1133. $price = $item['has_one_order']['sum'] ?: 0;
  1134. if (!empty($item['has_one_fans'])) {
  1135. if ($item['has_one_fans']['followed'] == 1) {
  1136. $fans = '已关注';
  1137. } else {
  1138. $fans = '未关注';
  1139. }
  1140. } else {
  1141. $fans = '未关注';
  1142. }
  1143. if (substr($item['nickname'], 0, strlen('=')) === '=') {
  1144. $item['nickname'] = ',' . $handle_nickname->removeEmoji($item['nickname']);
  1145. }
  1146. if (!$item['yz_member']['parent_id']) {
  1147. $parent_id = 0;
  1148. } else {
  1149. $parent_id = $item['yz_member']['parent_id'];
  1150. }
  1151. if (!$item['yz_member']['agent'] || !$item['yz_member']['agent']['mobile']) {
  1152. $parent_mobile = '';
  1153. } else {
  1154. $parent_mobile = $item['yz_member']['agent']['mobile'];
  1155. }
  1156. $export_data[$key + 1] = [$item['uid'], $agent, $parent_id, $parent_mobile, $item['nickname'], $handle_nickname->removeEmoji($item['realname']), $item['mobile'],
  1157. $level, $group, date('Y-m-d H:i:s', $item['createtime']), $item['credit1'], $item['credit2'], $order,
  1158. $price, $fans, $item['yz_member']['withdraw_mobile']];
  1159. }
  1160. $export_model->export($file_name, $export_data, $this->exportRoute);
  1161. }
  1162. public function search_member()
  1163. {
  1164. $members = [];
  1165. $parent_id = \YunShop::request()->parent;
  1166. if (is_numeric($parent_id)) {
  1167. $member = Member::getMemberById($parent_id);
  1168. if (!is_null($member)) {
  1169. $members[] = $member->toArray();
  1170. }
  1171. if (0 == $parent_id) {
  1172. $members = 0;
  1173. }
  1174. }
  1175. return $this->successJson('ok', ['members' => $members]);
  1176. }
  1177. //查找用户
  1178. //Todo 后台优化(原方法search_member,其他方法可能用到,暂未删除)
  1179. public function searchMember()
  1180. {
  1181. $members = [];
  1182. $parent_id = request()->parent;
  1183. if (is_numeric($parent_id)) {
  1184. $member = Member::getMemberById($parent_id);
  1185. if (!is_null($member)) {
  1186. $members[] = $member->toArray();
  1187. }
  1188. if ($parent_id == 0) {
  1189. //返回总店
  1190. $members[] = ['uid' => 0, 'nickname' => '总店'];
  1191. }
  1192. }
  1193. return $this->successJson('ok', [
  1194. 'members' => $members
  1195. ]);
  1196. }
  1197. //修改会员上线
  1198. public function change_relation_back()
  1199. {
  1200. $parent_id = request()->parent;
  1201. $uid = request()->member;
  1202. $msg = MemberShopInfo::change_relation($uid, $parent_id);
  1203. switch ($msg['status']) {
  1204. case -1:
  1205. return $this->errorJson('上线没有推广权限');
  1206. break;
  1207. case 1:
  1208. return $this->successJson('修改成功');
  1209. break;
  1210. case 0:
  1211. default:
  1212. return $this->errorJson('修改失败');
  1213. }
  1214. }
  1215. public function change_relation()
  1216. {
  1217. $parent_id = (int)request()->parent;
  1218. $uid = (int)request()->member;
  1219. $member = SubMemberModel::getMemberShopInfo($uid);
  1220. //判断修改的上级是否推广员
  1221. if ($parent_id != 0) {
  1222. $parent = SubMemberModel::getMemberShopInfo($parent_id);
  1223. if (!($parent->is_agent == 1 && $parent->status == 2)) {
  1224. return $this->errorJson('上线没有推广权限');
  1225. }
  1226. if ($parent->parent_id == $uid) {
  1227. return $this->errorJson('会员上下线冲突');
  1228. }
  1229. //验证是否闭环关系链
  1230. $chain = ParentOfMember::where('member_id', $parent_id)->pluck('parent_id');
  1231. $chain->push($uid);
  1232. $chain->push($parent_id);
  1233. if ($chain->count() != $chain->unique()->count()) {
  1234. return $this->errorJson('关系链闭环,请检测关系链');
  1235. }
  1236. }
  1237. $record_data = [
  1238. 'uid' => $uid,
  1239. 'parent_id' => $member->parent_id,
  1240. 'after_parent_id' => $parent_id,
  1241. 'status' => 0,
  1242. 'uniacid' => \YunShop::app()->uniacid
  1243. ];
  1244. $member_record = MemberRecord::create($record_data);
  1245. $this->dispatch(new ModifyRelationshipChainJob($uid, $parent_id, $member_record->id, \YunShop::app()->uniacid));
  1246. return $this->successJson('关系链修改请求成功,请到关系链修改记录查看修改结果');
  1247. }
  1248. //会员上线修改记录
  1249. public function member_record()
  1250. {
  1251. $records = MemberRecord::getRecord(request()->uid);
  1252. return $this->successJson('ok', [
  1253. 'records' => $records
  1254. ]);
  1255. }
  1256. public function updateWechatOpenData()
  1257. {
  1258. $status = \YunShop::request()->status;
  1259. if (Cache::has('queque_wechat_total')) {
  1260. Cache::forget('queque_wechat_total');
  1261. }
  1262. if (Cache::has('queque_wechat_page')) {
  1263. Cache::forget('queque_wechat_page');
  1264. }
  1265. if (is_null($status)) {
  1266. $pageSize = 100;
  1267. $member_info = Member::getQueueAllMembersInfo(\YunShop::app()->uniacid);
  1268. $total = $member_info->count();
  1269. $total_page = ceil($total / $pageSize);
  1270. \Log::debug('------total-----', $total);
  1271. \Log::debug('------total_page-----', $total_page);
  1272. Cache::put('queque_wechat_total', $total_page, 30);
  1273. for ($curr_page = 1; $curr_page <= $total_page; $curr_page++) {
  1274. \Log::debug('------curr_page-----', $curr_page);
  1275. $offset = ($curr_page - 1) * $pageSize;
  1276. $member_info = Member::getQueueAllMembersInfo(\YunShop::app()->uniacid, $pageSize, $offset)->get();
  1277. \Log::debug('------member_count-----', $member_info->count());
  1278. $job = (new \app\Jobs\wechatUnionidJob(\YunShop::app()->uniacid, $member_info));
  1279. dispatch($job);
  1280. }
  1281. } else {
  1282. switch ($status) {
  1283. case 0:
  1284. return $this->message('微信开放平台数据同步失败', yzWebUrl('member.member.index'), 'error');
  1285. break;
  1286. case 1:
  1287. return $this->message('微信开放平台数据同步完成', yzWebUrl('member.member.index'));
  1288. break;
  1289. }
  1290. }
  1291. return view('member.update-wechat', [])->render();
  1292. }
  1293. public function updateWechatData()
  1294. {
  1295. $total = Cache::get('queque_wechat_total') ?: 0;
  1296. $page = Cache::get('queque_wechat_page') ?: 0;
  1297. \Log::debug('--------ajax total-------', $total);
  1298. \Log::debug('--------ajax page-------', $page);
  1299. if ($total == $page) {
  1300. return json_encode(['status' => 1]);
  1301. } else {
  1302. return json_encode(['status' => 0]);
  1303. }
  1304. }
  1305. public function exportRelation()
  1306. {
  1307. ini_set('memory_limit',-1);
  1308. $page = request()->input('page')??0;
  1309. $del_page = request()->input('del_page')??0;
  1310. $del_total = request()->input('del_total')??MemberParent::uniacid()->count();
  1311. $max_parent_id = request()->input('max_parent_id')??MemberParent::uniacid()->orderBy('id','desc')->value('id')??0;
  1312. $max_child_id = request()->input('max_child_id')??MemberChildren::uniacid()->orderBy('id','desc')->value('id')??0;
  1313. $max_member_id = request()->input('max_member_id')??\app\common\models\MemberShopInfo::uniacid()->orderBy('member_id','desc')->value('member_id');
  1314. if ($page > 0) {
  1315. $parent_list = \app\common\models\MemberShopInfo::uniacid()->where('member_id','<=',$max_member_id)->pluck('parent_id','member_id')->toArray();
  1316. $count = count($parent_list);
  1317. $total_page = ceil($count/5000);
  1318. $parents = array_chunk($parent_list,5000,true)[$page-1];
  1319. foreach ($parents as $member_id => $parent_id) {
  1320. $current_parent_id = $parent_id;
  1321. $level = 1;
  1322. $exist_parent = [];
  1323. while ($current_parent_id != 0) {
  1324. if (in_array($current_parent_id,$exist_parent)) {
  1325. return $this->errorJson('会员id:'.$member_id.'关系链闭环,请检查关系链');
  1326. }
  1327. $exist_parent[] = $current_parent_id;
  1328. $member_parent[] = [
  1329. 'member_id' => $member_id,
  1330. 'parent_id' => $current_parent_id,
  1331. 'level' => $level,
  1332. 'uniacid' => \YunShop::app()->uniacid,
  1333. ];
  1334. $member_child[] = [
  1335. 'member_id' => $current_parent_id,
  1336. 'child_id' => $member_id,
  1337. 'level' => $level,
  1338. 'uniacid' => \YunShop::app()->uniacid,
  1339. ];
  1340. $current_parent_id = $parent_list[$current_parent_id];
  1341. $level++;
  1342. }
  1343. }
  1344. foreach (array_chunk($member_parent,10000) as $value) {
  1345. MemberParent::insert($value);
  1346. }
  1347. foreach (array_chunk($member_child,10000) as $value) {
  1348. \app\common\models\member\MemberChildren::insert($value);
  1349. }
  1350. unset($member_parent);
  1351. unset($member_child);
  1352. return $this->successJson('',['page'=>$page + 1,
  1353. 'process'=> $page / $total_page * 100,
  1354. 'del_process'=>100,
  1355. 'del_total' => $del_total,
  1356. 'del_page' => $del_page,
  1357. 'max_parent_id' => $max_parent_id,
  1358. 'max_child_id' => $max_child_id,
  1359. 'max_member_id' => $max_member_id,
  1360. 'status'=>empty($parents)]);
  1361. } else {
  1362. $parent_del = MemberParent::uniacid()->when($max_parent_id,function($query) use ($max_parent_id) {
  1363. return $query->where('id','<=',$max_parent_id);
  1364. })->limit(10000)->delete();
  1365. $child_del = \app\common\models\member\MemberChildren::uniacid()->when($max_child_id,function($query) use ($max_child_id) {
  1366. return $query->where('id','<=',$max_child_id);
  1367. })->limit(10000)->delete();
  1368. $del_process = 100;
  1369. if ($del_total > 0) {
  1370. $del_process = $del_page * 10000 / $del_total * 100;
  1371. }
  1372. if ($parent_del == 0 && $child_del == 0) {
  1373. $page = 1;
  1374. $del_process = 100;
  1375. }
  1376. return $this->successJson('',[
  1377. 'page'=>$page,
  1378. 'process'=> 0,
  1379. 'del_process'=> $del_process,
  1380. 'del_total' => $del_total,
  1381. 'del_page' => $del_page + 1,
  1382. 'max_parent_id' => $max_parent_id,
  1383. 'max_child_id' => $max_child_id,
  1384. 'max_member_id' => $max_member_id,
  1385. ]);
  1386. }
  1387. }
  1388. public function changeMemberRelationJob()
  1389. {
  1390. $member_id = \YunShop::request()->uid;
  1391. $parent_id = \YunShop::request()->pid;
  1392. $job = new ChangeMemberRelationJob($member_id, $parent_id);
  1393. dispatch($job);
  1394. }
  1395. public function changeMobile()
  1396. {
  1397. $uid = request()->uid;
  1398. $mobile = request()->mobile;
  1399. if (!$mobile) {
  1400. return $this->errorJson('请输入手机号码');
  1401. }
  1402. $mobile_member = Member::uniacid()->where('mobile', $mobile)->first();
  1403. if ($mobile_member) {
  1404. return $this->errorJson('该手机已被绑定');
  1405. }
  1406. $mc_member = Member::uniacid()->where('uid', $uid)->first();
  1407. if ($mc_member) {
  1408. //添加修改日志
  1409. $data = [
  1410. 'member_id' => $uid,
  1411. 'uniacid' => \YunShop::app()->uniacid,
  1412. 'mobile_before' => $mc_member->mobile,
  1413. 'mobile_after' => $mobile,
  1414. 'created_at' => time(),
  1415. ];
  1416. MemberChangeMobileLog::insert($data);
  1417. $mc_member->mobile = $mobile;
  1418. if ($mc_member->save()) {
  1419. return $this->successJson('绑定成功');
  1420. } else {
  1421. return $this->errorJson('绑定失败');
  1422. }
  1423. } else {
  1424. return $this->errorJson('会员不存在');
  1425. }
  1426. }
  1427. public function changeMobileLog()
  1428. {
  1429. $uid = request()->uid;
  1430. $list = MemberChangeMobileLog::uniacid()->where('member_id', $uid)->get()->toArray();
  1431. return $this->successJson('ok', [
  1432. 'list' => $list,
  1433. ]);
  1434. }
  1435. public function memberMerge()
  1436. {
  1437. $member_id = request()->uid;
  1438. $yz_member = MemberShopInfo::getMemberShopInfo($member_id);
  1439. $mark_member_id = $yz_member->mark_member_id;
  1440. $relation_set = Setting::get('relation_base');
  1441. $exception = DB::transaction(function () use ($yz_member, $relation_set) {
  1442. $abandon_member_id = $yz_member->mark_member_id;
  1443. $main_member_id = $yz_member->member_id;
  1444. $abandon_member = Member::getMemberById($abandon_member_id);
  1445. $main_member = Member::getMemberById($main_member_id);
  1446. $merge_data = [
  1447. 'uniacid' => \YunShop::app()->uniacid,
  1448. 'before_uid' => $abandon_member_id,
  1449. 'after_uid' => $main_member_id,
  1450. 'before_mobile' => $abandon_member->mobile,
  1451. 'after_mobile' => $main_member->mobile,
  1452. 'before_point' => $abandon_member->credit1?:0.00,
  1453. 'after_point' => bcadd($main_member->credit1, $abandon_member->credit1, 2)?:0.00,
  1454. 'before_amount' => $abandon_member->credit2?:0.00,
  1455. 'after_amount' => bcadd($main_member->credit2, $abandon_member->credit2, 2)?:0.00,
  1456. 'set_content' => json_encode($relation_set),
  1457. 'merge_type' => 2,
  1458. ];
  1459. //合并处理服务
  1460. (new MemberMergeService($main_member_id, $abandon_member_id, $merge_data))->handel();
  1461. //小程序
  1462. MemberMiniAppModel::where('member_id', $yz_member->mark_member_id)->update(['member_id' => $yz_member->member_id]);
  1463. //公众号
  1464. McMappingFans::where('uid', $yz_member->mark_member_id)->update(['uid' => $yz_member->member_id]);
  1465. //app
  1466. \app\frontend\modules\member\models\MemberWechatModel::where('member_id', $yz_member->mark_member_id)->update(['member_id' => $yz_member->member_id]);
  1467. //聚合cps
  1468. if (Schema::hasTable('yz_member_aggregation_app')) {
  1469. DB::table('yz_member_aggregation_app')->where('member_id', $yz_member->mark_member_id)->update(['member_id' => $yz_member->member_id]);
  1470. }
  1471. //企业微信
  1472. if (Schema::hasTable('yz_member_customer')) {
  1473. DB::table('yz_member_customer')->where('uid',$yz_member->mark_member_id)->update(['uid' => $yz_member->member_id]);
  1474. }
  1475. //统一
  1476. MemberUnique::where('member_id', $yz_member->mark_member_id)->update(['member_id' => $yz_member->member_id]);
  1477. //支付宝
  1478. MemberAlipay::where('member_id', $yz_member->mark_member_id)->update(['member_id' => $yz_member->member_id]);
  1479. Member::where('uid', $yz_member->mark_member_id)->delete(); //删除mc_members数据
  1480. MemberShopInfo::where('member_id', $yz_member->mark_member_id)->delete(); //软删除yz_member
  1481. $yz_member->is_old = 0;
  1482. $yz_member->mark_member_id = 0;
  1483. $yz_member->save();
  1484. });
  1485. if (!is_null($exception)) {
  1486. return $this->errorJson('合并失败');
  1487. }
  1488. event(new MergeMemberEvent($member_id, $mark_member_id));
  1489. return $this->successJson('合并成功');
  1490. }
  1491. public function mergeMember()
  1492. {
  1493. $post = request()->post();
  1494. if (empty($post) || !$post['hold_member_id'] || !$post['give_up_member_id']) {
  1495. return $this->errorJson('请传入完整参数');
  1496. }
  1497. $main_member_id = $post['hold_member_id'];
  1498. $abandon_member_id = $post['give_up_member_id'];
  1499. try {
  1500. $this->validateMember($main_member_id, $abandon_member_id);
  1501. } catch (ShopException $exception) {
  1502. return $this->errorJson($exception->getMessage());
  1503. }
  1504. $relation_set = Setting::get('relation_base');
  1505. $exception = DB::transaction(function () use ($main_member_id, $abandon_member_id, $relation_set) {
  1506. $abandon_member = Member::getMemberById($abandon_member_id);
  1507. $main_member = Member::getMemberById($main_member_id);
  1508. $merge_data = [
  1509. 'uniacid' => \YunShop::app()->uniacid,
  1510. 'before_uid' => $abandon_member_id,
  1511. 'after_uid' => $main_member_id,
  1512. 'before_mobile' => $abandon_member->mobile,
  1513. 'after_mobile' => $main_member->mobile,
  1514. 'before_point' => $abandon_member->credit1?:0.00,
  1515. 'after_point' => bcadd($main_member->credit1, $abandon_member->credit1, 2)?:0.00,
  1516. 'before_amount' => $abandon_member->credit2?:0.00,
  1517. 'after_amount' => bcadd($main_member->credit2, $abandon_member->credit2, 2)?:0.00,
  1518. 'set_content' => json_encode($relation_set),
  1519. 'merge_type' => 4,
  1520. ];
  1521. //合并处理服务
  1522. (new MemberMergeService($main_member_id, $abandon_member_id, $merge_data))->handel();
  1523. //小程序
  1524. MemberMiniAppModel::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  1525. //公众号
  1526. McMappingFans::where('uid', $abandon_member_id)->update(['uid' => $main_member_id]);
  1527. //app
  1528. \app\frontend\modules\member\models\MemberWechatModel::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  1529. //聚合cps
  1530. if (Schema::hasTable('yz_member_aggregation_app')) {
  1531. DB::table('yz_member_aggregation_app')->where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  1532. }
  1533. //企业微信
  1534. if (Schema::hasTable('yz_member_customer')) {
  1535. DB::table('yz_member_customer')->where('uid',$abandon_member_id)->update(['uid' => $main_member_id]);
  1536. }
  1537. //统一
  1538. MemberUnique::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  1539. //支付宝
  1540. MemberAlipay::where('member_id', $abandon_member_id)->update(['member_id' => $main_member_id]);
  1541. Member::where('uid', $abandon_member_id)->delete(); //删除mc_members数据
  1542. MemberShopInfo::where('member_id', $abandon_member_id)->delete(); //软删除yz_member
  1543. });
  1544. if (!is_null($exception)) {
  1545. return $this->errorJson('合并失败');
  1546. }
  1547. event(new MergeMemberEvent($main_member_id, $abandon_member_id));
  1548. return $this->successJson('合并成功');
  1549. }
  1550. private function validateMember($hold_member_id, $give_up_member_id)
  1551. {
  1552. $hold_member = Member::getMemberById($hold_member_id);
  1553. $give_up_member = Member::getMemberById($give_up_member_id);
  1554. if (!$hold_member || !$give_up_member) {
  1555. throw new ShopException('请确认所填会员id是否正确');
  1556. }
  1557. if ($hold_member->mobile && $give_up_member->mobile) {
  1558. throw new ShopException('所选两个会员都绑定了手机号,不能进行合并');
  1559. }
  1560. //微信生态
  1561. //公众号
  1562. $hold_fans = McMappingFans::getFansById($hold_member_id);
  1563. $give_up_fans = McMappingFans::getFansById($give_up_member_id);
  1564. //小程序
  1565. $hole_mini = MemberMiniAppModel::getFansById($hold_member_id);
  1566. $give_up_mini = MemberMiniAppModel::getFansById($give_up_member_id);
  1567. //app
  1568. $hold_app = \app\frontend\modules\member\models\MemberWechatModel::getFansById($hold_member_id);
  1569. $give_up_app = \app\frontend\modules\member\models\MemberWechatModel::getFansById($give_up_member_id);
  1570. //聚合cps
  1571. if (Schema::hasTable('yz_member_aggregation_app')) {
  1572. $hold_cps = DB::table('yz_member_aggregation_app')->where('member_id', $hold_member_id)->first();
  1573. $give_up_cps = DB::table('yz_member_aggregation_app')->where('member_id', $give_up_member_id)->first();
  1574. }
  1575. //统一
  1576. $hold_uni = MemberUnique::where('member_id', $hold_member_id)->first();
  1577. $give_up_uni = MemberUnique::where('member_id', $give_up_member_id)->first();
  1578. if (($hole_mini||$hold_fans||$hold_app||$hold_cps||$hold_uni) && ($give_up_fans||$give_up_mini||$give_up_app||$give_up_cps||$give_up_uni)) {
  1579. throw new ShopException('同微信生态会员不能合并');
  1580. }
  1581. //支付宝
  1582. $hold_ali = MemberAlipay::where('member_id', $hold_member_id)->first();
  1583. $give_up_ali = MemberAlipay::where('member_id', $give_up_member_id)->first();
  1584. if ($hold_ali && $give_up_ali) {
  1585. throw new ShopException('同支付宝生态会员不能合并');
  1586. }
  1587. }
  1588. private function changeYunSignData($hold_uid, $give_up_uid)
  1589. {
  1590. $yunSignTableArr = [
  1591. 'yz_yun_sign_company_account', 'yz_yun_sign_contract', 'yz_yun_sign_contract_cc', 'yz_yun_sign_contract_log',
  1592. 'yz_yun_sign_contract_num', 'yz_yun_sign_contract_role', 'yz_yun_sign_contract_template', 'yz_yun_sign_order',
  1593. 'yz_yun_sign_person_account', 'yz_yun_sign_person_seal', 'yz_yun_sign_short_url', 'yz_yun_sign_worker',
  1594. 'yz_yun_sign_apps', 'yz_yun_sign_contract_recharge'
  1595. ];
  1596. $yunSignApiTableArr = ['yz_yun_sign_api_contract'];
  1597. $shopSignTableArr = [
  1598. 'yz_shop_esign_company_account', 'yz_shop_esign_contract', 'yz_shop_esign_contract_role', 'yz_shop_esign_contract_template',
  1599. 'yz_shop_esign_order', 'yz_shop_esign_person_account',
  1600. ];
  1601. if (\YunShop::plugin()->get('yun-sign')) {
  1602. $column = 'uid';
  1603. foreach ($yunSignTableArr as $item) {
  1604. if ($item == 'yz_yun_sign_apps') {
  1605. $column = 'boss_uid';
  1606. }
  1607. if ($item == 'yz_yun_sign_contract_recharge') {
  1608. $column = 'member_id';
  1609. }
  1610. $this->updateData($item, $column, $hold_uid, $give_up_uid);
  1611. }
  1612. $uniacid = \YunShop::app()->uniacid;
  1613. $tablePrefix = DB::getTablePrefix();
  1614. DB::raw('UPDATE ' . $tablePrefix . 'yz_yun_sign_contract_num_log' . ' SET ' . $column . '=' . $hold_uid . ' where boss_uid =' . $give_up_uid . ' and uniacid=' . $uniacid);
  1615. }
  1616. if (\YunShop::plugin()->get('yun-sign-api')) {
  1617. foreach ($yunSignApiTableArr as $item) {
  1618. $this->updateData($item, 'uid', $hold_uid, $give_up_uid);
  1619. }
  1620. }
  1621. if (\YunShop::plugin()->get('shop-esign')) {
  1622. foreach ($shopSignTableArr as $item) {
  1623. $this->updateData($item, 'uid', $hold_uid, $give_up_uid);
  1624. }
  1625. }
  1626. }
  1627. private function updateData($table, $column, $hold_uid, $give_up_uid)
  1628. {
  1629. $uniacid = \YunShop::app()->uniacid;
  1630. $tablePrefix = DB::getTablePrefix();
  1631. $sql = 'UPDATE ' . $tablePrefix . $table . ' SET ' . $column . '=' . $hold_uid . ' where boss_uid =' . $give_up_uid . ' and uniacid=' . $uniacid;
  1632. return DB::raw($sql);
  1633. }
  1634. public function memberChart()
  1635. {
  1636. $type = request()->chart_type;
  1637. $count = 0;
  1638. switch ($type) {
  1639. case 5 :
  1640. $count = Member::uniacid()->select(['uid', 'mobile'])
  1641. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  1642. ->whereNull('yz_member.deleted_at')
  1643. ->where('mc_members.mobile', '!=', '')
  1644. ->count();
  1645. break;
  1646. case 1 :
  1647. $count = Member::uniacid()->select(['uid', 'mobile'])
  1648. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  1649. ->whereNull('yz_member.deleted_at')
  1650. ->join('mc_mapping_fans', 'mc_members.uid', '=', 'mc_mapping_fans.uid')
  1651. ->where('mc_mapping_fans.uniacid', \YunShop::app()->uniacid)
  1652. ->count();
  1653. break;
  1654. case 2 :
  1655. $count = Member::uniacid()->select(['uid', 'mobile'])
  1656. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  1657. ->whereNull('yz_member.deleted_at')
  1658. ->join('yz_member_mini_app', 'mc_members.uid', '=', 'yz_member_mini_app.member_id')
  1659. ->where('yz_member_mini_app.uniacid', \YunShop::app()->uniacid)
  1660. ->count();
  1661. break;
  1662. case 3 :
  1663. $count = Member::uniacid()->select(['uid', 'mobile'])
  1664. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  1665. ->whereNull('yz_member.deleted_at')
  1666. ->join('yz_member_wechat', 'mc_members.uid', '=', 'yz_member_wechat.member_id')
  1667. ->where('yz_member_wechat.uniacid', \YunShop::app()->uniacid)
  1668. ->count();
  1669. break;
  1670. case 4 :
  1671. $count = Member::uniacid()->select(['uid', 'mobile'])
  1672. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  1673. ->whereNull('yz_member.deleted_at')
  1674. ->join('yz_member_unique', 'mc_members.uid', '=', 'yz_member_unique.member_id')
  1675. ->where('yz_member_unique.uniacid', \YunShop::app()->uniacid)
  1676. ->count();
  1677. break;
  1678. case 6 :
  1679. if (!app('plugins')->isEnabled('wechat-customers')) {
  1680. $count = 0;
  1681. break;
  1682. }
  1683. $prefix = DB::getTablePrefix();
  1684. $res = DB::select("
  1685. SELECT
  1686. COUNT(1) AS total
  1687. FROM
  1688. (
  1689. SELECT
  1690. m.uid
  1691. FROM
  1692. {$prefix}yz_member_customer AS c
  1693. JOIN {$prefix}mc_members AS m
  1694. ON
  1695. c.uid = m.uid
  1696. JOIN {$prefix}yz_member AS yz
  1697. ON
  1698. c.uid = yz.member_id
  1699. WHERE
  1700. yz.deleted_at IS NULL
  1701. GROUP BY
  1702. m.uid
  1703. ) AS temp
  1704. ");
  1705. $count = $res[0]['total'];
  1706. break;
  1707. }
  1708. return $this->successJson('ok', [
  1709. 'count' => $count,
  1710. ]);
  1711. }
  1712. public function recordList()
  1713. {
  1714. return view('member.record-list', [])->render();
  1715. }
  1716. public function recordDatas()
  1717. {
  1718. $list = MemberRecord::select(['id', 'uid', 'parent_id', 'after_parent_id', 'status', 'created_at'])->uniacid()->orderBy('id', 'desc')->paginate(20)->toArray();
  1719. return $this->successJson('ok', ['list' => $list]);
  1720. }
  1721. public function changeLevel() //修改会员等级
  1722. {
  1723. $level_id = request()->level_id;
  1724. $uid = request()->uid;
  1725. if (!$uid) {
  1726. return $this->errorJson('参数错误');
  1727. }
  1728. $member = \app\common\models\MemberShopInfo::uniacid()->where('member_id', $uid)->first();
  1729. $member->level_id = $level_id;
  1730. if ($member->save()) {
  1731. return $this->successJson('会员等级修改成功');
  1732. } else {
  1733. return $this->error('失败');
  1734. }
  1735. }
  1736. public function changeGroup() //修改会员分组
  1737. {
  1738. $group_id = request()->group_id;
  1739. $uid = request()->uid;
  1740. if (!$uid) {
  1741. return $this->errorJson('参数错误');
  1742. }
  1743. $member = \app\common\models\MemberShopInfo::uniacid()->where('member_id', $uid)->first();
  1744. $member->group_id = $group_id;
  1745. if ($member->save()) {
  1746. return $this->successJson('会员分组修改成功');
  1747. } else {
  1748. return $this->error('失败');
  1749. }
  1750. }
  1751. }