371 lines
12 KiB
PHP
371 lines
12 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace app\chukebao\controller;
|
|||
|
|
|
|||
|
|
use app\chukebao\model\Reply;
|
|||
|
|
use app\chukebao\model\ReplyGroup;
|
|||
|
|
use library\ResponseHelper;
|
|||
|
|
|
|||
|
|
class ReplyController extends BaseController
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* 列表
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
* @throws \Exception
|
|||
|
|
*/
|
|||
|
|
public function getList()
|
|||
|
|
{
|
|||
|
|
$replyType = $this->request->param('replyType', 0);
|
|||
|
|
$keyword = $this->request->param('keyword', '');
|
|||
|
|
$userId = $this->getUserInfo('id');
|
|||
|
|
$companyId = $this->getUserInfo('companyId');
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 构建分组查询条件
|
|||
|
|
$groupWhere = [
|
|||
|
|
['isDel','=',0]
|
|||
|
|
];
|
|||
|
|
switch ($replyType) {
|
|||
|
|
case 0:
|
|||
|
|
//公共快捷语
|
|||
|
|
$groupWhere[] = ['replyType', '=', 0];
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
//私有快捷语
|
|||
|
|
$groupWhere[] = ['companyId', '=', $companyId];
|
|||
|
|
$groupWhere[] = ['userId', '=', $userId];
|
|||
|
|
$groupWhere[] = ['replyType', '=', 1];
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
//公司快捷语
|
|||
|
|
$groupWhere[] = ['companyId', '=', $companyId];
|
|||
|
|
$groupWhere[] = ['replyType', '=', 2];
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
$groupWhere[] = ['replyType', '=', 0];
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (!empty($keyword)) {
|
|||
|
|
$groupWhere[] = ['groupName','like', '%' . $keyword . '%'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取所有分组
|
|||
|
|
$allGroups = ReplyGroup::where($groupWhere)
|
|||
|
|
->order('sortIndex asc,id DESC')
|
|||
|
|
->select();
|
|||
|
|
// 构建树形结构
|
|||
|
|
$result = $this->buildGroupTree($allGroups, $keyword);
|
|||
|
|
|
|||
|
|
return ResponseHelper::success($result, '获取成功');
|
|||
|
|
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('获取失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 新增快捷语分组
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function addGroup()
|
|||
|
|
{
|
|||
|
|
$groupName = $this->request->param('groupName', '');
|
|||
|
|
$parentId = (int)$this->request->param('parentId', 0);
|
|||
|
|
$replyType = (int)$this->request->param('replyType', 0); // 0公共 1私有 2公司
|
|||
|
|
$sortIndex = (string)$this->request->param('sortIndex', 50);
|
|||
|
|
|
|||
|
|
$userId = $this->getUserInfo('id');
|
|||
|
|
$companyId = $this->getUserInfo('companyId');
|
|||
|
|
$accountId = $this->getUserInfo('s2_accountId');
|
|||
|
|
|
|||
|
|
if ($groupName === '') {
|
|||
|
|
return ResponseHelper::error('分组名称不能为空');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$data = [
|
|||
|
|
'groupName' => $groupName,
|
|||
|
|
'parentId' => $parentId,
|
|||
|
|
'replyType' => $replyType,
|
|||
|
|
'sortIndex' => $sortIndex,
|
|||
|
|
// 兼容现有程序中使用到的字段
|
|||
|
|
'companyId' => $companyId,
|
|||
|
|
'userId' => $userId,
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/** @var ReplyGroup $group */
|
|||
|
|
$group = new ReplyGroup();
|
|||
|
|
$group->save($data);
|
|||
|
|
|
|||
|
|
return ResponseHelper::success($group->toArray(), '创建成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('创建失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 新增快捷语
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function addReply()
|
|||
|
|
{
|
|||
|
|
$groupId = (int)$this->request->param('groupId', 0);
|
|||
|
|
$title = $this->request->param('title', '');
|
|||
|
|
$msgType = (int)$this->request->param('msgType', 1); // 1文本 3图片 43视频 49链接 等
|
|||
|
|
$content = $this->request->param('content', '');
|
|||
|
|
$sortIndex = (string)$this->request->param('sortIndex', 50);
|
|||
|
|
|
|||
|
|
$accountId = $this->getUserInfo('s2_accountId');
|
|||
|
|
$companyId = $this->getUserInfo('companyId');
|
|||
|
|
$userId = $this->getUserInfo('id');
|
|||
|
|
|
|||
|
|
if ($groupId <= 0) {
|
|||
|
|
return ResponseHelper::error('分组ID不合法');
|
|||
|
|
}
|
|||
|
|
if ($title === '') {
|
|||
|
|
return ResponseHelper::error('标题不能为空');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$now = time();
|
|||
|
|
$data = [
|
|||
|
|
'tenantId' => $companyId,
|
|||
|
|
'groupId' => $groupId,
|
|||
|
|
'accountId' => $accountId,
|
|||
|
|
'title' => $title,
|
|||
|
|
'msgType' => $msgType,
|
|||
|
|
'content' => $content,
|
|||
|
|
'sortIndex' => $sortIndex,
|
|||
|
|
'createTime' => $now,
|
|||
|
|
'lastUpdateTime' => $now,
|
|||
|
|
'userId' => $userId,
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/** @var Reply $reply */
|
|||
|
|
$reply = new Reply();
|
|||
|
|
$reply->save($data);
|
|||
|
|
|
|||
|
|
return ResponseHelper::success($reply->toArray(), '创建成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('创建失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 编辑快捷语分组
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function updateGroup()
|
|||
|
|
{
|
|||
|
|
$id = (int)$this->request->param('id', 0);
|
|||
|
|
if ($id <= 0) {
|
|||
|
|
return ResponseHelper::error('分组ID不合法');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$data = [];
|
|||
|
|
$groupName = $this->request->param('groupName', null);
|
|||
|
|
$parentId = $this->request->param('parentId', null);
|
|||
|
|
$replyType = $this->request->param('replyType', null);
|
|||
|
|
$sortIndex = $this->request->param('sortIndex', null);
|
|||
|
|
|
|||
|
|
if ($groupName !== null) $data['groupName'] = $groupName;
|
|||
|
|
if ($parentId !== null) $data['parentId'] = (int)$parentId;
|
|||
|
|
if ($replyType !== null) $data['replyType'] = (int)$replyType;
|
|||
|
|
if ($sortIndex !== null) $data['sortIndex'] = (string)$sortIndex;
|
|||
|
|
|
|||
|
|
if (empty($data)) {
|
|||
|
|
return ResponseHelper::error('无可更新字段');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$group = ReplyGroup::where(['id' => $id,'isDel' => 0])->find();
|
|||
|
|
if (empty($group)) {
|
|||
|
|
return ResponseHelper::error('分组不存在');
|
|||
|
|
}
|
|||
|
|
$group->save($data);
|
|||
|
|
return ResponseHelper::success($group->toArray(), '更新成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('更新失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 假删除快捷语分组
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function deleteGroup()
|
|||
|
|
{
|
|||
|
|
$id = (int)$this->request->param('id', 0);
|
|||
|
|
if ($id <= 0) {
|
|||
|
|
return ResponseHelper::error('分组ID不合法');
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
$group = ReplyGroup::where(['id' => $id,'isDel' => 0])->find();
|
|||
|
|
if (empty($group)) {
|
|||
|
|
return ResponseHelper::error('分组不存在');
|
|||
|
|
}
|
|||
|
|
$group->save(['isDel' => 1,'delTime' => time()]);
|
|||
|
|
return ResponseHelper::success([], '删除成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('删除失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 编辑快捷语
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function updateReply()
|
|||
|
|
{
|
|||
|
|
$id = (int)$this->request->param('id', 0);
|
|||
|
|
if ($id <= 0) {
|
|||
|
|
return ResponseHelper::error('快捷语ID不合法');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$data = [];
|
|||
|
|
$groupId = $this->request->param('groupId', null);
|
|||
|
|
$title = $this->request->param('title', null);
|
|||
|
|
$msgType = $this->request->param('msgType', null);
|
|||
|
|
$content = $this->request->param('content', null);
|
|||
|
|
$sortIndex = $this->request->param('sortIndex', null);
|
|||
|
|
|
|||
|
|
if ($groupId !== null) $data['groupId'] = (int)$groupId;
|
|||
|
|
if ($title !== null) $data['title'] = $title;
|
|||
|
|
if ($msgType !== null) $data['msgType'] = (int)$msgType;
|
|||
|
|
if ($content !== null) $data['content'] = $content;
|
|||
|
|
if ($sortIndex !== null) $data['sortIndex'] = (string)$sortIndex;
|
|||
|
|
if (!empty($data)) {
|
|||
|
|
$data['lastUpdateTime'] = time();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (empty($data)) {
|
|||
|
|
return ResponseHelper::error('无可更新字段');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$reply = Reply::where(['id' => $id,'isDel' => 0])->find();
|
|||
|
|
if (empty($reply)) {
|
|||
|
|
return ResponseHelper::error('快捷语不存在');
|
|||
|
|
}
|
|||
|
|
$reply->save($data);
|
|||
|
|
return ResponseHelper::success($reply->toArray(), '更新成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('更新失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 假删除快捷语
|
|||
|
|
* @return \think\response\Json
|
|||
|
|
*/
|
|||
|
|
public function deleteReply()
|
|||
|
|
{
|
|||
|
|
$id = (int)$this->request->param('id', 0);
|
|||
|
|
if ($id <= 0) {
|
|||
|
|
return ResponseHelper::error('快捷语ID不合法');
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
$reply = Reply::where(['id' => $id,'isDel' => 0])->find();
|
|||
|
|
if (empty($reply)) {
|
|||
|
|
return ResponseHelper::error('快捷语不存在');
|
|||
|
|
}
|
|||
|
|
$reply->save(['isDel' => 1, 'delTime' => time()]);
|
|||
|
|
return ResponseHelper::success([], '删除成功');
|
|||
|
|
} catch (\Exception $e) {
|
|||
|
|
return ResponseHelper::error('删除失败:' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 构建分组树形结构
|
|||
|
|
* @param array $groups 所有分组数据
|
|||
|
|
* @param string $keyword 搜索关键词
|
|||
|
|
* @return array
|
|||
|
|
*/
|
|||
|
|
private function buildGroupTree($groups, $keyword = '')
|
|||
|
|
{
|
|||
|
|
$tree = [];
|
|||
|
|
$groupMap = [];
|
|||
|
|
|
|||
|
|
// 先构建分组映射
|
|||
|
|
foreach ($groups as $group) {
|
|||
|
|
$groupMap[$group->id] = $group->toArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构建树形结构
|
|||
|
|
foreach ($groups as $group) {
|
|||
|
|
$groupData = $this->buildGroupData($group, $keyword);
|
|||
|
|
|
|||
|
|
if ($group->parentId == null || $group->parentId == 0) {
|
|||
|
|
// 顶级分组
|
|||
|
|
$tree[] = $groupData;
|
|||
|
|
} else {
|
|||
|
|
// 子分组,需要找到父分组并添加到其children中
|
|||
|
|
$this->addToParentGroup($tree, $group->parentId, $groupData);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $tree;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 构建单个分组数据
|
|||
|
|
* @param object $group 分组对象
|
|||
|
|
* @param string $keyword 搜索关键词
|
|||
|
|
* @return array
|
|||
|
|
*/
|
|||
|
|
private function buildGroupData($group, $keyword = '')
|
|||
|
|
{
|
|||
|
|
// 构建快捷回复查询条件
|
|||
|
|
$replyWhere[] =[
|
|||
|
|
['groupId' ,'=', $group->id],
|
|||
|
|
['isDel','=',0]
|
|||
|
|
];
|
|||
|
|
if (!empty($keyword)) {
|
|||
|
|
$replyWhere[] = ['title','like', '%' . $keyword . '%'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取该分组下的快捷回复
|
|||
|
|
$replies = Reply::where($replyWhere)
|
|||
|
|
->order('sortIndex asc, id desc
|
|||
|
|
')
|
|||
|
|
->select();
|
|||
|
|
|
|||
|
|
return [
|
|||
|
|
'id' => $group->id,
|
|||
|
|
'groupName' => $group->groupName,
|
|||
|
|
'sortIndex' => $group->sortIndex,
|
|||
|
|
'parentId' => $group->parentId,
|
|||
|
|
'replyType' => $group->replyType,
|
|||
|
|
'replys' => $group->replys,
|
|||
|
|
'companyId' => $group->companyId,
|
|||
|
|
'userId' => $group->userId,
|
|||
|
|
'replies' => $replies->toArray(),
|
|||
|
|
'children' => [] // 子分组
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 将子分组添加到父分组中
|
|||
|
|
* @param array $tree 树形结构
|
|||
|
|
* @param int $parentId 父分组ID
|
|||
|
|
* @param array $childGroup 子分组数据
|
|||
|
|
*/
|
|||
|
|
private function addToParentGroup(&$tree, $parentId, $childGroup)
|
|||
|
|
{
|
|||
|
|
foreach ($tree as &$group) {
|
|||
|
|
if ($group['id'] == $parentId) {
|
|||
|
|
$group['children'][] = $childGroup;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 递归查找子分组
|
|||
|
|
if (!empty($group['children'])) {
|
|||
|
|
$this->addToParentGroup($group['children'], $parentId, $childGroup);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|