DivisionServices.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <?php
  2. namespace app\services\agent;
  3. use app\services\BaseServices;
  4. use app\services\system\admin\SystemAdminServices;
  5. use app\services\system\admin\SystemRoleServices;
  6. use app\services\user\UserServices;
  7. use crmeb\exceptions\AdminException;
  8. use crmeb\services\FormBuilder as Form;
  9. use think\exception\ValidateException;
  10. use think\facade\Route;
  11. class DivisionServices extends BaseServices
  12. {
  13. /**
  14. * 获取事业部/代理/员工列表
  15. * @param array $where
  16. * @return array
  17. * @throws \think\db\exception\DataNotFoundException
  18. * @throws \think\db\exception\DbException
  19. * @throws \think\db\exception\ModelNotFoundException
  20. */
  21. public function getDivisionList(array $where = [])
  22. {
  23. /** @var UserServices $userServices */
  24. $userServices = app()->make(UserServices::class);
  25. $data = $userServices->getDivisionList($where + ['status' => 1], 'uid,nickname,avatar,division_percent,division_end_time,division_status,division_invite');
  26. foreach ($data['list'] as &$item) {
  27. $item['division_end_time'] = date('Y-m-d', $item['division_end_time']);
  28. $item['agent_count'] = $userServices->count([
  29. $where['division_type'] == 1 ? 'division_id' : 'agent_id' => $item['uid'],
  30. 'division_type' => $where['division_type'] + 1,
  31. 'status' => 1
  32. ]);
  33. unset($item['label']);
  34. }
  35. return $data;
  36. }
  37. /**
  38. * 下级列表
  39. * @param $type
  40. * @param $uid
  41. * @return array
  42. * @throws \think\db\exception\DataNotFoundException
  43. * @throws \think\db\exception\DbException
  44. * @throws \think\db\exception\ModelNotFoundException
  45. */
  46. public function divisionDownList($type, $uid)
  47. {
  48. /** @var UserServices $userServices */
  49. $userServices = app()->make(UserServices::class);
  50. $where = [
  51. $type == 2 ? 'division_id' : 'agent_id' => $uid,
  52. 'division_type' => $type
  53. ];
  54. $data = $userServices->getDivisionList($where + ['status' => 1], 'uid,nickname,avatar,division_percent,division_end_time,division_status');
  55. foreach ($data['list'] as &$item) {
  56. $item['division_end_time'] = date('Y-m-d', $item['division_end_time']);
  57. $item['agent_count'] = $userServices->count([
  58. $type == 2 ? 'division_id' : 'agent_id' => $item['uid'],
  59. 'division_type' => $type + 1,
  60. 'status' => 1
  61. ]);
  62. unset($item['label']);
  63. }
  64. return $data;
  65. }
  66. /**
  67. * 添加编辑事业部表单
  68. * @param $uid
  69. * @return array
  70. * @throws \FormBuilder\Exception\FormBuilderException
  71. */
  72. public function getDivisionForm($uid)
  73. {
  74. /** @var UserServices $userServices */
  75. $userServices = app()->make(UserServices::class);
  76. /** @var SystemAdminServices $adminService */
  77. $adminService = app()->make(SystemAdminServices::class);
  78. $userInfo = $userServices->getUserInfo($uid);
  79. if ($uid && !$userInfo) throw new AdminException('参数错误,找不到用户');
  80. if ($uid) {
  81. $adminInfo = $adminService->getInfo(['division_id' => $uid])->toArray();
  82. if (isset($adminInfo['roles'])) {
  83. foreach ($adminInfo['roles'] as &$item) {
  84. $item = intval($item);
  85. }
  86. }
  87. }
  88. $field = [];
  89. $title = '事业部';
  90. if ($uid) {
  91. $field[] = Form::number('uid', '用户UID', $userInfo['uid'])->disabled(true)->style(['width' => '173px']);
  92. } else {
  93. $field[] = Form::number('uid', '用户UID')->required('请填写用户UID')->style(['width' => '173px']);
  94. }
  95. $field[] = Form::hidden('aid', $adminInfo['id'] ?? 0);
  96. $field[] = Form::number('division_percent', '佣金比例', $userInfo['division_percent'] ?? '')->placeholder('区域代理佣金比例1-100')->info('填写1-100,如填写50代表返佣50%')->style(['width' => '173px'])->min(0)->max(100)->required();
  97. $field[] = Form::date('division_end_time', '到期时间', ($userInfo['division_end_time'] ?? '') != 0 ? date('Y-m-d H:i:s', $userInfo['division_end_time']) : '')->placeholder('区域代理到期时间')->required();
  98. $field[] = Form::radio('division_status', '代理状态', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
  99. $field[] = Form::input('account', '管理账号', $adminInfo['account'] ?? '')->required('请填写管理员账号');
  100. $field[] = Form::input('pwd', '管理密码')->type('password')->placeholder('请填写管理员密码');
  101. $field[] = Form::input('conf_pwd', '确认密码')->type('password')->placeholder('请输入确认密码');
  102. $field[] = Form::input('real_name', '区域代理姓名', $adminInfo['real_name'] ?? '')->required('请输入管理员姓名');
  103. /** @var SystemRoleServices $service */
  104. $service = app()->make(SystemRoleServices::class);
  105. $options = $service->getRoleFormSelect(1);
  106. $field[] = Form::select('roles', '管理员身份', $adminInfo['roles'] ?? [])->setOptions(Form::setOptions($options))->multiple(true)->required('请选择管理员身份');
  107. return create_form($title, $field, Route::buildUrl('/agent/division/save'), 'POST');
  108. }
  109. /**
  110. * 保存事业部数据
  111. * @param $data
  112. * @return mixed
  113. */
  114. public function divisionSave($data)
  115. {
  116. if ((int)$data['uid'] == 0) throw new AdminException('请填写用户UID');
  117. $uid = $data['uid'];
  118. $aid = $data['aid'];
  119. $agentData = [
  120. 'division_percent' => $data['division_percent'],
  121. 'division_end_time' => strtotime($data['division_end_time']),
  122. 'division_change_time' => time(),
  123. 'is_division' => 1,
  124. 'is_agent' => 0,
  125. 'is_staff' => 0,
  126. 'division_id' => $uid,
  127. 'division_type' => 1,
  128. 'division_status' => $data['division_status'],
  129. 'spread_uid' => 0,
  130. 'spread_time' => 0
  131. ];
  132. $adminData = [
  133. 'account' => $data['account'],
  134. 'pwd' => $data['pwd'],
  135. 'conf_pwd' => $data['conf_pwd'],
  136. 'real_name' => $data['real_name'],
  137. 'roles' => $data['roles'],
  138. 'status' => 1,
  139. 'level' => 1,
  140. 'division_id' => $uid
  141. ];
  142. return $this->transaction(function () use ($uid, $agentData, $adminData, $aid) {
  143. /** @var UserServices $userServices */
  144. $userServices = app()->make(UserServices::class);
  145. $agentData['division_invite'] = $userServices->value(['uid' => $uid], 'division_invite') ?: rand(10000000, 99999999);
  146. $userServices->update($uid, $agentData);
  147. /** @var SystemAdminServices $adminService */
  148. $adminService = app()->make(SystemAdminServices::class);
  149. if (!$aid) {
  150. if ($adminData['pwd']) {
  151. if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码');
  152. if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次输入的密码不一致');
  153. $adminService->create($adminData);
  154. } else {
  155. throw new AdminException('请输入密码');
  156. }
  157. } else {
  158. $adminInfo = $adminService->get($aid);
  159. if (!$adminInfo)
  160. throw new AdminException('管理员信息未查到');
  161. if ($adminInfo->is_del) {
  162. throw new AdminException('管理员已经删除');
  163. }
  164. if (!$adminData['real_name'])
  165. throw new AdminException('管理员姓名不能为空');
  166. if ($adminData['pwd']) {
  167. if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码');
  168. if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次输入的密码不一致');
  169. $adminInfo->pwd = $this->passwordHash($adminData['pwd']);
  170. }
  171. $adminInfo->real_name = $adminData['real_name'];
  172. $adminInfo->account = $adminData['account'];
  173. $adminInfo->roles = implode(',', $adminData['roles']);
  174. if ($adminInfo->save())
  175. return true;
  176. else
  177. return false;
  178. }
  179. return true;
  180. });
  181. }
  182. // /**
  183. // * 生成邀请码
  184. // * @return false|string
  185. // */
  186. // public function getDivisionInvite()
  187. // {
  188. // /** @var UserServices $userServices */
  189. // $userServices = app()->make(UserServices::class);
  190. // list($msec, $sec) = explode(' ', microtime());
  191. // $num = time() + mt_rand(10, 999999) . '' . substr($msec, 2, 3);//生成随机数
  192. // if (strlen($num) < 12)
  193. // $num = str_pad((string)$num, 8, 0, STR_PAD_RIGHT);
  194. // else
  195. // $num = substr($num, 0, 8);
  196. // if ($userServices->count(['division_invite' => $num])) {
  197. // return $this->getDivisionInvite();
  198. // }
  199. // return $num;
  200. // }
  201. /**
  202. * 添加编辑代理商
  203. * @param $uid
  204. * @return array
  205. * @throws \FormBuilder\Exception\FormBuilderException
  206. */
  207. public function getDivisionAgentForm($uid)
  208. {
  209. /** @var UserServices $userService */
  210. $userService = app()->make(UserServices::class);
  211. $userInfo = $userService->get($uid);
  212. if ($uid && !$userInfo) throw new AdminException('参数错误,找不到用户');
  213. $field = [];
  214. if ($uid) {
  215. $field[] = Form::number('uid', '用户UID', $userInfo['uid'] ?? '')->disabled(true)->style(['width' => '173px']);
  216. $field[] = Form::hidden('edit', 1);
  217. } else {
  218. $field[] = Form::number('uid', '用户UID')->style(['width' => '173px']);
  219. $field[] = Form::hidden('edit', 0);
  220. }
  221. $field[] = Form::number('division_percent', '佣金比例', $userInfo['division_percent'] ?? '')->placeholder('代理商佣金比例1-100')->info('填写1-100,如填写50代表返佣50%,但是不能高于上级事业部的比例')->style(['width' => '173px'])->min(0)->max(100)->required();
  222. $field[] = Form::date('division_end_time', '到期时间', ($userInfo['division_end_time'] ?? '') != 0 ? date('Y-m-d H:i:s', $userInfo['division_end_time']) : '')->placeholder('代理商代理到期时间')->required();
  223. $field[] = Form::radio('division_status', '代理状态', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
  224. return create_form('代理商', $field, Route::buildUrl('/agent/division/agent/save'), 'POST');
  225. }
  226. /**
  227. * 保存代理商
  228. * @param $data
  229. * @return bool
  230. */
  231. public function divisionAgentSave($data)
  232. {
  233. /** @var UserServices $userServices */
  234. $userServices = app()->make(UserServices::class);
  235. $uid = $data['uid'];
  236. $userInfo = $userServices->getUserInfo($uid, 'is_division,division_id,agent_id');
  237. if (!$data['edit'] && $data['division_id'] != 0) {
  238. if ($userInfo['is_division']) throw new AdminException('对方是事业部,您不能添加为代理商');
  239. if ($userInfo['division_id'] == $data['division_id']) throw new AdminException('对方是您的代理商,请勿重复添加');
  240. if ($userInfo['division_id']) throw new AdminException('对方已经是代理商,无法添加到您的下级');
  241. }
  242. $agentData = [
  243. 'division_id' => $data['division_id'],
  244. 'agent_id' => $uid,
  245. 'division_type' => 2,
  246. 'division_status' => $data['division_status'],
  247. 'is_agent' => 1,
  248. 'division_percent' => $data['division_percent'],
  249. 'division_change_time' => time(),
  250. 'division_end_time' => strtotime($data['division_end_time']),
  251. 'spread_uid' => $data['division_id'],
  252. 'spread_time' => time()
  253. ];
  254. $division_info = $userServices->getUserInfo($agentData['division_id'], 'division_end_time,division_percent');
  255. if ($data['division_id'] != 0) {
  256. if ($agentData['division_percent'] > $division_info['division_percent']) throw new AdminException('代理商佣金比例不能大于事业部佣金比例');
  257. if ($agentData['division_end_time'] > $division_info['division_end_time']) throw new AdminException('代理商到期时间不能大于事业部到期时间');
  258. }
  259. $res = $userServices->update($uid, $agentData);
  260. if ($res) return true;
  261. throw new AdminException('保存失败');
  262. }
  263. /**
  264. * 修改状态
  265. * @param $status
  266. * @param $uid
  267. * @return bool
  268. */
  269. public function setDivisionStatus($status, $uid)
  270. {
  271. /** @var UserServices $userServices */
  272. $userServices = app()->make(UserServices::class);
  273. /** @var SystemAdminServices $adminServices */
  274. $adminServices = app()->make(SystemAdminServices::class);
  275. $res = $userServices->update($uid, ['division_status' => $status]);
  276. $res = $res && $adminServices->update(['division_id' => $uid], ['status' => $status]);
  277. if ($res) {
  278. return true;
  279. } else {
  280. throw new AdminException('操作失败');
  281. }
  282. }
  283. /**
  284. * 删除事业部/代理商
  285. * @param $type
  286. * @param $uid
  287. * @return mixed
  288. */
  289. public function delDivision($type, $uid)
  290. {
  291. return $this->transaction(function () use ($type, $uid) {
  292. /** @var UserServices $userServices */
  293. $userServices = app()->make(UserServices::class);
  294. switch ($type) {
  295. case 1:
  296. /** @var SystemAdminServices $adminService */
  297. $adminService = app()->make(SystemAdminServices::class);
  298. $adminService->delete(['division_id' => $uid]);
  299. break;
  300. }
  301. $data = [
  302. 'division_type' => 0,
  303. 'division_status' => 0,
  304. 'is_division' => 0,
  305. 'division_id' => 0,
  306. 'is_agent' => 0,
  307. 'agent_id' => 0,
  308. 'is_staff' => 0,
  309. 'staff_id' => 0,
  310. 'division_change_time' => time()
  311. ];
  312. $userServices->update($uid, $data);
  313. //删除申请代理商记录
  314. /** @var DivisionAgentApplyServices $divisionApply */
  315. $divisionApply = app()->make(DivisionAgentApplyServices::class);
  316. $divisionApply->update(['uid' => $uid], ['is_del' => 1]);
  317. });
  318. }
  319. /**
  320. * 获取比例
  321. * @param $uid
  322. * @return array
  323. */
  324. public function getDivisionPercent($uid, $storeBrokerageRatio, $storeBrokerageTwo, $isSelfBrokerage)
  325. {
  326. $field = ['is_staff', 'is_agent', 'is_division', 'division_percent', 'division_end_time', 'staff_id', 'agent_id', 'division_id'];
  327. /** @var UserServices $userServices */
  328. $userServices = app()->make(UserServices::class);
  329. $userInfo = $userServices->get(['uid' => $uid], $field);
  330. if (!$userInfo) throw new ValidateException('用户错误');
  331. if ($userInfo['staff_id'] || $userInfo['agent_id'] || $userInfo['division_id']) {
  332. $spread_uid = $userServices->getSpreadUid($uid);
  333. $spread_uid_two = $userServices->getSpreadUid($spread_uid);
  334. $oneSpreadInfo = $userServices->get(['uid' => $spread_uid], $field);
  335. if (isset($oneSpreadInfo['is_division']) && $oneSpreadInfo['is_division'] == 1 && $oneSpreadInfo['division_end_time'] > time()) {
  336. $storeBrokerageRatio = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  337. $storeBrokerageTwo = 0;
  338. $staffPercent = 0;
  339. $agentPercent = 0;
  340. $divisionPercent = $oneSpreadInfo['division_percent'] - $storeBrokerageRatio;
  341. } elseif (isset($oneSpreadInfo['is_agent']) && $oneSpreadInfo['is_agent'] == 1 && $oneSpreadInfo['division_end_time'] > time()) {
  342. $twoSpreadInfo = $userServices->get(['uid' => $userInfo['division_id']], $field);
  343. $storeBrokerageRatio = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  344. $storeBrokerageTwo = 0;
  345. $staffPercent = 0;
  346. $agentPercent = $oneSpreadInfo['division_percent'] - $storeBrokerageRatio;
  347. $divisionPercent = $twoSpreadInfo['division_percent'] - $oneSpreadInfo['division_percent'];
  348. } elseif (isset($oneSpreadInfo['is_staff']) && $oneSpreadInfo['is_staff'] == 1) {
  349. $twoSpreadInfo = $userServices->get(['uid' => $userInfo['agent_id']], $field);
  350. $threeSpreadInfo = $userServices->get(['uid' => $userInfo['division_id']], $field);
  351. $storeBrokerageRatio = $isSelfBrokerage ? $storeBrokerageRatio : 0;
  352. $storeBrokerageTwo = 0;
  353. $staffPercent = $oneSpreadInfo['division_percent'] - $storeBrokerageRatio;
  354. $agentPercent = $twoSpreadInfo['division_percent'] - $oneSpreadInfo['division_percent'];
  355. $divisionPercent = $threeSpreadInfo['division_percent'] - $twoSpreadInfo['division_percent'];
  356. } elseif (isset($oneSpreadInfo['is_staff']) && $oneSpreadInfo['is_staff'] == 0 && $userServices->value(['uid' => $spread_uid_two], 'is_staff') == 1) {
  357. $twoSpreadInfo = $userServices->get(['uid' => $spread_uid_two], $field);
  358. $threeSpreadInfo = $userServices->get(['uid' => $userInfo['agent_id']], $field);
  359. $fourSpreadInfo = $userServices->get(['uid' => $userInfo['division_id']], $field);
  360. $storeBrokerageRatio = $storeBrokerageRatio;
  361. $storeBrokerageTwo = $isSelfBrokerage ? $storeBrokerageTwo : 0;
  362. $staffPercent = $isSelfBrokerage ? 0 : $twoSpreadInfo['division_percent'] - $storeBrokerageRatio;
  363. $agentPercent = $isSelfBrokerage ? $threeSpreadInfo['division_percent'] - $storeBrokerageRatio - $storeBrokerageTwo : $threeSpreadInfo['division_percent'] - $twoSpreadInfo['division_percent'];
  364. $divisionPercent = $fourSpreadInfo['division_percent'] - $threeSpreadInfo['division_percent'];
  365. } else {
  366. $twoSpreadInfo = $userServices->get(['uid' => $userInfo['agent_id']], $field);
  367. $threeSpreadInfo = $userServices->get(['uid' => $userInfo['division_id']], $field);
  368. $storeBrokerageRatio = $storeBrokerageRatio;
  369. $storeBrokerageTwo = $storeBrokerageTwo;
  370. $staffPercent = 0;
  371. if (isset($twoSpreadInfo['is_agent']) && $twoSpreadInfo['is_agent'] == 1 && $twoSpreadInfo['division_end_time'] > time()) {
  372. $agentPercent = $twoSpreadInfo['division_percent'] - $storeBrokerageRatio - $storeBrokerageTwo;
  373. } else {
  374. $agentPercent = 0;
  375. }
  376. if (isset($threeSpreadInfo['is_division']) && $threeSpreadInfo['is_division'] == 1 && $threeSpreadInfo['division_end_time'] > time() && $uid != $threeSpreadInfo['division_id']) {
  377. $divisionPercent = $threeSpreadInfo['division_percent'] - ($twoSpreadInfo['division_percent'] ?? 0);
  378. } else {
  379. $divisionPercent = 0;
  380. }
  381. }
  382. return [$storeBrokerageRatio, $storeBrokerageTwo, $staffPercent, $agentPercent, $divisionPercent];
  383. } else {
  384. return [$storeBrokerageRatio, $storeBrokerageTwo, 0, 0, 0];
  385. }
  386. }
  387. }