You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
434 lines
17 KiB
434 lines
17 KiB
10 months ago
|
<?php
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||
|
// +----------------------------------------------------------------------
|
||
|
|
||
|
namespace app\services\agent;
|
||
|
|
||
|
use app\services\BaseServices;
|
||
|
use app\services\order\StoreOrderServices;
|
||
|
use app\services\order\StoreOrderStatusServices;
|
||
|
use app\services\other\QrcodeServices;
|
||
|
use app\services\system\attachment\SystemAttachmentServices;
|
||
|
use app\services\user\UserBrokerageFrozenServices;
|
||
|
use app\services\user\UserBrokerageServices;
|
||
|
use app\services\user\UserExtractServices;
|
||
|
use app\services\user\UserServices;
|
||
|
use crmeb\exceptions\AdminException;
|
||
|
use crmeb\services\app\MiniProgramService;
|
||
|
use app\services\other\UploadService;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Class AgentManageServices
|
||
|
* @package app\services\agent
|
||
|
*/
|
||
|
class AgentManageServices extends BaseServices
|
||
|
{
|
||
|
|
||
|
/**
|
||
|
* @param array $where
|
||
|
* @param bool $is_page
|
||
|
* @return array
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function agentSystemPage(array $where, $is_page = true)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$data = $userServices->getAgentUserList($where, '*', $is_page);
|
||
|
/** @var UserBrokerageServices $frozenPrices */
|
||
|
$frozenPrices = app()->make(UserBrokerageServices::class);
|
||
|
foreach ($data['list'] as &$item) {
|
||
|
$item['headimgurl'] = $item['avatar'];
|
||
|
$item['extract_count_price'] = $item['extract'][0]['extract_count_price'] ?? 0;
|
||
|
$item['extract_count_num'] = $item['extract'][0]['extract_count_num'] ?? 0;
|
||
|
$item['spread_name'] = $item['spreadUser']['nickname'] ?? '';
|
||
|
if ($item['spread_name']) {
|
||
|
$item['spread_name'] .= '/' . $item['spread_uid'];
|
||
|
}
|
||
|
$item['spread_count'] = $item['spreadCount'][0]['spread_count'] ?? 0;
|
||
|
$item['order_price'] = $item['order'][0]['order_price'] ?? 0;
|
||
|
$item['order_count'] = $item['order'][0]['order_count'] ?? 0;
|
||
|
$item['broken_commission'] = $frozenPrices->getUserFrozenPrice($item['uid']);
|
||
|
if ($item['broken_commission'] < 0)
|
||
|
$item['broken_commission'] = 0;
|
||
|
$item['new_money'] = $item['bill'][0]['brokerage_money'] ?? 0;
|
||
|
if ($item['brokerage_price'] > $item['broken_commission'])
|
||
|
$item['new_money'] = bcsub((string)$item['brokerage_price'], (string)$item['broken_commission'], 2);
|
||
|
else
|
||
|
$item['new_money'] = 0;
|
||
|
$item['brokerage_money'] = bcadd((string)$item['brokerage_price'], (string)$item['extract_count_price'], 2);
|
||
|
unset($item['extract'], $item['order'], $item['bill'], $item['spreadUser'], $item['spreadCount']);
|
||
|
if (strpos($item['headimgurl'], '/statics/system_images/') !== false) {
|
||
|
$item['headimgurl'] = set_file_url($item['headimgurl']);
|
||
|
}
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 分销头部信息
|
||
|
* @param $where
|
||
|
* @return array
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function getSpreadBadge($where)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$uids = $userServices->getAgentUserIds($where);
|
||
|
|
||
|
//分销员人数
|
||
|
$data['uids'] = $uids;
|
||
|
$data['sum_count'] = count($uids);
|
||
|
|
||
|
//发展会员人数以及用户的可提现金额
|
||
|
$data['spread_sum'] = 0;
|
||
|
$data['extract_price'] = 0;
|
||
|
if ($data['sum_count']) {
|
||
|
//发展会员人数
|
||
|
$data['spread_sum'] = $userServices->getCount([['spread_uid', 'in', $uids]]);
|
||
|
//获取某个用户可提现金额
|
||
|
/** @var UserBrokerageFrozenServices $frozenPrices */
|
||
|
$frozenPrices = app()->make(UserBrokerageFrozenServices::class);
|
||
|
$data['extract_price'] = bcsub((string)$userServices->getSumBrokerage(['uid' => $uids]), $frozenPrices->getSumFrozenBrokerage($uids), 2);
|
||
|
}
|
||
|
|
||
|
//订单总数,订单金额,提现次数
|
||
|
$data['order_count'] = 0;
|
||
|
$data['pay_price'] = 0;
|
||
|
$data['extract_count'] = 0;
|
||
|
if ($data['sum_count']) {
|
||
|
/** @var StoreOrderServices $storeOrder */
|
||
|
$storeOrder = app()->make(StoreOrderServices::class);
|
||
|
//订单总数
|
||
|
$data['order_count'] = $storeOrder->getCount([['uid', 'in', $uids], ['paid', '=', 1], ['refund_status', '=', 0], ['pid', '<=', 0]]);
|
||
|
//订单金额
|
||
|
$data['pay_price'] = $storeOrder->sum([['uid', 'in', $uids], ['paid', '=', 1], ['refund_status', '=', 0], ['pid', '<=', 0]], 'pay_price');
|
||
|
//提现次数
|
||
|
$data['extract_count'] = app()->make(UserExtractServices::class)->getCount([['uid', 'in', $uids], ['status', '=', 1]]);
|
||
|
}
|
||
|
|
||
|
return [
|
||
|
[
|
||
|
'name' => '分销员人数(人)',
|
||
|
'count' => $data['sum_count'],
|
||
|
'className' => 'iconfaqirenshu',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
[
|
||
|
'name' => '推广用户数量(人)',
|
||
|
'count' => $data['spread_sum'],
|
||
|
'className' => 'icontuiguangrenshu',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
[
|
||
|
'name' => '订单数(单)',
|
||
|
'count' => $data['order_count'],
|
||
|
'className' => 'icondingdanliang',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
[
|
||
|
'name' => '订单金额(元)',
|
||
|
'count' => $data['pay_price'],
|
||
|
'className' => 'icondingdanjine',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
[
|
||
|
'name' => '提现次数(次)',
|
||
|
'count' => $data['extract_count'],
|
||
|
'className' => 'iconzhichujine',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
[
|
||
|
'name' => '未提现金额(元)',
|
||
|
'count' => $data['extract_price'],
|
||
|
'className' => 'iconjiaoyijine',
|
||
|
'col' => 4,
|
||
|
],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 推广人列表
|
||
|
* @param array $where
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function getStairList(array $where)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$data = $userServices->getSairList($where);
|
||
|
foreach ($data['list'] as &$item) {
|
||
|
$item['spread_count'] = $item['spreadCount'][0]['spread_count'] ?? 0;
|
||
|
$item['order_count'] = $item['order'][0]['order_count'] ?? 0;
|
||
|
$item['promoter_name'] = $item['is_promoter'] ? '是' : '否';
|
||
|
$item['add_time'] = $item['spread_time'] ? date("Y-m-d H:i:s", $item['spread_time']) : '';
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
//TODO 废弃
|
||
|
|
||
|
/**
|
||
|
* 推广人头部信息
|
||
|
* @param array $where
|
||
|
* @return array[]
|
||
|
*/
|
||
|
public function getSairBadge(array $where)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$data['number'] = $userServices->getSairCount($where);
|
||
|
$where['type'] = 1;
|
||
|
$data['one_number'] = $userServices->getSairCount($where);
|
||
|
$where['type'] = 2;
|
||
|
$data['two_number'] = $userServices->getSairCount($where);
|
||
|
|
||
|
$col = $data['two_number'] > 0 ? 4 : 6;
|
||
|
return [
|
||
|
[
|
||
|
'name' => '总人数(人)',
|
||
|
'count' => $data['number'],
|
||
|
'col' => $col,
|
||
|
],
|
||
|
[
|
||
|
'name' => '一级人数(人)',
|
||
|
'count' => $data['one_number'],
|
||
|
'col' => $col,
|
||
|
],
|
||
|
[
|
||
|
'name' => '二级人数(人)',
|
||
|
'count' => $data['two_number'],
|
||
|
'col' => $col,
|
||
|
],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 推广订单
|
||
|
* @param int $uid
|
||
|
* @param array $where
|
||
|
* @return array
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function getStairOrderList(int $uid, array $where)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$userInfo = $userServices->getUserInfo($uid);
|
||
|
if (!$userInfo) {
|
||
|
return ['count' => 0, 'list' => []];
|
||
|
}
|
||
|
/** @var StoreOrderServices $storeOrder */
|
||
|
$storeOrder = app()->make(StoreOrderServices::class);
|
||
|
$data = $storeOrder->getUserStairOrderList($uid, $where);
|
||
|
if ($data['list']) {
|
||
|
$uids = array_unique(array_column($data['list'], 'uid'));
|
||
|
$userList = [];
|
||
|
if ($uids) {
|
||
|
$userList = $userServices->getColumn([['uid', 'IN', $uids]], 'nickname,phone,avatar,real_name', 'uid');
|
||
|
}
|
||
|
$orderIds = array_column($data['list'], 'id');
|
||
|
$orderChangTimes = [];
|
||
|
if ($orderIds) {
|
||
|
/** @var StoreOrderStatusServices $storeOrderStatus */
|
||
|
$storeOrderStatus = app()->make(StoreOrderStatusServices::class);
|
||
|
$orderChangTimes = $storeOrderStatus->getColumn([['oid', 'IN', $orderIds], ['change_type', '=', 'user_take_delivery']], 'change_time', 'oid');
|
||
|
}
|
||
|
foreach ($data['list'] as &$item) {
|
||
|
$user = $userList[$item['uid']] ?? [];
|
||
|
$item['user_info'] = '';
|
||
|
$item['avatar'] = '';
|
||
|
if (count($user)) {
|
||
|
$item['user_info'] = $user['nickname'] . '|' . ($user['phone'] ? $user['phone'] . '|' : '') . $user['real_name'];
|
||
|
$item['avatar'] = $user['avatar'];
|
||
|
}
|
||
|
$item['brokerage_price'] = $item['spread_uid'] == $uid ? $item['one_brokerage'] : $item['two_brokerage'];
|
||
|
$item['_pay_time'] = $item['pay_time'] ? date('Y-m-d H:i:s', $item['pay_time']) : '';
|
||
|
$item['_add_time'] = $item['add_time'] ? date('Y-m-d H:i:s', $item['add_time']) : '';
|
||
|
$item['take_time'] = ($change_time = $orderChangTimes[$item['id']] ?? '') ? date('Y-m-d H:i:s', $change_time) : '暂无';
|
||
|
}
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取永久二维码
|
||
|
* @param $type
|
||
|
* @param $id
|
||
|
* @return array|false|\PDOStatement|string|\think\Model
|
||
|
*/
|
||
|
public function wechatCode(int $uid)
|
||
|
{
|
||
|
/** @var QrcodeServices $qrcode */
|
||
|
$qrcode = app()->make(QrcodeServices::class);
|
||
|
$code = $qrcode->getForeverQrcode('spread', $uid);
|
||
|
if (!$code['ticket']) throw new AdminException(410072);
|
||
|
return $code;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* TODO 查看小程序推广二维码
|
||
|
* @param string $uid
|
||
|
*/
|
||
|
public function lookXcxCode(int $uid)
|
||
|
{
|
||
|
if (!sys_config('routine_appId') || !sys_config('routine_appsecret')) {
|
||
|
throw new AdminException(400236);
|
||
|
}
|
||
|
$userInfo = app()->make(UserServices::class)->getUserInfo($uid);
|
||
|
if (!$userInfo) {
|
||
|
throw new AdminException(100026);
|
||
|
}
|
||
|
$name = $userInfo['uid'] . '_' . $userInfo['is_promoter'] . '_user.jpg';
|
||
|
/** @var SystemAttachmentServices $systemAttachmentModel */
|
||
|
$systemAttachmentModel = app()->make(SystemAttachmentServices::class);
|
||
|
$imageInfo = $systemAttachmentModel->getInfo(['name' => $name]);
|
||
|
if (!$imageInfo) {
|
||
|
/** @var QrcodeServices $qrcode */
|
||
|
$qrcode = app()->make(QrcodeServices::class);
|
||
|
$resForever = $qrcode->qrCodeForever($uid, 'spread_routine');
|
||
|
if ($resForever) {
|
||
|
$resCode = MiniProgramService::appCodeUnlimitService($resForever->id, '', 280);
|
||
|
$res = ['res' => $resCode, 'id' => $resForever->id];
|
||
|
} else {
|
||
|
$res = false;
|
||
|
}
|
||
|
if (!$res) throw new AdminException(400237);
|
||
|
$upload = UploadService::init();
|
||
|
if ($upload->to('routine/spread/code')->setAuthThumb(false)->stream((string)$res['res'], $name) === false) {
|
||
|
return $upload->getError();
|
||
|
}
|
||
|
$imageInfo = $upload->getUploadInfo();
|
||
|
$imageInfo['image_type'] = sys_config('upload_type', 1);
|
||
|
$systemAttachmentModel->attachmentAdd($imageInfo['name'], $imageInfo['size'], $imageInfo['type'], $imageInfo['dir'], $imageInfo['thumb_path'], 1, $imageInfo['image_type'], $imageInfo['time'], 2);
|
||
|
$qrcode->update($res['id'], ['status' => 1, 'time' => time(), 'qrcode_url' => $imageInfo['dir']]);
|
||
|
$urlCode = $imageInfo['dir'];
|
||
|
} else $urlCode = $imageInfo['att_dir'];
|
||
|
return ['code_src' => $urlCode];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 查看H5推广二维码
|
||
|
* @param string $uid
|
||
|
* @return mixed|string
|
||
|
*/
|
||
|
public function lookH5Code(int $uid)
|
||
|
{
|
||
|
$userInfo = app()->make(UserServices::class)->getUserInfo($uid);
|
||
|
if (!$userInfo) {
|
||
|
throw new AdminException(100026);
|
||
|
}
|
||
|
$name = $userInfo['uid'] . '_h5_' . $userInfo['is_promoter'] . '_user.jpg';
|
||
|
/** @var SystemAttachmentServices $systemAttachmentModel */
|
||
|
$systemAttachmentModel = app()->make(SystemAttachmentServices::class);
|
||
|
$imageInfo = $systemAttachmentModel->getInfo(['name' => $name]);
|
||
|
if (!$imageInfo) {
|
||
|
/** @var QrcodeServices $qrcodeService */
|
||
|
$qrcodeService = app()->make(QrcodeServices::class);
|
||
|
$urlCode = $qrcodeService->getWechatQrcodePathAgent($uid . '_h5_' . $userInfo['is_promoter'] . '_user.jpg', '?spread=' . $uid);
|
||
|
} else $urlCode = $imageInfo['att_dir'];
|
||
|
return ['code_src' => $urlCode];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 清除推广关系
|
||
|
* @param int $uid
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function delSpread(int $uid)
|
||
|
{
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$userInfo = $userServices->getUserInfo($uid);
|
||
|
if (!$userInfo) {
|
||
|
throw new AdminException(100026);
|
||
|
}
|
||
|
$spreadInfo = $userServices->get($userInfo['spread_uid']);
|
||
|
$spreadInfo->spread_count = $spreadInfo->spread_count - 1;
|
||
|
$spreadInfo->save();
|
||
|
if ($userServices->update($uid, ['spread_uid' => 0, 'spread_time' => 0]) !== false) {
|
||
|
return true;
|
||
|
} else {
|
||
|
throw new AdminException(400447);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 取消推广资格
|
||
|
* @param int $uid
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function delSystemSpread(int $uid)
|
||
|
{
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
if (!$userServices->getUserInfo($uid, 'uid')) {
|
||
|
throw new AdminException(100026);
|
||
|
}
|
||
|
if ($userServices->update($uid, ['spread_open' => 0]) !== false)
|
||
|
return true;
|
||
|
else
|
||
|
throw new AdminException(100020);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 取消绑定上级
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function removeSpread()
|
||
|
{
|
||
|
//商城分销功能是否开启 0关闭1开启
|
||
|
if (!sys_config('brokerage_func_status')) return true;
|
||
|
|
||
|
//绑定类型
|
||
|
$store_brokergae_binding_status = sys_config('store_brokerage_binding_status', 1);
|
||
|
if ($store_brokergae_binding_status == 1 || $store_brokergae_binding_status == 3) {
|
||
|
return true;
|
||
|
} else {
|
||
|
//分销绑定类型为时间段且没过期
|
||
|
$store_brokerage_binding_time = (int)sys_config('store_brokerage_binding_time', 30) * 24 * 3600;
|
||
|
$spread_time = bcsub((string)time(), (string)$store_brokerage_binding_time, 0);
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$list = $userServices->getList(['not_spread_uid' => 0, 'status' => 1, 'spread_time' => ['<', $spread_time]], 'uid,spread_uid,spread_time');
|
||
|
foreach ($list as $userInfo) {
|
||
|
$userServices->update($userInfo['uid'], ['spread_uid' => 0, 'spread_time' => 0], 'uid');
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 配置绑定类型切换重置绑定时间
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function resetSpreadTime()
|
||
|
{
|
||
|
//商城分销功能是否开启 0关闭1开启
|
||
|
if (!sys_config('brokerage_func_status')) return true;
|
||
|
/** @var UserServices $userServices */
|
||
|
$userServices = app()->make(UserServices::class);
|
||
|
$list = $userServices->getList(['not_spread_uid' => 0, 'status' => 1], 'uid');
|
||
|
if ($list) {
|
||
|
$uids = array_column($list, 'uid');
|
||
|
$userServices->update([['uid', 'IN', $uids]], ['spread_time' => time()]);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|