DivisionServices.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\services\agent;
  12. use app\services\BaseServices;
  13. use app\services\order\StoreOrderServices;
  14. use app\services\other\QrcodeServices;
  15. use app\services\system\admin\SystemAdminServices;
  16. use app\services\system\admin\SystemRoleServices;
  17. use app\services\user\UserServices;
  18. use crmeb\exceptions\AdminException;
  19. use crmeb\exceptions\ApiException;
  20. use crmeb\services\FormBuilder as Form;
  21. use think\db\exception\DataNotFoundException;
  22. use think\db\exception\DbException;
  23. use think\db\exception\ModelNotFoundException;
  24. use think\facade\Route;
  25. class DivisionServices extends BaseServices
  26. {
  27. /**
  28. * 获取事业部/代理/员工列表
  29. * @param array $where
  30. * @return array
  31. * @throws \think\db\exception\DataNotFoundException
  32. * @throws \think\db\exception\DbException
  33. * @throws \think\db\exception\ModelNotFoundException
  34. */
  35. public function getDivisionList(array $where = [])
  36. {
  37. /** @var UserServices $userServices */
  38. $userServices = app()->make(UserServices::class);
  39. $data = $userServices->getDivisionList($where + ['status' => 1], 'uid,nickname,avatar,division_name,division_percent,division_end_time,division_status,division_invite');
  40. foreach ($data['list'] as &$item) {
  41. $item['division_end_time'] = date('Y-m-d', $item['division_end_time']);
  42. $item['agent_count'] = $userServices->count([
  43. $where['division_type'] == 1 ? 'division_id' : 'agent_id' => $item['uid'],
  44. 'division_type' => $where['division_type'] + 1,
  45. 'status' => 1,
  46. 'is_del' => 0
  47. ]);
  48. unset($item['label']);
  49. }
  50. return $data;
  51. }
  52. /**
  53. * 下级列表
  54. * @param $type
  55. * @param $uid
  56. * @return array
  57. * @throws \think\db\exception\DataNotFoundException
  58. * @throws \think\db\exception\DbException
  59. * @throws \think\db\exception\ModelNotFoundException
  60. */
  61. public function divisionDownList($type, $uid)
  62. {
  63. /** @var UserServices $userServices */
  64. $userServices = app()->make(UserServices::class);
  65. $where = [
  66. $type == 2 ? 'division_id' : 'agent_id' => $uid,
  67. 'division_type' => $type
  68. ];
  69. $where['status'] = 1;
  70. $where['is_del'] = 0;
  71. $data = $userServices->getDivisionList($where, 'uid,nickname,avatar,division_name,division_percent,division_end_time,division_status');
  72. foreach ($data['list'] as &$item) {
  73. $item['agent_count'] = $userServices->count([
  74. 'agent_id' => $item['uid'],
  75. 'division_type' => $type + 1,
  76. 'status' => 1
  77. ]);
  78. unset($item['label']);
  79. }
  80. return $data;
  81. }
  82. /**
  83. * 添加编辑事业部表单
  84. * @param $uid
  85. * @return array
  86. * @throws \FormBuilder\Exception\FormBuilderException
  87. */
  88. public function getDivisionForm($uid)
  89. {
  90. /** @var UserServices $userServices */
  91. $userServices = app()->make(UserServices::class);
  92. /** @var SystemAdminServices $adminService */
  93. $adminService = app()->make(SystemAdminServices::class);
  94. $userInfo = $userServices->getUserInfo($uid);
  95. if ($uid && !$userInfo) throw new AdminException('参数错误');
  96. if ($uid) {
  97. $adminInfo = $adminService->getInfo(['division_id' => $uid])->toArray();
  98. if (isset($adminInfo['roles'])) {
  99. foreach ($adminInfo['roles'] as &$item) {
  100. $item = intval($item);
  101. }
  102. }
  103. }
  104. $field = [];
  105. $title = '事业部';
  106. $field[] = Form::input('division_name', '事业部名称', $userInfo['division_name'] ?? '')->required('请输入事业部名称');
  107. if ($uid) {
  108. $field[] = Form::hidden('uid', $uid);
  109. } else {
  110. $field[] = Form::frameImage('image', '关联用户', $this->url(config('app.admin_prefix', 'admin') . '/system.user/list', ['fodder' => 'image'], true))->icon('el-icon-user')->width('950px')->height('560px')->Props(['srcKey' => 'image', 'footer' => false]);
  111. }
  112. $field[] = Form::hidden('aid', $adminInfo['id'] ?? 0);
  113. $field[] = Form::number('division_percent', '佣金比例', $userInfo['division_percent'] ?? '')->placeholder('区域代理佣金比例1-100')->info('填写1-100,如填写50代表返佣50%')->style(['width' => '173px'])->min(0)->max(100)->required();
  114. $field[] = Form::date('division_end_time', '到期时间', ($userInfo['division_end_time'] ?? '') != 0 ? date('Y-m-d H:i:s', $userInfo['division_end_time']) : '')->placeholder('区域代理到期时间');
  115. $field[] = Form::radio('division_status', '代理状态', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
  116. $field[] = Form::input('account', '管理账号', $adminInfo['account'] ?? '')->required('请填写管理员账号');
  117. $field[] = Form::input('pwd', '管理密码')->type('password')->placeholder('请填写管理员密码');
  118. $field[] = Form::input('conf_pwd', '确认密码')->type('password')->placeholder('请输入确认密码');
  119. /** @var SystemRoleServices $service */
  120. $service = app()->make(SystemRoleServices::class);
  121. $options = $service->getRoleFormSelect(1);
  122. $field[] = Form::select('roles', '管理员身份', $adminInfo['roles'] ?? [])->setOptions(Form::setOptions($options))->multiple(true)->required('请选择管理员身份');
  123. return create_form($title, $field, Route::buildUrl('/agent/division/save'), 'POST');
  124. }
  125. /**
  126. * 保存事业部数据
  127. * @param $data
  128. * @return mixed
  129. */
  130. public function divisionSave($data)
  131. {
  132. if ((int)$data['uid'] == 0) $data['uid'] = $data['image']['uid'];
  133. if ((int)$data['uid'] == 0) throw new AdminException('请填写用户UID');
  134. /** @var UserServices $userServices */
  135. $userServices = app()->make(UserServices::class);
  136. if ($data['aid'] == 0) {
  137. $userInfo = $userServices->getUserInfo($data['uid'], 'is_division,is_agent,is_staff');
  138. if (!$userInfo) throw new AdminException('用户不存在');
  139. if ($userInfo['is_division']) throw new AdminException('此用户是事业部,请勿重复添加');
  140. if ($userInfo['is_agent']) throw new AdminException('此用户是代理商,无法添加为事业部');
  141. if ($userInfo['is_staff']) throw new AdminException('此用户是下级员工,无法添加为事业部');
  142. }
  143. $uid = $data['uid'];
  144. $aid = $data['aid'];
  145. $agentData = [
  146. 'division_percent' => $data['division_percent'],
  147. 'division_end_time' => strtotime($data['division_end_time']),
  148. 'division_change_time' => time(),
  149. 'is_division' => 1,
  150. 'is_agent' => 0,
  151. 'is_staff' => 0,
  152. 'division_id' => $uid,
  153. 'agent_id' => 0,
  154. 'staff_id' => 0,
  155. 'division_type' => 1,
  156. 'division_status' => $data['division_status'],
  157. 'spread_uid' => 0,
  158. 'spread_time' => 0,
  159. 'division_name' => $data['division_name'],
  160. 'is_promoter' => 1
  161. ];
  162. $adminData = [
  163. 'account' => $data['account'],
  164. 'pwd' => $data['pwd'],
  165. 'conf_pwd' => $data['conf_pwd'],
  166. 'real_name' => $data['division_name'],
  167. 'roles' => $data['roles'],
  168. 'status' => 1,
  169. 'level' => 1,
  170. 'division_id' => $uid
  171. ];
  172. return $this->transaction(function () use ($uid, $agentData, $adminData, $aid, $userServices) {
  173. $agentData['division_invite'] = $userServices->value(['uid' => $uid], 'division_invite') ?: rand(10000000, 99999999);
  174. $userServices->update($uid, $agentData);
  175. /** @var SystemAdminServices $adminService */
  176. $adminService = app()->make(SystemAdminServices::class);
  177. if (!$aid) {
  178. if ($adminData['pwd']) {
  179. if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码');
  180. if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次输入的密码不一致');
  181. $adminService->create($adminData);
  182. } else {
  183. throw new AdminException('请输入确认密码');
  184. }
  185. } else {
  186. $adminInfo = $adminService->get($aid);
  187. if (!$adminInfo)
  188. throw new AdminException('管理员信息未查到');
  189. if ($adminInfo->is_del) {
  190. throw new AdminException('管理员已经删除');
  191. }
  192. if (!$adminData['real_name'])
  193. throw new AdminException('管理员姓名不能为空');
  194. if ($adminData['pwd']) {
  195. if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码');
  196. if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次输入的密码不一致');
  197. $adminInfo->pwd = $this->passwordHash($adminData['pwd']);
  198. }
  199. $adminInfo->real_name = $adminData['real_name'];
  200. $adminInfo->account = $adminData['account'];
  201. $adminInfo->roles = implode(',', $adminData['roles']);
  202. if ($adminInfo->save())
  203. return true;
  204. else
  205. return false;
  206. }
  207. return true;
  208. });
  209. }
  210. // /**
  211. // * 生成邀请码
  212. // * @return false|string
  213. // */
  214. // public function getDivisionInvite()
  215. // {
  216. // /** @var UserServices $userServices */
  217. // $userServices = app()->make(UserServices::class);
  218. // list($msec, $sec) = explode(' ', microtime());
  219. // $num = time() + mt_rand(10, 999999) . '' . substr($msec, 2, 3);//生成随机数
  220. // if (strlen($num) < 12)
  221. // $num = str_pad((string)$num, 8, 0, STR_PAD_RIGHT);
  222. // else
  223. // $num = substr($num, 0, 8);
  224. // if ($userServices->count(['division_invite' => $num])) {
  225. // return $this->getDivisionInvite();
  226. // }
  227. // return $num;
  228. // }
  229. /**
  230. * 添加编辑代理商
  231. * @param $uid
  232. * @return array
  233. * @throws \FormBuilder\Exception\FormBuilderException
  234. */
  235. public function getDivisionAgentForm($uid)
  236. {
  237. /** @var UserServices $userService */
  238. $userService = app()->make(UserServices::class);
  239. $userInfo = $userService->get($uid);
  240. if ($uid && !$userInfo) throw new AdminException('用户不存在');
  241. $field = [];
  242. $options = [];
  243. $divisionList = $userService->getDivisionList(['status' => 1, 'division_type' => 1], 'uid,division_name');
  244. foreach ($divisionList['list'] as $item) {
  245. $options[] = ['value' => $item['uid'], 'label' => $item['division_name']];
  246. }
  247. $field[] = Form::input('division_name', '代理商名称', $userInfo['division_name'] ?? '')->required('请输入代理商名称');
  248. if ($uid) {
  249. $field[] = Form::hidden('uid', $uid);
  250. $field[] = Form::hidden('edit', 1);
  251. $field[] = Form::hidden('division_id', $userInfo['division_id']);
  252. } else {
  253. $field[] = Form::select('division_id', '上级事业部', '')->setOptions(Form::setOptions($options))->filterable(1);
  254. $field[] = Form::frameImage('image', '关联用户', $this->url(config('app.admin_prefix', 'admin') . '/system.user/list', ['fodder' => 'image'], true))->icon('el-icon-user')->width('950px')->height('560px')->Props(['srcKey' => 'image', 'footer' => false]);
  255. $field[] = Form::hidden('edit', 0);
  256. }
  257. $field[] = Form::number('division_percent', '佣金比例', $userInfo['division_percent'] ?? '')->placeholder('代理商佣金比例1-100')->info('填写1-100,如填写50代表返佣50%,但是不能高于上级事业部的比例')->style(['width' => '173px'])->min(0)->max(100)->required();
  258. $field[] = Form::date('division_end_time', '到期时间', ($userInfo['division_end_time'] ?? '') != 0 ? date('Y-m-d H:i:s', $userInfo['division_end_time']) : '')->placeholder('代理商代理到期时间');
  259. $field[] = Form::radio('division_status', '代理状态', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
  260. return create_form('代理商', $field, Route::buildUrl('/agent/division/agent/save'), 'POST');
  261. }
  262. /**
  263. * 保存代理商
  264. * @param $data
  265. * @return bool
  266. * @throws \think\db\exception\DataNotFoundException
  267. * @throws \think\db\exception\DbException
  268. * @throws \think\db\exception\ModelNotFoundException
  269. */
  270. public function divisionAgentSave($data)
  271. {
  272. /** @var UserServices $userServices */
  273. $userServices = app()->make(UserServices::class);
  274. $uid = $data['uid'];
  275. $agentData = [
  276. 'spread_uid' => $data['division_id'],
  277. 'spread_time' => time(),
  278. 'division_id' => $data['division_id'],
  279. 'division_status' => $data['division_status'],
  280. 'division_percent' => $data['division_percent'],
  281. 'division_change_time' => time(),
  282. 'division_end_time' => strtotime($data['division_end_time']),
  283. 'division_type' => 2,
  284. 'is_agent' => 1,
  285. 'agent_id' => $uid,
  286. 'is_staff' => 0,
  287. 'staff_id' => 0,
  288. 'division_name' => $data['division_name'],
  289. 'is_promoter' => 1
  290. ];
  291. $division_info = $userServices->getUserInfo($data['division_id'], 'division_end_time,division_percent');
  292. if ($division_info) {
  293. if ($agentData['division_percent'] > $division_info['division_percent']) throw new AdminException('代理商佣金比例不能大于事业部佣金比例');
  294. if ($agentData['division_end_time'] > $division_info['division_end_time']) throw new AdminException('代理商到期时间不能大于事业部到期时间');
  295. }
  296. $res = $userServices->update($uid, $agentData);
  297. if ($res) return true;
  298. throw new AdminException('保存失败');
  299. }
  300. /**
  301. * 修改状态
  302. * @param $status
  303. * @param $uid
  304. * @return bool
  305. */
  306. public function setDivisionStatus($status, $uid)
  307. {
  308. /** @var UserServices $userServices */
  309. $userServices = app()->make(UserServices::class);
  310. /** @var SystemAdminServices $adminServices */
  311. $adminServices = app()->make(SystemAdminServices::class);
  312. $res = $userServices->update($uid, ['division_status' => $status]);
  313. $res = $res && $adminServices->update(['division_id' => $uid], ['status' => $status]);
  314. if ($res) {
  315. return true;
  316. } else {
  317. throw new AdminException('操作失败');
  318. }
  319. }
  320. /**
  321. * 删除事业部/代理商
  322. * @param $type
  323. * @param $uid
  324. * @return mixed
  325. */
  326. public function delDivision($type, $uid)
  327. {
  328. return $this->transaction(function () use ($type, $uid) {
  329. /** @var UserServices $userServices */
  330. $userServices = app()->make(UserServices::class);
  331. $userInfo = $userServices->getUserInfo($uid);
  332. if (!$userInfo) throw new AdminException('用户不存在');
  333. $userInfo = $userInfo->toArray();
  334. $data = [
  335. 'division_name' => '',
  336. 'division_type' => 0,
  337. 'division_status' => 0,
  338. 'is_division' => 0,
  339. 'is_agent' => 0,
  340. 'is_staff' => 0,
  341. 'division_id' => 0,
  342. 'agent_id' => 0,
  343. 'staff_id' => 0,
  344. 'division_percent' => 0,
  345. 'division_end_time' => 0,
  346. 'division_change_time' => time(),
  347. 'division_invite' => 0
  348. ];
  349. $userServices->update(['uid' => $uid], $data);
  350. if ($userInfo['division_type'] == 1) {
  351. app()->make(SystemAdminServices::class)->delete(['division_id' => $uid]);
  352. $userServices->update(['division_id' => $uid], $data);
  353. } elseif ($userInfo['division_type'] == 2) {
  354. app()->make(DivisionAgentApplyServices::class)->delete(['uid' => $uid]);
  355. $userServices->update(['agent_id' => $uid], $data);
  356. } elseif ($userInfo['division_type'] == 3) {
  357. $userServices->update(['staff_id' => $uid], $data);
  358. }
  359. });
  360. }
  361. /**
  362. * 后台添加员工
  363. * @param $uid
  364. * @return array
  365. * @throws \FormBuilder\Exception\FormBuilderException
  366. * @author 吴汐
  367. * @email 442384644@qq.com
  368. * @date 2024/1/22
  369. */
  370. public function getDivisionStaffForm($uid)
  371. {
  372. $field = [];
  373. $field[] = Form::frameImage('image', '员工', $this->url(config('app.admin_prefix', 'admin') . '/system.user/list', ['fodder' => 'image'], true))->icon('el-icon-user')->width('950px')->height('560px')->Props(['srcKey' => 'image', 'footer' => false]);
  374. $field[] = Form::number('division_percent', '佣金比例', '')->placeholder('员工佣金比例1-100')->info('填写1-100,如填写50代表返佣50%,但是不能高于上级代理商的比例')->style(['width' => '173px'])->min(0)->max(100)->required();
  375. $field[] = Form::hidden('agent_id', $uid);
  376. return create_form('员工', $field, Route::buildUrl('/agent/division/staff/save'), 'POST');
  377. }
  378. /**
  379. * 保存员工
  380. * @param $data
  381. * @return true
  382. * @throws \think\db\exception\DataNotFoundException
  383. * @throws \think\db\exception\DbException
  384. * @throws \think\db\exception\ModelNotFoundException
  385. * @author 吴汐
  386. * @email 442384644@qq.com
  387. * @date 2024/1/22
  388. */
  389. public function divisionStaffSave($data)
  390. {
  391. $data['uid'] = $data['image']['uid'];
  392. /** @var UserServices $userServices */
  393. $userServices = app()->make(UserServices::class);
  394. $userInfo = $userServices->getUserInfo($data['uid'], 'is_division,is_agent,is_staff,division_id,agent_id,staff_id,division_end_time,division_percent');
  395. if (!$userInfo) throw new AdminException('用户不存在');
  396. if ($userInfo['is_division']) throw new AdminException('此用户是事业部,无法绑定为员工');
  397. if ($userInfo['is_agent']) throw new AdminException('此用户是代理商,无法绑定为员工');
  398. if ($userInfo['is_staff'] && $userInfo['agent_id'] == $data['agent_id']) throw new AdminException('此用户是您的员工,请勿重复添加');
  399. $agentInfo = $userServices->getUserInfo($data['agent_id'], 'division_id,agent_id,division_end_time,division_percent');
  400. $staffData = [
  401. 'spread_uid' => $data['agent_id'],
  402. 'spread_time' => time(),
  403. 'division_type' => 3,
  404. 'division_status' => 1,
  405. 'is_staff' => 1,
  406. 'division_id' => $agentInfo['division_id'],
  407. 'agent_id' => $agentInfo['agent_id'],
  408. 'staff_id' => $data['uid'],
  409. 'division_percent' => $data['division_percent'],
  410. 'division_change_time' => time(),
  411. 'division_end_time' => $agentInfo['division_end_time'],
  412. 'is_promoter' => 1
  413. ];
  414. if ($staffData['division_percent'] > $agentInfo['division_percent']) throw new AdminException('代理商佣金比例不能大于事业部佣金比例');
  415. if ($userInfo['agent_id'] != 0 && $userInfo['agent_id'] != $agentInfo['agent_id']) {
  416. $userServices->update(['staff_id' => $userInfo['uid'], 'spread_uid' => $userInfo['uid']], ['spread_uid' => $agentInfo['agent_id'], 'staff_id' => 0]);
  417. $userServices->getSearch(['staff_id' => $userInfo['uid'], 'not_spread_uid' => $userInfo['uid']])->update(['staff_id' => 0]);
  418. }
  419. $res = $userServices->update($data['uid'], $staffData);
  420. if ($res) return true;
  421. throw new AdminException('保存失败');
  422. }
  423. /**
  424. * 扫码绑定员工
  425. * @param $uid
  426. * @param int $agentId
  427. * @param int $agentCode
  428. * @return string
  429. * @throws DataNotFoundException
  430. * @throws DbException
  431. * @throws ModelNotFoundException
  432. * @author 吴汐
  433. * @email 442384644@qq.com
  434. * @date 2024/2/2
  435. */
  436. public function agentSpreadStaff($uid, int $agentId = 0, int $agentCode = 0)
  437. {
  438. if ($agentCode && !$agentId) {
  439. /** @var QrcodeServices $qrCode */
  440. $qrCode = app()->make(QrcodeServices::class);
  441. if ($info = $qrCode->getOne(['id' => $agentCode, 'third_type' => 'agent', 'status' => 1])) {
  442. $agentId = $info['third_id'];
  443. }
  444. }
  445. if (!$agentId) return false;
  446. if ($uid == $agentId) return '自己不能推荐自己';
  447. /** @var UserServices $userServices */
  448. $userServices = app()->make(UserServices::class);
  449. $agentInfo = $userServices->getUserInfo($agentId, 'division_id,agent_id,division_end_time,division_percent');
  450. if (!$agentInfo) return '上级用户不存在';
  451. $userInfo = $userServices->getUserInfo($uid, 'is_division,is_agent,is_staff,division_id,agent_id,staff_id,division_end_time,division_percent');
  452. if (!$userInfo) return '用户不存在';
  453. if ($userInfo['is_division']) return '您是事业部,不能绑定成为别人的员工';
  454. if ($userInfo['is_agent']) return '您是代理商,不能绑定成为别人的员工';
  455. $staffData = [
  456. 'spread_uid' => $agentId,
  457. 'spread_time' => time(),
  458. 'division_type' => 3,
  459. 'division_status' => 1,
  460. 'is_staff' => 1,
  461. 'division_id' => $agentInfo['division_id'],
  462. 'agent_id' => $agentInfo['agent_id'],
  463. 'staff_id' => $uid,
  464. 'division_change_time' => time(),
  465. 'is_promoter' => 1
  466. ];
  467. if ($userInfo['agent_id'] != 0 && $userInfo['agent_id'] != $agentInfo['agent_id']) {
  468. $userServices->update(['staff_id' => $userInfo['uid'], 'spread_uid' => $userInfo['uid']], ['spread_uid' => $agentInfo['agent_id'], 'staff_id' => 0]);
  469. $userServices->update(['staff_id' => $userInfo['uid'], 'not_spread_uid' => $userInfo['uid']], ['staff_id' => 0]);
  470. }
  471. $res = $userServices->update($uid, $staffData);
  472. if ($res) return '绑定员工成功';
  473. return '绑定员工失败';
  474. }
  475. /**
  476. * 获取返佣比例佣金比例
  477. * 当前方法会将获得的佣金逐步的递减
  478. * @param $uid
  479. * @param $storeBrokerageRatio
  480. * @param $storeBrokerageRatioTwo
  481. * @param $isSelfBrokerage
  482. * @return array
  483. */
  484. public function getDivisionPercent($uid, $storeBrokerageRatio, $storeBrokerageRatioTwo, $isSelfBrokerage)
  485. {
  486. $division_open = (int)sys_config('division_status', 1);
  487. if (!$division_open) {
  488. /** 代理商关闭 */
  489. $storeBrokerageOne = $storeBrokerageRatio;
  490. $storeBrokerageTwo = $storeBrokerageRatioTwo;
  491. $staffPercent = 0;
  492. $agentPercent = 0;
  493. $divisionPercent = 0;
  494. } else {
  495. /** @var UserServices $userServices */
  496. $userServices = app()->make(UserServices::class);
  497. $userInfo = $userServices->get($uid);
  498. if ($userInfo['is_division'] == 1) {
  499. /** 自己是事业部 */
  500. $storeBrokerageOne = 0;
  501. $storeBrokerageTwo = 0;
  502. $staffPercent = 0;
  503. $agentPercent = 0;
  504. if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) {
  505. $divisionPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0;
  506. } else {
  507. $divisionPercent = 0;
  508. }
  509. } elseif ($userInfo['is_agent'] == 1) {
  510. /** 自己是代理商 */
  511. $divisionInfo = $userServices->get($userInfo['division_id']);
  512. $storeBrokerageOne = 0;
  513. $storeBrokerageTwo = 0;
  514. $staffPercent = 0;
  515. if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) {
  516. $agentPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0;
  517. } else {
  518. $agentPercent = 0;
  519. }
  520. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  521. $divisionPercent = bcsub($divisionInfo['division_percent'], $agentPercent, 2);
  522. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  523. } else {
  524. $divisionPercent = 0;
  525. }
  526. } elseif ($userInfo['is_staff'] == 1) { // 自己是员工
  527. /** 自己是员工 */
  528. $agentInfo = $userServices->get($userInfo['agent_id']);
  529. $divisionInfo = $userServices->get($userInfo['division_id']);
  530. $storeBrokerageOne = 0;
  531. $storeBrokerageTwo = 0;
  532. if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) {
  533. $staffPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0;
  534. } else {
  535. $staffPercent = 0;
  536. }
  537. if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) {
  538. $agentPercent = bcsub($agentInfo['division_percent'], $staffPercent, 2);
  539. $agentPercent = $agentPercent < 0 ? 0 : $agentPercent;
  540. } else {
  541. $agentPercent = 0;
  542. }
  543. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  544. $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($staffPercent, $agentPercent, 2), 2);
  545. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  546. } else {
  547. $divisionPercent = 0;
  548. }
  549. } else {
  550. /** 自己是普通用户 */
  551. $staffInfo = $userServices->get($userInfo['staff_id']);
  552. $agentInfo = $userServices->get($userInfo['agent_id']);
  553. $divisionInfo = $userServices->get($userInfo['division_id']);
  554. if ($userInfo['staff_id']) {
  555. /** 该用户为员工推广 */
  556. if ($userInfo['staff_id'] == $userInfo['spread_uid']) {
  557. /** 员工直接下级 */
  558. $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  559. $storeBrokerageTwo = 0;
  560. if ($staffInfo['division_status'] == 1 && $staffInfo['division_end_time'] > time()) {
  561. $staffPercent = bcsub($staffInfo['division_percent'], $storeBrokerageOne, 2);
  562. $staffPercent = $staffPercent < 0 ? 0 : $staffPercent;
  563. } else {
  564. $staffPercent = 0;
  565. }
  566. if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) {
  567. $agentPercent = bcsub($agentInfo['division_percent'], bcadd($storeBrokerageOne, $staffPercent, 2), 2);
  568. $agentPercent = $agentPercent < 0 ? 0 : $agentPercent;
  569. } else {
  570. $agentPercent = 0;
  571. }
  572. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  573. $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd(bcadd($storeBrokerageOne, $staffPercent, 2), $agentPercent, 2), 2);
  574. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  575. } else {
  576. $divisionPercent = 0;
  577. }
  578. } else {
  579. $storeBrokerageOne = $storeBrokerageRatio;
  580. $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['staff_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo;
  581. $brokerageOneTwo = bcadd($storeBrokerageOne, $storeBrokerageTwo, 2);
  582. if ($staffInfo['division_status'] == 1 && $staffInfo['division_end_time'] > time()) {
  583. $staffPercent = bcsub($staffInfo['division_percent'], $brokerageOneTwo, 2);
  584. $staffPercent = $staffPercent < 0 ? 0 : $staffPercent;
  585. } else {
  586. $staffPercent = 0;
  587. }
  588. if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) {
  589. $agentPercent = bcsub($agentInfo['division_percent'], bcadd($brokerageOneTwo, $staffPercent, 2), 2);
  590. $agentPercent = $agentPercent < 0 ? 0 : $agentPercent;
  591. } else {
  592. $agentPercent = 0;
  593. }
  594. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  595. $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd(bcadd($brokerageOneTwo, $staffPercent, 2), $agentPercent, 2), 2);
  596. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  597. } else {
  598. $divisionPercent = 0;
  599. }
  600. }
  601. } elseif ($userInfo['agent_id']) {
  602. /** 该用户为代理商推广 */
  603. if ($userInfo['agent_id'] == $userInfo['spread_uid']) {
  604. $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  605. $storeBrokerageTwo = 0;
  606. $staffPercent = 0;
  607. if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) {
  608. $agentPercent = bcsub($agentInfo['division_percent'], $storeBrokerageOne, 2);
  609. $agentPercent = $agentPercent < 0 ? 0 : $agentPercent;
  610. } else {
  611. $agentPercent = 0;
  612. }
  613. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  614. $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($storeBrokerageOne, $agentPercent, 2), 2);
  615. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  616. } else {
  617. $divisionPercent = 0;
  618. }
  619. } else {
  620. $storeBrokerageOne = $storeBrokerageRatio;
  621. $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['agent_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo;
  622. $brokerageOneTwo = bcadd($storeBrokerageOne, $storeBrokerageTwo, 2);
  623. $staffPercent = 0;
  624. if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) {
  625. $agentPercent = bcsub($agentInfo['division_percent'], $brokerageOneTwo, 2);
  626. $agentPercent = $agentPercent < 0 ? 0 : $agentPercent;
  627. } else {
  628. $agentPercent = 0;
  629. }
  630. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  631. $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($brokerageOneTwo, $agentPercent, 2), 2);
  632. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  633. } else {
  634. $divisionPercent = 0;
  635. }
  636. }
  637. } elseif ($userInfo['division_id']) {
  638. /** 该用户为事业部推广 */
  639. if ($userInfo['division_id'] == $userInfo['spread_uid']) {
  640. /** 事业部直接下级 */
  641. $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  642. $storeBrokerageTwo = 0;
  643. $staffPercent = 0;
  644. $agentPercent = 0;
  645. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  646. $divisionPercent = bcsub($divisionInfo['division_percent'], $storeBrokerageOne, 2);
  647. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  648. } else {
  649. $divisionPercent = 0;
  650. }
  651. } else {
  652. $storeBrokerageOne = $storeBrokerageRatio;
  653. $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['division_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo;
  654. $brokerageOneTwo = bcadd($storeBrokerageOne, $storeBrokerageTwo, 2);
  655. $staffPercent = 0;
  656. $agentPercent = 0;
  657. if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) {
  658. $divisionPercent = bcsub($divisionInfo['division_percent'], $brokerageOneTwo, 2);
  659. $divisionPercent = $divisionPercent < 0 ? 0 : $divisionPercent;
  660. } else {
  661. $divisionPercent = 0;
  662. }
  663. }
  664. } else {
  665. /** 没有任何代理商关系 */
  666. $storeBrokerageOne = $storeBrokerageRatio;
  667. $storeBrokerageTwo = $storeBrokerageRatioTwo;
  668. $staffPercent = 0;
  669. $agentPercent = 0;
  670. $divisionPercent = 0;
  671. }
  672. }
  673. }
  674. return [max($storeBrokerageOne, 0), max($storeBrokerageTwo, 0), max($staffPercent, 0), max($agentPercent, 0), max($divisionPercent, 0)];
  675. }
  676. /**
  677. * 事业部统计
  678. * @param $type
  679. * @param $time
  680. * @param $page
  681. * @param $limit
  682. * @param $sort
  683. * @param $order
  684. * @return mixed
  685. * @author wuhaotian
  686. * @email 442384644@qq.com
  687. * @date 2025/4/8
  688. */
  689. public function divisionStatistics($type, $time, $page, $limit, $sort, $order)
  690. {
  691. switch ($type) {
  692. case 1:
  693. $field = 'division_id';
  694. break;
  695. case 2:
  696. $field = 'agent_id';
  697. break;
  698. case 3:
  699. $field = 'staff_id';
  700. break;
  701. default:
  702. $field = 'division_id';
  703. }
  704. $data = app()->make(StoreOrderServices::class)->divisionStatistics($field, $time, $page, $limit, $sort, $order);
  705. $uids = array_column($data['list'], $field);
  706. $userInfos = app()->make(UserServices::class)->getColumn(['uid' => $uids], 'uid,nickname,avatar', 'uid');
  707. foreach ($data['list'] as $key => &$val) {
  708. $val['uid'] = $val[$field];
  709. $val['name'] = $userInfos[$val[$field]]['nickname'];
  710. $val['avatar'] = set_file_url($userInfos[$val[$field]]['avatar']);
  711. }
  712. return $data;
  713. }
  714. }