Merge branch 'develop' of https://e.coding.net/g-xtcy5189/cunkebao/cunkebao_v3 into develop
This commit is contained in:
@@ -12,7 +12,7 @@ use think\Db;
|
||||
/**
|
||||
* 设备控制器
|
||||
*/
|
||||
class GetAddResultedDevicesController extends BaseController
|
||||
class GetAddResultedV1Controller extends BaseController
|
||||
{
|
||||
/**
|
||||
* 通过账号id 获取项目id。
|
||||
@@ -5,7 +5,7 @@ namespace app\cunkebao\controller\device;
|
||||
use app\common\model\Device as DeviceModel;
|
||||
use app\common\model\DeviceUser as DeviceUserModel;
|
||||
use app\common\model\User as UserModel;
|
||||
use app\common\model\WechatFriend;
|
||||
use app\common\model\WechatFriend as WechatFriendModel;
|
||||
use app\cunkebao\controller\BaseController;
|
||||
use library\ResponseHelper;
|
||||
|
||||
@@ -22,8 +22,6 @@ class GetDeviceListV1Controller extends BaseController
|
||||
*/
|
||||
protected function makeWhere(array $params = []): array
|
||||
{
|
||||
$where = [];
|
||||
|
||||
// 关键词搜索(同时搜索IMEI和备注)
|
||||
if (!empty($keyword = $this->request->param('keyword'))) {
|
||||
$where[] = ['exp', "d.imei LIKE '%{$keyword}%' OR d.memo LIKE '%{$keyword}%'"];
|
||||
@@ -47,8 +45,10 @@ class GetDeviceListV1Controller extends BaseController
|
||||
protected function makeDeviceIdsWhere(): array
|
||||
{
|
||||
$deviceIds = DeviceUserModel::where(
|
||||
$this->getUserInfo('id'),
|
||||
$this->getUserInfo('companyId')
|
||||
[
|
||||
'userId' => $this->getUserInfo('id'),
|
||||
'companyId' => $this->getUserInfo('companyId')
|
||||
]
|
||||
)
|
||||
->column('deviceId');
|
||||
|
||||
@@ -56,7 +56,7 @@ class GetDeviceListV1Controller extends BaseController
|
||||
throw new \Exception('请联系管理员绑定设备', 403);
|
||||
}
|
||||
|
||||
$where['d.id'] = ['in', $deviceIds];
|
||||
$where['d.id'] = array('in', $deviceIds);
|
||||
|
||||
return $where;
|
||||
}
|
||||
@@ -65,11 +65,9 @@ class GetDeviceListV1Controller extends BaseController
|
||||
* 获取设备列表
|
||||
*
|
||||
* @param array $where 查询条件
|
||||
* @param int $page 页码
|
||||
* @param int $limit 每页数量
|
||||
* @return \think\Paginator 分页对象
|
||||
*/
|
||||
protected function getDeviceList(array $where, int $page = 1, int $limit = 10): \think\Paginator
|
||||
protected function getDeviceList(array $where): \think\Paginator
|
||||
{
|
||||
$query = DeviceModel::alias('d')
|
||||
->field([
|
||||
@@ -101,19 +99,19 @@ class GetDeviceListV1Controller extends BaseController
|
||||
*/
|
||||
protected function countFriend(\think\Paginator $list): array
|
||||
{
|
||||
$result = [];
|
||||
$resultSets = [];
|
||||
|
||||
foreach ($list->items() as $item) {
|
||||
$section = $item->toArray();
|
||||
$sections = $item->toArray();
|
||||
|
||||
if ($item->wechatId) {
|
||||
$section['totalFriend'] = WechatFriend::where(['ownerWechatId' => $section['wechatId']])->count();
|
||||
$sections['totalFriend'] = WechatFriendModel::where(['ownerWechatId' => $item->wechatId])->count();
|
||||
}
|
||||
|
||||
array_push($result, $section);
|
||||
array_push($resultSets, $sections);
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $resultSets;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -126,8 +124,10 @@ class GetDeviceListV1Controller extends BaseController
|
||||
if ($this->getUserInfo('isAdmin') == UserModel::ADMIN_STP) {
|
||||
$where = $this->makeWhere();
|
||||
$result = $this->getDeviceList($where);
|
||||
} else {
|
||||
$where = $this->makeWhere($this->makeDeviceIdsWhere());
|
||||
}
|
||||
|
||||
else {
|
||||
$where = $this->makeWhere( $this->makeDeviceIdsWhere() );
|
||||
$result = $this->getDeviceList($where);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
<?php
|
||||
|
||||
namespace app\cunkebao\controller\wechat;
|
||||
|
||||
use app\common\model\WechatAccount as WechatAccountModel;
|
||||
use app\common\model\WechatFriend as WechatFriendModel;
|
||||
use app\cunkebao\controller\BaseController;
|
||||
use library\ResponseHelper;
|
||||
|
||||
/**
|
||||
* 设备微信控制器
|
||||
*/
|
||||
class GetWechatOnDeviceSummarizeV1Controller extends BaseController
|
||||
{
|
||||
/**
|
||||
* TODO 计算账号年龄(从创建时间到现在)
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getRegisterDate(string $wechatId): string
|
||||
{
|
||||
return date('Y-m-d H:i:s', strtotime('-15 months'));
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取每天聊天次数。
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getChatTimesPerDay(string $wechatId): int
|
||||
{
|
||||
return mt_rand(0, 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 总聊天数量
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getChatTimesTotal(string $wechatId): int
|
||||
{
|
||||
return mt_rand(2000, 1000000);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算活跃程度(根据消息数)
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getActivityLevel(string $wechatId): array
|
||||
{
|
||||
return [
|
||||
'allTimes' => $this->getChatTimesTotal($wechatId),
|
||||
'dayTimes' => $this->getChatTimesPerDay($wechatId),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取限制记录
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return array
|
||||
*/
|
||||
protected function getRestrict(string $wechatId): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
'id' => 1,
|
||||
'type' => 'warnnig',
|
||||
'reason' => '频繁添加好友',
|
||||
'date' => date('Y-m-d H:i:s', strtotime('-1 day')),
|
||||
],
|
||||
[
|
||||
'id' => 2,
|
||||
'type' => 'error',
|
||||
'reason' => '营销内容违规',
|
||||
'date' => date('Y-m-d H:i:s', strtotime('-1 day')),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算两个时间相差几个月
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return float|int
|
||||
* @throws \DateMalformedStringException
|
||||
*/
|
||||
protected function getDateDiff(string $wechatId): int
|
||||
{
|
||||
$currentData = new \DateTime(date('Y-m-d H:i:s', time()));
|
||||
$registerDate = new \DateTime($this->getRegisterDate($wechatId));
|
||||
|
||||
$interval = date_diff($currentData, $registerDate);
|
||||
|
||||
return $interval->y * 12 + $interval->m;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算账号年龄权重
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
* @throws \DateMalformedStringException
|
||||
*/
|
||||
protected function _calculAgeWeight(string $wechatId): int
|
||||
{
|
||||
// 规定账号年龄五年起拥有最高权重
|
||||
$cha = ceil($this->getDateDiff($wechatId) / 60) * 100;
|
||||
|
||||
return $cha > 100 ? 100 : $cha;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算活跃度权重
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function _calActivityWeigth(string $wechatId): int
|
||||
{
|
||||
// 规定每天发送50条消息起拥有最高权重
|
||||
$cha = ceil($this->getChatTimesPerDay($wechatId) / 50) * 100;
|
||||
|
||||
return $cha > 100 ? 100 : $cha;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算限制影响权重
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function _calRestrictWeigth(string $wechatId): int
|
||||
{
|
||||
$list = $this->getRestrict($wechatId); // 2
|
||||
$gtmd = 10 - count($list); // 规定没有限制记录拥有最高权重,10条以上权重为0
|
||||
|
||||
return ($gtmd < 0 ? 0 : $gtmd) * 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算实名认证权重
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function _calRealNameWeigth(string $wechatId): int
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算好友数量(每5权重=1好友,最多20个)
|
||||
*
|
||||
* @param int $weight
|
||||
* @return int
|
||||
*/
|
||||
protected function _calAllowedFriends(int $weight): int
|
||||
{
|
||||
$adjustedWeight = $weight;
|
||||
$lastDigit = $weight % 10;
|
||||
|
||||
if ($weight < 10) {
|
||||
if ($lastDigit < 5) {
|
||||
$adjustedWeight = 5;
|
||||
} else {
|
||||
$adjustedWeight = 10;
|
||||
}
|
||||
}
|
||||
|
||||
return min(20, floor($adjustedWeight / 5));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取账号权重
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return array
|
||||
*/
|
||||
protected function getAccountWeight(string $wechatId): array
|
||||
{
|
||||
$ageWeight = $this->_calculAgeWeight($wechatId); // 账号年龄权重
|
||||
$activityWeigth = $this->_calActivityWeigth($wechatId); // 计算活跃度权重
|
||||
$restrictWeight = $this->_calRestrictWeigth($wechatId); // 计算限制影响权重
|
||||
$realNameWeight = $this->_calRealNameWeigth($wechatId); // 计算实名认证权重
|
||||
|
||||
$scope = ceil(($ageWeight + $activityWeigth + $restrictWeight + $realNameWeight) / 4); // 计算总分
|
||||
|
||||
return compact(
|
||||
'scope',
|
||||
'ageWeight',
|
||||
'activityWeigth',
|
||||
'restrictWeight',
|
||||
'realNameWeight'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算今日新增好友数量
|
||||
*
|
||||
* @param string $ownerWechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getTodayNewFriendCount(string $ownerWechatId): int
|
||||
{
|
||||
return WechatFriendModel::where( compact('ownerWechatId') )
|
||||
->whereBetween('createTime',
|
||||
[
|
||||
strtotime(date('Y-m-d 00:00:00')),
|
||||
strtotime(date('Y-m-d 23:59:59'))
|
||||
]
|
||||
)
|
||||
->count('*');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取账号加友统计数据.
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @param array $accountWeight
|
||||
* @return array
|
||||
*/
|
||||
protected function getStatistics(string $wechatId, array $accountWeight): array
|
||||
{
|
||||
return [
|
||||
'addedCount' => $this->getTodayNewFriendCount($wechatId),
|
||||
'addLimit' => $this->_calAllowedFriends($accountWeight['scope'])
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取原始的64位的微信id
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function getStringWechatId(): string
|
||||
{
|
||||
$account = WechatAccountModel::find(333333);
|
||||
|
||||
if (is_null($account)) {
|
||||
throw new \Exception('微信账号不存在', 404);
|
||||
}
|
||||
|
||||
return $account->wechatId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信号详情
|
||||
*
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
try {
|
||||
// $wechatId = $this->getStringWechatId();
|
||||
$wechatId = '1111111';
|
||||
|
||||
$accountAge = $this->getRegisterDate($wechatId);
|
||||
$activityLevel = $this->getActivityLevel($wechatId);
|
||||
$accountWeight = $this->getAccountWeight($wechatId);
|
||||
$statistics = $this->getStatistics($wechatId, $accountWeight);
|
||||
$restrictions = $this->getRestrict($wechatId);
|
||||
|
||||
return ResponseHelper::success(
|
||||
compact(
|
||||
'accountAge',
|
||||
'activityLevel',
|
||||
'accountWeight',
|
||||
'statistics',
|
||||
'restrictions'
|
||||
)
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
return ResponseHelper::error($e->getMessage(), $e->getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
<?php
|
||||
|
||||
namespace app\cunkebao\controller\wechat;
|
||||
|
||||
use app\common\model\Device as DeviceModel;
|
||||
use app\common\model\Device as DevicesModel;
|
||||
use app\common\model\DeviceUser as DeviceUserModel;
|
||||
use app\common\model\DeviceWechatLogin as DeviceWechatLoginModel;
|
||||
use app\common\model\User as UserModel;
|
||||
use app\common\model\WechatAccount as WechatAccountModel;
|
||||
use app\common\model\WechatFriend as WechatFriendModel;
|
||||
use app\cunkebao\controller\BaseController;
|
||||
use library\ResponseHelper;
|
||||
|
||||
/**
|
||||
* 微信控制器
|
||||
*/
|
||||
class GetWechatsOnDevicesV1Controller extends BaseController
|
||||
{
|
||||
/**
|
||||
* 计算今日可添加好友数量
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getCanAddFriendCount(string $wechatId): int
|
||||
{
|
||||
return 20; // 最多限制 20 次
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算今日新增好友数量
|
||||
*
|
||||
* @param string $ownerWechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getTodayNewFriendCount(string $ownerWechatId): int
|
||||
{
|
||||
return WechatFriendModel::where( compact('ownerWechatId') )
|
||||
->whereBetween('createTime',
|
||||
[
|
||||
strtotime(date('Y-m-d 00:00:00')),
|
||||
strtotime(date('Y-m-d 23:59:59'))
|
||||
]
|
||||
)
|
||||
->count('*');
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取微信加友状态
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getWechatAddFriendStatus(string $wechatId): int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信好友数量
|
||||
*
|
||||
* @param string $ownerWechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getFriendsCount(string $ownerWechatId): int
|
||||
{
|
||||
return WechatFriendModel::where(compact('ownerWechatId'))->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信所属设备
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getWhereOnDevice(string $wechatId): string
|
||||
{
|
||||
return (string)DeviceModel::alias('d')
|
||||
->where(
|
||||
[
|
||||
'l.wechatId' => $wechatId,
|
||||
'l.alive' => DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE
|
||||
]
|
||||
)
|
||||
->join('device_wechat_login l', 'd.id = l.deviceId')
|
||||
->value('d.memo');
|
||||
}
|
||||
|
||||
/**
|
||||
* 主操盘手获取项目下所有设备的id
|
||||
*
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function getCompanyDevicesId(): array
|
||||
{
|
||||
return DevicesModel::where(
|
||||
[
|
||||
'companyId' => $this->getUserInfo('companyId')
|
||||
]
|
||||
)
|
||||
->column('id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 非主操盘手获取分配的设备
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getUserDevicesId(): array
|
||||
{
|
||||
return DeviceUserModel::where(
|
||||
[
|
||||
'userId' => $this->getUserInfo('id'),
|
||||
'companyId' => $this->getUserInfo('companyId')
|
||||
]
|
||||
)
|
||||
->column('deviceId');
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据不同角色,显示的设备数量不同
|
||||
*
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function getDevicesId(): array
|
||||
{
|
||||
return ($this->getUserInfo('isAdmin') == UserModel::ADMIN_STP)
|
||||
? $this->getCompanyDevicesId() // 主操盘手获取所有的设备
|
||||
: $this->getUserDevicesId(); // 非主操盘手获取分配的设备
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取有登录设备的微信id
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getWechatIdsOnDevices(): array
|
||||
{
|
||||
// 关联设备id查询,过滤掉已删除的设备
|
||||
if (empty($deviceIds = $this->getDevicesId())) {
|
||||
throw new \Exception('暂无设备数据', 200);
|
||||
}
|
||||
|
||||
return DeviceWechatLoginModel::where(
|
||||
[
|
||||
'companyId' => $this->getUserInfo('companyId'),
|
||||
'alive' => DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE,
|
||||
]
|
||||
)
|
||||
->where('deviceId', 'in', $deviceIds)
|
||||
->column('wechatId');
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取设备最新活跃时间
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getLatestActiveTime(string $wechatId): string
|
||||
{
|
||||
return date('Y-m-d H:i:s', strtotime('-1 day'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建查询条件
|
||||
*
|
||||
* @param array $params
|
||||
* @return array
|
||||
*/
|
||||
protected function makeWhere(array $params = []): array
|
||||
{
|
||||
if (empty($wechatIds = $this->getWechatIdsOnDevices())) {
|
||||
throw new \Exception('设备尚未有登录微信', 200);
|
||||
}
|
||||
|
||||
// 关键词搜索(同时搜索微信号和昵称)
|
||||
if (!empty($keyword = $this->request->param('keyword'))) {
|
||||
$where[] = ['exp', "w.alias LIKE '%{$keyword}%' OR w.nickname LIKE '%{$keyword}%'"];
|
||||
}
|
||||
|
||||
$where['w.wechatId'] = array('in', implode(',', $wechatIds));
|
||||
|
||||
return array_merge($params, $where);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在线微信账号列表
|
||||
*
|
||||
* @param array $where
|
||||
* @return \think\Paginator 分页对象
|
||||
*/
|
||||
protected function getOnlineWechatList(array $where): \think\Paginator
|
||||
{
|
||||
$query = WechatAccountModel::alias('w')
|
||||
->field(
|
||||
[
|
||||
'w.id', 'w.nickname', 'w.avatar',
|
||||
'CASE WHEN w.alias IS NULL OR w.alias = "" THEN w.wechatId ELSE w.alias END AS wechatId',
|
||||
'l.deviceId'
|
||||
]
|
||||
)
|
||||
->join('device_wechat_login l', 'w.wechatId = l.wechatId')
|
||||
->order('w.id desc');
|
||||
|
||||
foreach ($where as $key => $value) {
|
||||
if (is_numeric($key) && is_array($value) && isset($value[0]) && $value[0] === 'exp') {
|
||||
$query->whereExp('', $value[1]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
$query->where($key, ...$value);
|
||||
continue;
|
||||
}
|
||||
|
||||
$query->where($key, $value);
|
||||
}
|
||||
|
||||
return $query->paginate($this->request->param('limit/d', 10), false, ['page' => $this->request->param('page/d', 1)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建返回数据
|
||||
*
|
||||
* @param \think\Paginator $result
|
||||
* @return array
|
||||
*/
|
||||
protected function makeResultedSet(\think\Paginator $result): array
|
||||
{
|
||||
$resultSets = [];
|
||||
|
||||
foreach ($result->items() as $item) {
|
||||
$sections = $item->toArray() + [
|
||||
'times' => $this->getCanAddFriendCount($item->wechatId),
|
||||
'addedCount' => $this->getTodayNewFriendCount($item->wechatId),
|
||||
'wechatStatus' => $this->getWechatAddFriendStatus($item->wechatId),
|
||||
'totalFriend' => $this->getFriendsCount($item->wechatId),
|
||||
'deviceMemo' => $this->getWhereOnDevice($item->wechatId),
|
||||
'activeTime' => $this->getLatestActiveTime($item->wechatId),
|
||||
];
|
||||
|
||||
array_push($resultSets, $sections);
|
||||
}
|
||||
|
||||
return $resultSets;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在线微信账号列表
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
try {
|
||||
$result = $this->getOnlineWechatList(
|
||||
$this->makeWhere()
|
||||
);
|
||||
|
||||
return ResponseHelper::success(
|
||||
[
|
||||
'list' => $this->makeResultedSet($result),
|
||||
'total' => $result->total(),
|
||||
]
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
return ResponseHelper::error($e->getMessage(), $e->getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user