make(UserServices::class); $data = $userServices->getUserList($where + ['status' => 1, 'is_del' => 0], 'uid,nickname,avatar,division_id,division_name,division_type,division_percent,division_end_time,division_change_time,division_status,division_invite', 'division_change_time desc' ); if ($where['division_type'] == 2) { $divisionUpIds = array_column($data['list'], 'division_id'); $divisionUpIds = array_unique($divisionUpIds); $divisionUpInfos = $userServices->getColumn(['division_id' => $divisionUpIds, 'division_type' => 1], 'division_name', 'division_id'); } $divisionCount = $userServices->getDivisionCount($where['division_type'], array_column($data['list'], 'uid')); foreach ($data['list'] as &$item) { $item['division_end_time'] = $item['division_end_time'] ? date('Y-m-d', $item['division_end_time']) : ''; $item['division_change_time'] = $item['division_change_time'] ? date('Y-m-d', $item['division_change_time']) : ''; $item['down_num'] = $divisionCount[$item['uid']] ?? 0; $item['division_percent'] = $item['division_percent'] . '%'; if ($where['division_type'] == 2) { $item['division_up_name'] = $divisionUpInfos[$item['division_id']] ?? ''; } } return $data; } /** * 获取事业部表单 * @param $uid * @return mixed * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function getDivisionForm($uid) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); /** @var SystemAdminServices $adminService */ $adminService = app()->make(SystemAdminServices::class); $userInfo = $userServices->get($uid); if ($uid && !$userInfo) throw new AdminException('用户数据不存在'); if ($uid) { $adminInfo = $adminService->get(['division_id' => $uid]); if ($adminInfo) $adminInfo = $adminInfo->toArray(); if (isset($adminInfo['roles'])) { foreach ($adminInfo['roles'] as &$item) { $item = intval($item); } } } $field = []; $field[] = Form::input('division_name', '区域代理名称:', $userInfo['division_name'] ?? '')->required('请输入区域代理名称'); if ($uid) { $field[] = Form::hidden('uid', $uid); } else { $field[] = Form::frameImage('image', '关联用户:', $this->url('admin/system.user/list', ['fodder' => 'image'], true))->icon('ios-add')->width('960px')->height('550px')->modal(['footer-hide' => true])->Props(['srcKey' => 'image']); } $field[] = Form::hidden('aid', $adminInfo['id'] ?? 0); $field[] = Form::number('division_percent', '佣金比例:', $userInfo['division_percent'] ?? '')->placeholder('区域代理佣金比例1-100')->info('填写1-100,如填写50代表返佣50%')->style(['width' => '173px'])->min(0)->max(100)->required(); $field[] = Form::date('division_end_time', '到期时间:', isset($userInfo['division_end_time']) && $userInfo['division_end_time'] != 0 ? date('Y-m-d', $userInfo['division_end_time']) : '')->placeholder('区域代理到期时间')->required(); $field[] = Form::radio('division_status', '代理状态:', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]); $field[] = Form::input('account', '管理员账号:', $adminInfo['account'] ?? '')->required('请填写管理员账号'); $field[] = Form::input('phone', '管理员手机号:', $adminInfo['phone'] ?? '')->required('请填写管理员手机号'); $field[] = Form::input('pwd', '管理密码:')->type('password')->required('请填写管理员密码'); $field[] = Form::input('conf_pwd', '确认密码:')->type('password')->required('请输入确认密码'); $options = app()->make(SystemRoleServices::class)->getRoleFormSelect(1); $field[] = Form::select('roles', '管理员身份:', $adminInfo['roles'] ?? [])->setOptions(Form::setOptions($options))->multiple(true)->required('请选择管理员身份'); return create_form('区域代理', $field, $this->url('/agent/division/save'), 'POST'); } /** * 保存事业部 * @param $data * @return mixed * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function saveDivision($data) { if ((int)$data['uid'] == 0) $data['uid'] = $data['image']['uid'] ?? 0; if ((int)$data['uid'] == 0) throw new AdminException('请选择用户'); /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); if ($data['aid'] == 0) { $divisionType = $userServices->value(['uid' => $data['uid']], 'division_type'); if (is_null($divisionType)) throw new AdminException('用户不存在'); if ($divisionType == 1) throw new AdminException('此用户是区域代理,请勿重复添加'); if ($divisionType == 2) throw new AdminException('此用户是代理商,无法添加为区域代理'); if ($divisionType == 3) throw new AdminException('此用户是下级员工,无法添加为区域代理'); } $uid = $data['uid']; $aid = $data['aid']; $divisionData = [ 'division_name' => $data['division_name'], 'division_type' => 1, 'division_status' => $data['division_status'], 'division_id' => $uid, 'agent_id' => 0, 'staff_id' => 0, 'division_percent' => $data['division_percent'], 'division_end_time' => strtotime($data['division_end_time']), 'division_change_time' => time(), 'division_invite' => $userServices->value(['uid' => $uid], 'division_invite') ?: rand(10000000, 99999999), 'spread_uid' => 0, 'spread_time' => 0, 'is_promoter' => 1, ]; $adminData = [ 'account' => $data['account'], 'phone' => $data['phone'], 'pwd' => $data['pwd'], 'conf_pwd' => $data['conf_pwd'], 'real_name' => $data['division_name'], 'roles' => $data['roles'], 'status' => 1, 'level' => 1, 'division_id' => $uid ]; return $this->transaction(function () use ($uid, $divisionData, $adminData, $aid, $userServices) { $userServices->update($uid, $divisionData); /** @var SystemAdminServices $adminService */ $adminService = app()->make(SystemAdminServices::class); if (!$aid) { if (!$adminData['pwd']) throw new AdminException('请输入管理员密码'); if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码'); if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次密码不一致'); $adminService->create($adminData); } else { $adminInfo = $adminService->get($aid); if (!$adminInfo) throw new AdminException('管理员不存在'); if ($adminData['pwd']) { if (!$adminData['conf_pwd']) throw new AdminException('请输入确认密码'); if ($adminData['pwd'] != $adminData['conf_pwd']) throw new AdminException('两次密码不一致'); $adminInfo->pwd = $this->passwordHash($adminData['pwd']); } $adminInfo->real_name = $adminData['real_name']; $adminInfo->account = $adminData['account']; $adminInfo->roles = implode(',', $adminData['roles']); if (!$adminInfo->save()) throw new AdminException('保存管理员失败'); } return true; }); } /** * 获取代理商表单 * @param $uid * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function getDivisionAgentForm($uid) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $userInfo = $userServices->get($uid); if ($uid && !$userInfo) throw new AdminException(400214); $field = []; $options = []; $divisionList = $userServices->getUserList(['status' => 1, 'is_del' => 0, 'division_type' => 1], 'uid,division_name'); foreach ($divisionList['list'] as $item) { $options[] = ['value' => $item['uid'], 'label' => $item['division_name']]; } $field[] = Form::input('division_name', '代理商名称:', $userInfo['division_name'] ?? '')->required('请输入代理商名称'); if ($uid) { $field[] = Form::hidden('uid', $uid); $field[] = Form::hidden('division_id', $userInfo['division_id']); } else { $field[] = Form::select('division_id', '区域代理:', $info['file_name'] ?? '')->setOptions(Form::setOptions($options))->filterable(1); $field[] = Form::frameImage('image', '关联用户:', $this->url('admin/system.user/list', ['fodder' => 'image'], true))->icon('ios-add')->width('960px')->height('550px')->modal(['footer-hide' => true])->Props(['srcKey' => 'image']); } $field[] = Form::number('division_percent', '佣金比例:', $userInfo['division_percent'] ?? '')->placeholder('代理商佣金比例1-100')->info('填写1-100,如填写50代表返佣50%,但是不能高于上级区域代理的比例')->style(['width' => '173px'])->min(0)->max(100)->required(); $field[] = Form::date('division_end_time', '到期时间:', isset($userInfo['division_end_time']) && $userInfo['division_end_time'] != 0 ? date('Y-m-d', $userInfo['division_end_time']) : '')->placeholder('代理商代理到期时间'); $field[] = Form::radio('division_status', '代理状态:', $userInfo['division_status'] ?? 1)->options([['label' => '开通', 'value' => 1], ['label' => '关闭', 'value' => 0]]); return create_form('代理商', $field, $this->url('/agent/division_agent/save'), 'POST'); } /** * 保存代理商 * @param $data * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function saveDivisionAgent($data) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); if ((int)$data['uid'] == 0) { $data['uid'] = $data['image']['uid'] ?? 0; if ((int)$data['uid'] == 0) throw new AdminException('请选择用户'); $divisionType = $userServices->value(['uid' => $data['uid']], 'division_type'); if ($divisionType == 1) throw new AdminException('此用户是区域代理,无法添加为代理商'); if ($divisionType == 2) throw new AdminException('此用户是代理商,无法重复添加'); if ($divisionType == 3) throw new AdminException('此用户是下级员工,无法添加为代理商'); } $uid = $data['uid']; $agentData = [ 'spread_uid' => $data['division_id'], 'spread_time' => time(), 'division_name' => $data['division_name'], 'division_id' => $data['division_id'], 'division_status' => $data['division_status'], 'division_percent' => $data['division_percent'], 'division_change_time' => time(), 'division_end_time' => strtotime($data['division_end_time']), 'division_type' => 2, 'agent_id' => $uid, 'is_promoter' => 1, ]; $division_info = $userServices->getUserInfo($data['division_id'], 'division_end_time,division_percent'); if ($division_info) { if ($agentData['division_percent'] > $division_info['division_percent']) throw new AdminException('代理商比例不能大于上级区域代理'); if ($agentData['division_end_time'] > $division_info['division_end_time']) throw new AdminException('代理商到期时间不能大于上级区域代理'); } $res = $userServices->update($uid, $agentData); if ($res) return true; throw new AdminException('保存失败'); } /** * 获取员工表单 * @param $uid * @return mixed * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function getDivisionStaffForm($uid) { $field = []; $field[] = Form::frameImage('image', '关联用户:', $this->url('admin/system.user/list', ['fodder' => 'image'], true))->icon('ios-add')->width('960px')->height('550px')->modal(['footer-hide' => true])->Props(['srcKey' => 'image']); $field[] = Form::number('division_percent', '佣金比例:', '')->placeholder('员工佣金比例1-100')->info('填写1-100,如填写50代表返佣50%,但是不能高于上级代理商的比例')->style(['width' => '173px'])->min(0)->max(100)->required(); $field[] = Form::hidden('agent_id', $uid); return create_form('添加员工', $field, $this->url('/agent/division_staff/save'), 'POST'); } /** * 保存员工 * @param $data * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function saveDivisionStaff($data) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); if ((int)$data['uid'] == 0) { $data['uid'] = $data['image']['uid'] ?? 0; if ((int)$data['uid'] == 0) throw new AdminException('请选择用户'); $divisionType = $userServices->value(['uid' => $data['uid']], 'division_type'); if ($divisionType == 1) throw new AdminException('此用户是区域代理,无法添加为员工'); if ($divisionType == 2) throw new AdminException('此用户是代理商,无法添加为员工'); if ($divisionType == 3) throw new AdminException('此用户是员工,无法重复添加'); } $agentInfo = $userServices->getUserInfo($data['agent_id'], 'division_id,agent_id,division_end_time,division_percent'); $staffData = [ 'spread_uid' => $data['agent_id'], 'spread_time' => time(), 'division_type' => 3, 'division_status' => 1, 'division_id' => $agentInfo['division_id'], 'agent_id' => $agentInfo['agent_id'], 'staff_id' => $data['uid'], 'division_percent' => $data['division_percent'], 'division_change_time' => time(), 'division_end_time' => $agentInfo['division_end_time'], 'is_promoter' => 1, ]; if ($staffData['division_percent'] > $agentInfo['division_percent']) throw new AdminException('员工比例不能大于上级代理商'); $res = $userServices->update($data['uid'], $staffData); if ($res) return true; throw new AdminException('保存失败'); } /** * 删除事业部/代理商/员工 * @param $uid * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function deleteDivision($uid) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $userInfo = $userServices->getUserInfo($uid); if (!$userInfo) throw new AdminException('用户不存在'); $userInfo = $userInfo->toArray(); $data = [ 'division_name' => '', 'division_type' => 0, 'division_status' => 0, 'division_id' => 0, 'agent_id' => 0, 'staff_id' => 0, 'division_percent' => 0, 'division_end_time' => 0, 'division_change_time' => time(), 'division_invite' => 0 ]; $userServices->update(['uid' => $uid], $data); if ($userInfo['division_type'] == 1) { app()->make(SystemAdminServices::class)->delete(['division_id' => $uid]); $userServices->update(['division_id' => $uid], $data); } elseif ($userInfo['division_type'] == 2) { app()->make(DivisionApplyServices::class)->delete(['uid' => $uid]); $userServices->update(['agent_id' => $uid], $data); } elseif ($userInfo['division_type'] == 3) { $userServices->update(['staff_id' => $uid], $data); } return true; } /** * 设置状态 * @param $uid * @param $status * @return bool * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function setStatus($uid, $status) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $userServices->update($uid, ['division_status' => $status]); return true; } /** * 分成比例 * @param $uid * @param $storeBrokerageRatio * @param $storeBrokerageRatioTwo * @return array * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function divisionBrokerage($uid, $storeBrokerageRatio, $storeBrokerageRatioTwo) { if (!sys_config('brokerage_func_status')) { return [0, 0, 0, 0, 0]; } $isSelfBrokerage = (int)sys_config('is_self_brokerage', 0); $division_open = (int)sys_config('division_status', 1); if (!$division_open) { /** 代理商关闭 */ $storeBrokerageOne = $storeBrokerageRatio; $storeBrokerageTwo = $storeBrokerageRatioTwo; $staffPercent = 0; $agentPercent = 0; $divisionPercent = 0; } else { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $userInfo = $userServices->get($uid); if ($userInfo['division_type'] == 1) { /** 自己是事业部 */ $storeBrokerageOne = 0; $storeBrokerageTwo = 0; $staffPercent = 0; $agentPercent = 0; if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) { $divisionPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0; } else { $divisionPercent = 0; } } elseif ($userInfo['division_type'] == 2) { /** 自己是代理商 */ $divisionInfo = $userServices->get($userInfo['division_id']); $storeBrokerageOne = 0; $storeBrokerageTwo = 0; $staffPercent = 0; if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) { $agentPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0; } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], $agentPercent, 2); } else { $divisionPercent = 0; } } elseif ($userInfo['division_type'] == 3) { // 自己是员工 /** 自己是员工 */ $agentInfo = $userServices->get($userInfo['agent_id']); $divisionInfo = $userServices->get($userInfo['division_id']); $storeBrokerageOne = 0; $storeBrokerageTwo = 0; if ($userInfo['division_status'] == 1 && $userInfo['division_end_time'] > time()) { $staffPercent = $isSelfBrokerage ? $userInfo['division_percent'] : 0; } else { $staffPercent = 0; } if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) { $agentPercent = bcsub($agentInfo['division_percent'], $staffPercent, 2); } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($staffPercent, $agentPercent, 2), 2); } else { $divisionPercent = 0; } } else { /** 自己是普通用户 */ $staffInfo = $userServices->get($userInfo['staff_id']); $agentInfo = $userServices->get($userInfo['agent_id']); $divisionInfo = $userServices->get($userInfo['division_id']); if ($userInfo['staff_id']) { /** 该用户为员工推广 */ if ($userInfo['staff_id'] == $userInfo['spread_uid']) { /** 员工直接下级 */ $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0; $storeBrokerageTwo = 0; if ($staffInfo['division_status'] == 1 && $staffInfo['division_end_time'] > time()) { $staffPercent = bcsub($staffInfo['division_percent'], $storeBrokerageOne, 2); } else { $staffPercent = 0; } if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) { $agentPercent = bcsub($agentInfo['division_percent'], bcadd($storeBrokerageOne, $staffPercent, 2), 2); } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd(bcadd($storeBrokerageOne, $staffPercent, 2), $agentPercent, 2), 2); } else { $divisionPercent = 0; } } else { $storeBrokerageOne = $storeBrokerageRatio; $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['staff_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo; $brokerageOneTwo = bcadd($storeBrokerageRatio, $storeBrokerageTwo, 2); if ($staffInfo['division_status'] == 1 && $staffInfo['division_end_time'] > time()) { $staffPercent = bcsub($staffInfo['division_percent'], $brokerageOneTwo, 2); } else { $staffPercent = 0; } if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) { $agentPercent = bcsub($agentInfo['division_percent'], bcadd($brokerageOneTwo, $staffPercent, 2), 2); } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd(bcadd($brokerageOneTwo, $staffPercent, 2), $agentPercent, 2), 2); } else { $divisionPercent = 0; } } } elseif ($userInfo['agent_id']) { /** 该用户为代理商推广 */ if ($userInfo['agent_id'] == $userInfo['spread_uid']) { $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0; $storeBrokerageTwo = 0; $staffPercent = 0; if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) { $agentPercent = bcsub($agentInfo['division_percent'], $storeBrokerageOne, 2); } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($storeBrokerageOne, $agentPercent, 2), 2); } else { $divisionPercent = 0; } } else { $storeBrokerageOne = $storeBrokerageRatio; $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['agent_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo; $brokerageOneTwo = bcadd($storeBrokerageRatio, $storeBrokerageTwo, 2); $staffPercent = 0; if ($agentInfo['division_status'] == 1 && $agentInfo['division_end_time'] > time()) { $agentPercent = bcsub($agentInfo['division_percent'], $brokerageOneTwo, 2); } else { $agentPercent = 0; } if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], bcadd($brokerageOneTwo, $agentPercent, 2), 2); } else { $divisionPercent = 0; } } } elseif ($userInfo['division_id']) { /** 该用户为事业部推广 */ if ($userInfo['division_id'] == $userInfo['spread_uid']) { /** 事业部直接下级 */ $storeBrokerageOne = $isSelfBrokerage ? $storeBrokerageRatio : 0; $storeBrokerageTwo = 0; $staffPercent = 0; $agentPercent = 0; if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], $storeBrokerageOne, 2); } else { $divisionPercent = 0; } } else { $storeBrokerageOne = $storeBrokerageRatio; $storeBrokerageTwo = $userServices->value(['uid' => $userInfo['spread_uid']], 'spread_uid') == $userInfo['division_id'] && !$isSelfBrokerage ? 0 : $storeBrokerageRatioTwo; $brokerageOneTwo = bcadd($storeBrokerageRatio, $storeBrokerageTwo, 2); $staffPercent = 0; $agentPercent = 0; if ($divisionInfo['division_status'] == 1 && $divisionInfo['division_end_time'] > time()) { $divisionPercent = bcsub($divisionInfo['division_percent'], $brokerageOneTwo, 2); } else { $divisionPercent = 0; } } } else { /** 没有任何代理商关系 */ $storeBrokerageOne = $storeBrokerageRatio; $storeBrokerageTwo = $storeBrokerageRatioTwo; $staffPercent = 0; $agentPercent = 0; $divisionPercent = 0; } } } return [max($storeBrokerageOne, 0), max($storeBrokerageTwo, 0), max($staffPercent, 0), max($agentPercent, 0), max($divisionPercent, 0)]; } /** * 获取代理商下级员工列表 * @param $where * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function staffList($where) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); /** @var StoreOrderServices $orderService */ $orderService = app()->make(StoreOrderServices::class); [$page, $limit] = $this->getPageValue(); $whereData = [ 'agent_id' => $where['agent_id'], 'division_type' => 3, 'is_del' => 0, 'nickname' => $where['keyword'], ]; if ($where['start'] != 0) { $whereData['spread_time'] = [$where['start'], $where['stop']]; } $count = $userServices->count($whereData); $brokerage = $orderService->sum(['division_agent_id' => $where['agent_id']], 'division_agent_brokerage'); $list = $userServices->getList($whereData, 'avatar,nickname,uid,spread_uid,spread_time,division_percent,pay_count', $page, $limit); foreach ($list as &$item) { $item['spread_time'] = date('Y/m/d', $item['spread_time']); $item['childCount'] = $userServices->getCount(['agent_id' => $where['agent_id'], 'spread_uid' => $item['uid']]); $item['orderCount'] = $orderService->count(['uid' => $item['uid'], 'refund_status' => 0]); $item['numberCount'] = $orderService->sum(['uid' => $item['uid'], 'refund_status' => 0], 'pay_price'); } return compact('list', 'count', 'brokerage'); } /** * 修改员工返佣比例 * @param $uid * @param $agentId * @param $divisionPercent * @return bool|\think\Response * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function staffPercent($uid, $agentId, $divisionPercent) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); if ($divisionPercent >= $userServices->value(['uid' => $agentId], 'division_percent')) { throw new ApiException('返佣比例不能大于代理商返佣比例'); } $userServices->update(['uid' => $uid, 'agent_id' => $agentId], ['division_percent' => $divisionPercent]); return true; } /** * 删除员工 * @param $uid * @param $agentId * @return bool * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function delStaff($uid, $agentId) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $data = [ 'division_name' => '', 'division_type' => 0, 'division_status' => 0, 'division_id' => 0, 'agent_id' => 0, 'staff_id' => 0, 'division_percent' => 0, 'division_end_time' => 0, 'division_change_time' => time(), 'division_invite' => 0 ]; $userServices->update(['uid' => $uid, 'agent_id' => $agentId], $data); $userServices->update(['staff_id' => $uid, 'agent_id' => $agentId], $data); return true; } /** * 获取事业部订单列表 * @param $adminInfo * @param $where * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function divisionOrder($adminInfo, $where) { if ($adminInfo['level'] != 0) { $where['division_id'] = $adminInfo['division_id'] ?: -1; } $where['division_id'] = $where['division_id'] != '' ? $where['division_id'] : -1; $where['division_agent_id'] = $where['division_agent_id'] != '' ? $where['division_agent_id'] : -1; $where['pid'] = 0; $where['is_del'] = 0; /** @var StoreOrderServices $orderServices */ $orderServices = app()->make(StoreOrderServices::class); return $orderServices->getOrderList($where); } /** * 获取区域代理下拉选项 * @return array */ public function divisionOption() { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $list = $userServices->getColumn(['division_type' => 1], 'division_name', 'uid'); $data = []; foreach ($list as $key => $value) { $data[] = ['value' => $key, 'label' => $value]; } return $data; } /** * 获取代理商下拉选项 * @param int $division_id 区域代理ID * @return array */ public function agentOption($division_id) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $list = $userServices->getColumn(['division_type' => 2, 'division_id' => $division_id], 'division_name', 'uid'); $data = []; foreach ($list as $key => $value) { $data[] = ['value' => $key, 'label' => $value]; } return $data; } /** * 获取事业部统计数据 * @param $divisionId * @return array * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function divisionStatistics($divisionId) { $where = $divisionId != 0 ? ['division_id' => $divisionId] : []; /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $divisionNum = $userServices->count(['division_type' => 1]); $agentNum = $userServices->count(['division_type' => 2] + $where); $staffNum = $userServices->count(['division_type' => 3] + $where); /** @var StoreOrderServices $orderServices */ $orderServices = app()->make(StoreOrderServices::class); $divisionOrderNum = $orderServices->count(['division_type' => 1, 'pid' => 0, 'paid' => 1] + $where); $orderPrice = $orderServices->sum(['division_type' => 1, 'pid' => 0, 'paid' => 1] + $where, 'pay_price', true); $divisionBrokerage = $orderServices->sum(['division_type' => 1, 'pid' => 0, 'paid' => 1] + $where, 'division_brokerage', true); $divisionAgentBrokerage = $orderServices->sum(['division_type' => 1, 'pid' => 0, 'paid' => 1] + $where, 'division_agent_brokerage', true); $divisionStaffBrokerage = $orderServices->sum(['division_type' => 1, 'pid' => 0, 'paid' => 1] + $where, 'division_staff_brokerage', true); $divisionBrokeragePrice = bcadd(bcadd($divisionBrokerage, $divisionAgentBrokerage, 2), $divisionStaffBrokerage, 2); return [ [ 'name' => '区域代理数量', 'count' => $divisionNum, 'className' => 'md-contacts', 'col' => 4, ], [ 'name' => '代理商数量', 'count' => $agentNum, 'className' => 'md-contact', 'col' => 4, ], [ 'name' => '员工数量', 'count' => $staffNum, 'className' => 'md-cart', 'col' => 4, ], [ 'name' => '总订单数', 'count' => $divisionOrderNum, 'className' => 'md-bug', 'col' => 4, ], [ 'name' => '总订单金额', 'count' => $orderPrice, 'className' => 'md-basket', 'col' => 4, ], [ 'name' => '获得佣金金额', 'count' => $divisionBrokeragePrice, 'className' => 'ios-at-outline', 'col' => 4, ], ]; } /** * 获取事业部趋势数据 * @param $time * @param $divisionId * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function divisionTrend($time, $divisionId) { $timeArr = explode('-', $time); if (count($timeArr) != 2) throw new AdminException('参数错误'); $dayCount = (strtotime($timeArr[1]) - strtotime($timeArr[0])) / 86400 + 1; $data = []; if ($dayCount == 1) { $data = $this->trend($timeArr, 0, $divisionId); } elseif ($dayCount > 1 && $dayCount <= 31) { $data = $this->trend($timeArr, 1, $divisionId); } elseif ($dayCount > 31 && $dayCount <= 92) { $data = $this->trend($timeArr, 3, $divisionId); } elseif ($dayCount > 92) { $data = $this->trend($timeArr, 30, $divisionId); } return $data; } /** * 获取事业部趋势图数据 * @param $time * @param $num * @param $divisionId * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function trend($time, $num, $divisionId) { /** @var StoreOrderServices $storeOrder */ $storeOrder = app()->make(StoreOrderServices::class); if ($num == 0) { $xAxis = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']; $timeType = '%H'; } elseif ($num != 0) { $dt_start = strtotime($time[0]); $dt_end = strtotime($time[1]); while ($dt_start <= $dt_end) { if ($num == 30) { $xAxis[] = date('Y-m', $dt_start); $dt_start = strtotime("+1 month", $dt_start); $timeType = '%Y-%m'; } else { $xAxis[] = date('Y-m-d', $dt_start); $dt_start = strtotime("+$num day", $dt_start); $timeType = '%Y-%m-%d'; } } } $pay_price = array_column($storeOrder->getDivisionTrend($time, $timeType, $divisionId, 'sum(pay_price)'), 'num', 'days'); $pay_count = array_column($storeOrder->getDivisionTrend($time, $timeType, $divisionId, 'count(id)'), 'num', 'days'); $data = $series = []; foreach ($xAxis as $item) { $data['订单金额'][] = isset($pay_price[$item]) ? floatval($pay_price[$item]) : 0; $data['订单量'][] = isset($pay_count[$item]) ? floatval($pay_count[$item]) : 0; } foreach ($data as $key => $item) { $series[] = [ 'name' => $key, 'data' => $item, 'type' => 'line', ]; } return compact('xAxis', 'series'); } /** * 事业部统计排行 * @param $divisionId * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/26 */ public function divisionRanking($divisionId) { /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); /** @var StoreOrderServices $orderServices */ $orderServices = app()->make(StoreOrderServices::class); if ($divisionId == 0) { $data = $userServices->getUserList(['division_type' => 1, 'status' => 1, 'is_del' => 0], 'uid,nickname'); } else { $data = $userServices->getUserList(['division_type' => 2, 'division_id' => $divisionId, 'status' => 1, 'is_del' => 0], 'uid,nickname'); } $list = []; foreach ($data['list'] as $item) { $divisionBrokerage = $orderServices->sum(['division_id' => $item['uid'], 'pid' => 0, 'paid' => 1], 'division_brokerage', true); $divisionAgentBrokerage = $orderServices->sum(['division_id' => $item['uid'], 'pid' => 0, 'paid' => 1], 'division_agent_brokerage', true); $divisionStaffBrokerage = $orderServices->sum(['division_id' => $item['uid'], 'pid' => 0, 'paid' => 1], 'division_staff_brokerage', true); $list[] = [ 'nickname' => $item['nickname'], 'spread_agent' => $userServices->count(['division_type' => 2, 'division_id' => $item['uid'], 'status' => 1, 'is_del' => 0]), 'spread_staff' => $userServices->count(['division_type' => 3, 'division_id' => $item['uid'], 'status' => 1, 'is_del' => 0]), 'order_price' => $orderServices->sum(['division_id' => $item['uid'], 'pid' => 0, 'paid' => 1], 'pay_price', true), 'brokerage_price' => bcadd(bcadd($divisionBrokerage, $divisionAgentBrokerage, 2), $divisionStaffBrokerage, 2), 'order_num' => $orderServices->count(['division_id' => $item['uid'], 'pid' => 0, 'paid' => 1]) ]; } return compact('list'); } /** * 获取代理商小程序推广码 * @param $uid * @return false|mixed|string * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function agentSpreadCode($uid) { $userInfo = app()->make(UserServices::class)->getUserInfo($uid); if (!$userInfo) { throw new AdminException('数据不存在'); } $name = 'division_agent_' . $userInfo['uid'] . '.jpg'; /** @var QrcodeServices $QrcodeService */ $QrcodeService = app()->make(QrcodeServices::class); $resForever = $QrcodeService->qrCodeForever($uid, 'division_agent'); $url = $QrcodeService->getRoutineQrcodePath((int)$resForever['id'], $uid, 110, $name); return compact('url'); } /** * 绑定员工 * @param $uid * @param int $agentId * @param int $agentCode * @return false|string * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author wuhaotian * @email 442384644@qq.com * @date 2024/8/21 */ public function agentSpreadStaff($uid, int $agentId = 0, int $agentCode = 0) { if ($agentCode && !$agentId) { /** @var QrcodeServices $qrCode */ $qrCode = app()->make(QrcodeServices::class); if ($info = $qrCode->getOne(['id' => $agentCode, 'third_type' => 'division_agent', 'status' => 1])) { $agentId = $info['third_id']; } } if (!$agentId) throw new ApiException('上级代理商不存在'); if ($uid == $agentId) throw new ApiException('自己不能推荐自己'); /** @var UserServices $userServices */ $userServices = app()->make(UserServices::class); $agentInfo = $userServices->getUserInfo($agentId, 'division_id,agent_id,division_type,division_end_time'); if (!$agentInfo) throw new ApiException('上级用户不存在'); $userInfo = $userServices->getUserInfo($uid, 'division_type'); if (!$userInfo) throw new ApiException('用户不存在'); if ($userInfo['division_type'] == 1) throw new ApiException('您是区域代理,不能绑定成为别人的员工'); if ($userInfo['division_type'] == 2) throw new ApiException('您是代理商,不能绑定成为别人的员工'); if ($userInfo['division_type'] == 3) throw new ApiException('您已经是员工,不能绑定成为别人的员工'); $staffData = [ 'spread_uid' => $agentId, 'spread_time' => time(), 'division_type' => 3, 'division_status' => 1, 'division_id' => $agentInfo['division_id'], 'agent_id' => $agentInfo['agent_id'], 'staff_id' => $uid, 'division_end_time' => $agentInfo['division_end_time'], 'division_change_time' => time(), 'is_promoter' => 1, ]; $res = $userServices->update($uid, $staffData); if ($res) return true; throw new ApiException('绑定员工失败'); } }