作者 李美松

v6优化程序 OA绑定AICC 新增绑定企业微信

<?php
namespace App\Http\Controllers\Bside\ProjectAssociation;
namespace App\Http\Controllers\Aside\ProjectAssociation;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Aside\ProjectAssociation\ProjectAssociationLogic;
use App\Models\ProjectAssociation\ProjectAssociation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use App\Services\Aside\ProjectAssociation\ProjectAssociationServices;
class ProjectAssociationController extends BaseController
{
private $ProjectAssociationLogic;
public function __construct(Request $request)
{
$this->ProjectAssociationLogic = new ProjectAssociationLogic();
parent::__construct($request);
}
/**
* V6与AICC数据关联
* @return void
* @throws BsideGlobalException
*/
public function saveWeChatData()
public function save()
{
$project_id = (int)request()->post('project_id', 0);
if (empty($project_id)) {
$this->fail('请选择项目!', Code::USER_PARAMS_ERROE);
$this->response('请选择项目!', Code::USER_PARAMS_ERROE);
}
$status = (bool)request()->post('status', 1); # 1 - 正常, 0 - 禁用
$user_id = (int)env('AICC_WECHAT_USER_ID') ?? 0;
if (empty($user_id) && $status) {
$this->fail('请选择要绑定的AICC用户!', Code::USER_PARAMS_ERROE);
$this->response('请选择要绑定的AICC用户!', Code::USER_PARAMS_ERROE);
}
$friend_id = (int)request()->post('friend_id', 0);
if (empty($friend_id) && $status) {
$this->fail('请选择要绑定的AICC用户列表!', Code::USER_PARAMS_ERROE);
$this->response('请选择要绑定的AICC用户列表!', Code::USER_PARAMS_ERROE);
}
$app = (int)request()->post('app', ProjectAssociation::ENTERPRISE_WECHAT);
$app = ProjectAssociation::getApplicationID($app);
$nickname = request()->post('nickname', '');
$user_name = request()->post('user_name', '');
$image = request()->post('image', '');
$data = compact('project_id', 'user_id', 'friend_id', 'nickname', 'user_name', 'image');
$this->ProjectAssociationLogic->saveWeChatData($data);
$data = compact('project_id', 'user_id', 'friend_id', 'nickname', 'user_name', 'image', 'app');
ProjectAssociationServices::getInstance()->save($data);
$this->response('绑定成功');
}
... ... @@ -58,27 +49,34 @@ class ProjectAssociationController extends BaseController
public function check()
{
$project_id = (int)request()->input('project_id', 0);
if (empty($project_id)) {
$this->response('请输入项目信息!', Code::SERVER_ERROR);
}
// 项目绑定状态
$app = (int)request()->input('type', ProjectAssociation::ENTERPRISE_WECHAT);
$app = ProjectAssociation::getApplicationID($app);
$status = request()->input('status');
// 重载redis缓存
$cache = request()->input('cache');
if (isset($status)) {
$status = (int)$status ? ProjectAssociation::STATUS_NORMAL : ProjectAssociation::STATUS_DISABLED;
}
$isRes = $this->ProjectAssociationLogic->normal($project_id);
$isRes = ProjectAssociationServices::getInstance()->normal($project_id, $app);
// 当数据不存在时并开启状态,自动添加一条数据
if (is_null($isRes) && (!is_null($status) && $status)) {
$isRes = $this->ProjectAssociationLogic->saveProject($project_id, $status);
if (is_null($isRes)) {
$value = ProjectAssociationServices::getInstance()->saveProject($project_id, $status, $app);
if (empty($value['bool'])) {
// 保存数据失败
$this->response('绑定AICC数据失败!', Code::SERVER_ERROR);
}
$isRes = $value['isRes'];
} // 关闭状态
elseif (!is_null($isRes) && (!is_null($status) && empty($status))) {
$bool = $this->ProjectAssociationLogic->closedState($isRes, $status);
$bool = ProjectAssociationServices::getInstance()->closedState($isRes, $status);
if ($bool) {
// 关闭aicc绑定成功
$this->response('关闭aicc绑定 - 成功!');
}else{
} else {
// 关闭aicc绑定失败
$this->response('关闭aicc绑定 - 失败!');
}
... ... @@ -88,7 +86,7 @@ class ProjectAssociationController extends BaseController
$this->response('success', Code::SERVER_ERROR);
}
$cache = isset($cache);
$result = $this->ProjectAssociationLogic->getAiccWechatLists($isRes, $cache);
$result = ProjectAssociationServices::getInstance()->getAiccWechatLists($isRes, $app, $cache);
$this->response('success', Code::SUCCESS, $result);
}
}
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Models\ProjectAssociation;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* App\Models\ProjectAssociation\ProjectAssociation
*
... ... @@ -17,11 +18,13 @@ use Illuminate\Database\Eloquent\Model;
* @property string|null $image AICC朋友头像
* @property int|null $status 1 - 正常, 0 - 禁用
* @property int|null $m_status 统计当月是否生成数据
* @property int|null $binding_app 1 - 企业微信 2 - 个人微信
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method Builder|ProjectAssociation newModelQuery()
* @method Builder|ProjectAssociation newQuery()
* @method static Builder|ProjectAssociation query()
* @method Builder|ProjectAssociation whereBindingApp($value)
* @method Builder|ProjectAssociation whereCreatedAt($value)
* @method Builder|ProjectAssociation whereFriendId($value)
* @method Builder|ProjectAssociation whereId($value)
... ... @@ -46,60 +49,30 @@ class ProjectAssociation extends Model
/** @var int 数据状态 - 禁用 */
const STATUS_DISABLED = 0;
/**
* 保存|修改数据
* @param array $data
* @return bool
*/
public function saveData(array $data): bool
{
# V6项目ID
$project_id = (int)$data['project_id'] ?? 0;
$isRes = self::query()->where('project_id', $project_id)->first();
if (!$isRes) {
$isRes = new self();
$isRes->project_id = $project_id;
}
# AICC朋友ID
$isRes->friend_id = $data['friend_id'] ?? 0;
# AICC朋友昵称
$isRes->nickname = $data['nickname'] ?? 0;
# AICC用户ID
$isRes->user_id = $data['user_id'] ?? 0;
# AICC用户姓名
$isRes->user_name = $data['user_name'] ?? '';
# AICC朋友头像
$isRes->image = $data['image'] ?? '';
return $isRes->save();
}
/** @var int 企业微信 */
const ENTERPRISE_WECHAT = 1;
/**
* 检查项目是否存在
* @param $project_id
* @return Builder|Model|object|null
*/
public function check($project_id)
/** @var int 个人微信 */
const PERSONAL_WECHAT = 2;
public static function getApplicationApiUrl($app)
{
return self::query()->where('project_id', $project_id)->first();
return [
1 => env('AICC_ENTERPRISE_WECHAT_FRIEND_API_URL'),
2 => env('AICC_WECHAT_FRIEND_API_URL'),
][$app];
}
/**
* @param int $page
* @param int $perPage
* @return array
* 返回绑定的APP应用类型
* @param $app
* @return int
*/
public function allData(int $page = 1, int $perPage = 15)
public static function getApplicationID($app)
{
$status = 1; # 1 - 正常, 0 - 禁用
$lists = self::query()->where('status', $status)
->where('project_id', '!=', 0)
->where('friend_id', '!=', 0)
->where('user_id', '!=', 0)
->paginate($perPage, ['project_id', 'friend_id', 'user_id'], 'page', $page);
$items = $lists->Items();
$totalPage = $lists->lastPage();
$total = $lists->total();
$currentPage = $lists->currentPage();
return compact('total', 'items', 'totalPage', 'currentPage');
return [
1 => self::ENTERPRISE_WECHAT,
2 => self::PERSONAL_WECHAT,
][$app] ?? self::ENTERPRISE_WECHAT;
}
}
... ...
<?php
namespace App\Http\Logic\Aside\ProjectAssociation;
namespace App\Services\Aside\ProjectAssociation;
use App\Enums\Common\Code;
use App\Http\Logic\Logic;
use App\Exceptions\BsideGlobalException;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Services\BaseService;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class ProjectAssociationLogic extends Logic
class ProjectAssociationServices extends BaseService
{
public function saveWeChatData($data)
/**
* 保存aicc与项目关系数据
* @param array $data
* @return bool
* @throws BsideGlobalException
*/
public function save(array $data)
{
$wx = new ProjectAssociation();
$bool = false;
DB::beginTransaction();
try {
$status = $wx->saveData($data);
# V6项目ID
$project_id = (int)$data['project_id'] ?? 0;
$isRes = ProjectAssociation::query()->where('project_id', $project_id)->first();
if (!$isRes) {
$isRes = new ProjectAssociation();
$isRes->project_id = $project_id;
}
# AICC朋友ID
$isRes->friend_id = $data['friend_id'] ?? 0;
# AICC朋友昵称
$isRes->nickname = $data['nickname'] ?? 0;
# AICC用户ID
$isRes->user_id = $data['user_id'] ?? 0;
# AICC用户姓名
$isRes->user_name = $data['user_name'] ?? '';
# AICC朋友头像
$isRes->image = $data['image'] ?? '';
$isRes->binding_app = $data['app'] ?? 1;
$bool = $isRes->save();
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
$e->getMessage();
errorLog('V6与AICC关联失败', $wx, $e);
errorLog('V6与AICC关联失败', $data, $e);
$this->fail('请检查操作是否正确!', Code::SERVER_MYSQL_ERROR);
}
return $status;
return $bool;
}
/**
* status - 正常
* @param $project_id
* @param $app
* @return ProjectAssociation|Builder|Model|object|null
*/
public function normal($project_id)
public function normal($project_id, $app)
{
return ProjectAssociation::query()->whereProjectId($project_id)->whereStatus(ProjectAssociation::STATUS_NORMAL)->first();
return ProjectAssociation::query()->whereProjectId($project_id)->whereStatus(ProjectAssociation::STATUS_NORMAL)->whereBindingApp($app)->first();
}
/**
* status - 禁用
* @param $project_id
... ... @@ -50,11 +75,12 @@ class ProjectAssociationLogic extends Logic
/**
* 初始化数据/修改数据
* @param int $project_id
* @param int $status
* @return Builder|Model|object|ProjectAssociation|null
* @param $project_id
* @param $status
* @param $app
* @return array
*/
public function saveProject($project_id, $status)
public function saveProject($project_id, $status, $app)
{
$bool = false;
DB::beginTransaction();
... ... @@ -65,29 +91,55 @@ class ProjectAssociationLogic extends Logic
$isRes->project_id = $project_id;
$isRes->user_id = (int)env('AICC_WECHAT_USER_ID');
$isRes->status = $status;
$isRes->binding_app = $app;
try {
$bool = $isRes->save();
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
}
return compact('bool', 'isRes');
}
/**
* 关闭状态
* @param ProjectAssociation $res
* @param int $status 1 - 正常, 0 - 禁用
* @return bool
*/
public function closedState($res, $status)
{
DB::beginTransaction();
$bool = false;
try {
$isRes->save();
$res->status = $status;
$bool = $res->save();
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
}
return $isRes;
return $bool;
}
/**
* 获取AICC微信列表数据
* @param ProjectAssociation $res
* @param bool $cache
* @param int $type 绑定app应用类型
* @param bool $cache 是否缓存
* @return mixed
*/
public function getAiccWechatLists($res, $cache = false)
public function getAiccWechatLists($res, $type = ProjectAssociation::PERSONAL_WECHAT, $cache = false)
{
$redis_key = 'aicc_friend_lists_' . (int)env('AICC_WECHAT_USER_ID');
$redis_key = 'aicc_friend_lists_' . $type . '_' . (int)env('AICC_WECHAT_USER_ID');
$result = $cache ? false : redis_get($redis_key);
if (empty($result)) {
$url = env('AICC_URL') . env('AICC_WECHAT_FRIEND_API_URL');
$apiUrl = ProjectAssociation::getApplicationApiUrl($type);
$url = env('AICC_URL') . $apiUrl;
$result = curlGet($url);
if ($result['data']) {
redis_set($redis_key, json_encode($result), 60);
}
} else {
$result = json_decode($result, true);
}
... ... @@ -99,24 +151,4 @@ class ProjectAssociationLogic extends Logic
];
return $result;
}
/**
* 关闭状态
* @param ProjectAssociation $res
* @param int $status 1 - 正常, 0 - 禁用
* @return bool
*/
public function closedState($res, $status)
{
DB::beginTransaction();
$bool = false;
try {
$res->status = $status;
$bool = $res->save();
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
}
return $bool;
}
}
... ...
... ... @@ -8,10 +8,56 @@ namespace App\Services;
use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use Mockery;
class BaseService
{
/**
* 单例模式
* 特点:三私,两静,一公
* 三私:三个私有方法,(静态变量、构造函数、克隆函数)
* 两静:两个静态方法,(一个静态变量,一个静态方法)
* 一公:单例模式的出口
*
* 优点:
* 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
* 2、避免对资源的多重占用(比如写文件操作)。
*/
protected static $instance;
/**
* @return static
*/
public static function getInstance()
{
if ((static::$instance[static::class] ?? null) instanceof static) {
return static::$instance[static::class];
}
return static::$instance[static::class] = new static();
}
/**
* @return Mockery\Mock
*/
public static function mockInstance()
{
return static::$instance[static::class] = Mockery::mock(static::class)
->makePartial()
->shouldAllowMockingProtectedMethods();
}
private function __construct()
{
}
private function __clone()
{
// TODO: Implement __clone() method.
}
/**
* @notes: 手动抛出异常
* @param string $msg
* @param string $code
... ...
... ... @@ -4,7 +4,7 @@
*/
use App\Http\Controllers\Aside;
use App\Http\Controllers\Bside\ProjectAssociation\ProjectAssociationController;
use App\Http\Controllers\Aside\ProjectAssociation\ProjectAssociationController;
use Illuminate\Support\Facades\Route;
... ... @@ -72,7 +72,7 @@ Route::middleware(['aloginauth'])->group(function () {
//发送记录
Route::any('/log', [Aside\Ai\AiLogController::class, 'lists'])->name('admin.lists');
// 绑定AICC微信应用
Route::post('/wechat', [ProjectAssociationController::class, 'saveWeChatData'])->name('admin.aicc.wechat');
Route::post('/binding/save', [ProjectAssociationController::class, 'save'])->name('admin.binding.save');
// OA后台开启关闭AICC用户绑定
Route::post('/check', [ProjectAssociationController::class, 'check'])->name('admin.aicc.check');
});
... ...