diff --git a/app/common/controller/PresetController.php b/app/common/controller/PresetController.php index b1c428e..bd92d2f 100644 --- a/app/common/controller/PresetController.php +++ b/app/common/controller/PresetController.php @@ -65,10 +65,10 @@ class PresetController extends BaseController } - public function users() + public function users(Request $request) { try { - $result = (new UserService())->getList(); + $result = (new UserService())->getList($request); return $this->success($result, '获取用户列表'); } catch (\Throwable $e) { return $this->error($e->getMessage()); diff --git a/app/common/logic/UserLogic.php b/app/common/logic/UserLogic.php index c7d5343..55e9608 100644 --- a/app/common/logic/UserLogic.php +++ b/app/common/logic/UserLogic.php @@ -3,8 +3,11 @@ namespace app\common\logic; use app\common\model\User; +use app\common\model\UserGroupMembers; use app\common\traits\crud\CrudLogicTrait; use support\exception\BusinessException; +use support\Request; +use app\common\model\UserRoles; class UserLogic { @@ -20,7 +23,7 @@ class UserLogic */ public function userInfo(int $uid) { - $user = User::find($uid); + $user = User::with('reportToInfo')->find($uid); if (!$user) { throw new BusinessException('账户不存在', 404); @@ -38,6 +41,7 @@ class UserLogic */ public function edit(int $uid, array $data) { + // $user = User::find($uid); if (!$user) { @@ -47,6 +51,26 @@ class UserLogic $user->fill($data); $user->save(); + // 绑定内勤 10.13 add + if (isset($data['office_clerk_id']) && $data['office_clerk_id'] > 0) { + $ug = UserGroupMembers::where('user_id', $uid)->where('status', 1)->first(); + if ($ug) { + $ug->delete(); + } + + $group = UserGroupMembers::where('user_id', $data['office_clerk_id'])->where('is_leader', 1)->where('status', 1)->first(); + if (!$group) { + throw new BusinessException('该内勤还未创建分组', 404); + } + + UserGroupMembers::create([ + 'user_id' => $uid, + 'group_id' => $group->group_id, + 'is_leader' => 0, + 'status' => 1 + ]); + } + return $user; } @@ -64,9 +88,16 @@ class UserLogic /** * 获取用户列表 */ - public function getList() + public function getList(Request $request) { - $list = User::where('status', 1)->orderBy('id', 'desc')->get(); + $p = $request->all(); + + $user = User::where('status', 1); + if (isset($p['role_id']) && $p['role_id'] > 0) { + $userIds = UserRoles::where('role_id', $p['role_id'])->pluck('user_id'); + $user->whereIn('id', $userIds); + } + $list = $user->orderBy('id', 'desc')->get(); $arr = []; foreach ($list->toArray() as $item) { $arr[] = [ diff --git a/app/common/model/User.php b/app/common/model/User.php index 88c670d..9a9a4fa 100644 --- a/app/common/model/User.php +++ b/app/common/model/User.php @@ -98,4 +98,10 @@ class User extends Model ->orWhere('phone', $account) ->orWhere('email', $account); } + + + public function reportToInfo() + { + return $this->hasOne(User::class, 'id', 'report_to'); + } } \ No newline at end of file diff --git a/app/common/service/UserService.php b/app/common/service/UserService.php index 74c12c4..32a7d43 100644 --- a/app/common/service/UserService.php +++ b/app/common/service/UserService.php @@ -5,6 +5,8 @@ namespace app\common\service; use app\common\logic\UserLogic; use app\common\model\Corp; use app\common\model\User; +use app\common\model\UserGroup; +use app\common\model\UserGroupMembers; use app\common\traits\crud\CrudLogicTrait; use app\common\traits\crud\CrudServiceTrait; use app\common\utils\CrudUtil; @@ -68,6 +70,27 @@ class UserService public function getUser(int $uid, $corp_abbr) { $user = $this->logic->userInfo($uid); + + // 查找直属上级 10.13 add + $reportToInfo = []; + if ($user->reportToInfo) { + $reportToInfo = [ + 'id' => $user->reportToInfo->id, + 'name' => $user->reportToInfo->name + ]; + } + + // 查找绑定内勤 10.13 add + $officeClerkInfo = []; + $ugm = UserGroupMembers::where('user_id', $uid)->where('status', 1)->first(); + if ($ugm) { + $lugm = UserGroupMembers::where('group_id', $ugm->group_id)->where('is_leader', 1)->first(); + if ($lugm) { + $officeClerkInfo['id'] = $lugm->user_id; + $officeClerkInfo['name'] = User::where('id', $lugm->user_id)->value('name'); + } + } + $corp_name = Corp::where('abbr', $corp_abbr)->value('name'); $ossservice = new OssService(); return [ @@ -90,6 +113,8 @@ class UserService 'roles' => $user->roles->pluck('name'), 'sign_img' => $user->sign_img, 'sign_img_url' => (!empty($user->sign_img))?$ossservice->generatePrivateUrl($user->sign_img):'', + 'report_to_info' => $reportToInfo, + 'office_clerk_info' => $officeClerkInfo ]; } @@ -126,9 +151,9 @@ class UserService /** * 获取用户列表 */ - public function getList() + public function getList(Request $request) { - return $this->logic->getList(); + return $this->logic->getList($request); } /** 分页列表 */ diff --git a/app/common/utils/WsEvents.php b/app/common/utils/WsEvents.php index e539831..96596b8 100644 --- a/app/common/utils/WsEvents.php +++ b/app/common/utils/WsEvents.php @@ -5,6 +5,7 @@ namespace app\common\utils; use GatewayWorker\Lib\Gateway; use app\common\utils\WsResponse; use app\common\service\MessageNotificationsService; +use support\Redis; class WsEvents { @@ -158,14 +159,24 @@ class WsEvents public function systemConnect(?string $traceId) { - $num = (new \app\common\utils\approval\service\ApprovalFlowService())->getInitTodoCount($_SESSION['uid']); - $this->todoCounts($_SESSION['uid'], $num); - + // 响应 Gateway::sendToClient($this->clientId, WsResponse::success( 'system.connect.receive', ['time' => time()], $traceId )); + + // 获取审批待办数量 + $num = (new \app\common\utils\approval\service\ApprovalFlowService())->getInitTodoCount($_SESSION['uid']); + $this->todoCounts($_SESSION['uid'], $num); + + // 绑定检查 + $initData = $this->initCheck($_SESSION['uid']); + Gateway::sendToClient($this->clientId, WsResponse::success( + 'system.init.check', + $initData, + $traceId + )); } // ================= 消息通知事件 ================= @@ -259,7 +270,6 @@ class WsEvents /* - init.pull approval.todo.counts 审批待办数量 */ @@ -285,8 +295,44 @@ class WsEvents - // ================= 临时业务处理 ================= + // ================= 业务处理 ================= + /** + * 初始化检查 + */ + public function initCheck(int $userId) + { + $data = [ + 'is_report_to' => false, + 'is_office_clerk' => false, + 'is_sign' => false + ]; + + $user = \app\common\model\User::find($userId); + + if ($user->report_to > 0) { + $data['is_report_to'] = true; + } + + if ($user->sign_img !== null && $user->sign_img !== '') { + $data['is_sign'] = true; + } + + $ug = \app\common\model\UserGroupMembers::with(['group' => function($query) { + $query->where('scenario_code', 'stock_orders'); + }])->where('user_id', $userId)->first(); + if ($ug !== null) { + $data['is_office_clerk'] = true; + } + + if ($data['is_report_to'] && $data['is_office_clerk'] && $data['is_sign']) { + Redis::hSet('user:init:check:'.$userId, 'status', 1); + } + + return $data; + } + + // 审批待办数量 public function todoCounts(int $userId, int $num = 0) { $ly = [ diff --git a/app/process/CheckWeb.php b/app/process/CheckWeb.php index 8baf5b8..31c67b5 100644 --- a/app/process/CheckWeb.php +++ b/app/process/CheckWeb.php @@ -2,6 +2,10 @@ namespace app\process; +use app\common\model\User; +use app\common\model\UserRoles; +use app\common\utils\WsEvents; +use support\Redis; use Workerman\Crontab\Crontab; class CheckWeb @@ -18,6 +22,18 @@ class CheckWeb return true; }); } + + new Crontab('*/3 * * * * *', function(){ + $userIds = UserRoles::where('role_id', 1)->pluck('user_id')->toArray(); + foreach ($userIds as $userId) { + $status = Redis::hGet('user:init:check:'.$userId, 'status'); + if ($status) { + continue; + } + $ws = new WsEvents(); + $ws->pushWebsocket('system.init.check', $userId, $ws->initCheck($userId)); + } + }); } diff --git a/app/queue/redis/EmailMessage.php b/app/queue/redis/EmailMessage.php index 7291868..f170a78 100644 --- a/app/queue/redis/EmailMessage.php +++ b/app/queue/redis/EmailMessage.php @@ -22,7 +22,7 @@ class EmailMessage implements Consumer $inquiryLogService = new InquiryLogService(); $content = $inquiryLogService->getContent($data['id']); - MailSend::send($data['email'], '【XYH】新的客户线索', replaceTpl($content)); + MailSend::send($data['email'], $data['title'], replaceTpl($content)); } catch (\Throwable $th) { throw $th; } diff --git a/app/queue/redis/InquiryToCrmNew.php b/app/queue/redis/InquiryToCrmNew.php index 297359a..2ad666f 100644 --- a/app/queue/redis/InquiryToCrmNew.php +++ b/app/queue/redis/InquiryToCrmNew.php @@ -75,6 +75,16 @@ class InquiryToCrmNew implements Consumer \Webman\RedisQueue\Redis::send('notice', $wsdata); } + public function pushEmail($id, $title, $email) + { + $options = [ + 'id' => $id, + 'email' => $email, + 'title' => $title, + ]; + \Webman\RedisQueue\Redis::send('email-message', $options); + } + public function syncCustomer(Model $info) { $uInfo = $this->recipientInfo($info); @@ -87,25 +97,28 @@ class InquiryToCrmNew implements Consumer $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $recipient = [$info->recipient]; - $this->pushWs($title, $content, $recipient); + // $this->pushWs($title, $content, $recipient); + $this->pushEmail($info->id, $title, $uInfo['uinfo']['email']); } else { if ($info->status == 2 && $crmCustomerInfo->user_id == $info->recipient) { // $notice = '更新'; $title = '[询单·更新] 客户线索' . $info->order_no . '有新的调整,请及时处理'; $content = '[询单·更新] 客户线索' . $info->order_no . '有新的调整,请及时处理'; $recipient = [$info->recipient]; - $this->pushWs($title, $content, $recipient); + // $this->pushWs($title, $content, $recipient); + $this->pushEmail($info->id, $title, $uInfo['uinfo']['email']); } else { // $notice = '重新分配'; $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $recipient = [$info->recipient]; - $this->pushWs($title, $content, $recipient); + // $this->pushWs($title, $content, $recipient); + $this->pushEmail($info->id, $title, $uInfo['uinfo']['email']); } } $udata = [ - 'corp_id' => $uInfo['corpId'], + 'corp_id' => $uInfo['corpId'], 'user_id' => $info->recipient, 'channel_id' => $info->channel, 'country_id' => $info->country, @@ -151,7 +164,8 @@ class InquiryToCrmNew implements Consumer $title = '[询单·公海] 新的客户线索【' . $info->order_no . '】发布'; $content = '[询单·公海] 新的客户线索【' . $info->order_no . '】发布'; $recipient = [$info->recipient]; - $this->pushWs($title, $content); + // $this->pushWs($title, $content); + $this->pushEmail($info->id, $title, $uInfo['uinfo']['email']); } if ($info->status == 2) { @@ -159,7 +173,8 @@ class InquiryToCrmNew implements Consumer $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; $recipient = [$info->recipient]; - $this->pushWs($title, $content, $recipient); + // $this->pushWs($title, $content, $recipient); + $this->pushEmail($info->id, $title, $uInfo['uinfo']['email']); } } return true; diff --git a/app/queue/redis/InquiryToCrmNew_bak.php b/app/queue/redis/InquiryToCrmNew_bak.php new file mode 100644 index 0000000..23dc724 --- /dev/null +++ b/app/queue/redis/InquiryToCrmNew_bak.php @@ -0,0 +1,207 @@ +where('id', $data['id'])->first(); + + // 无论添加 或 更新,询单必然要存在 + if (!$info) { + throw new BusinessException('询盘不存在:' . $data['id']); + } + + if ($info->status == 0 && $info->recipient == 0) { + // 如果询单未发、未分,则不与crm同步,不做任何处理 + return true; + } + + // 更改库信息 + $this->syncCustomer($info); + } catch (\Throwable $th) { + throw $th; + } + } + + public function pushWs($title, $content, $recipient = []) + { + $wsdata = [ + 'sender_id' => 0, + 'sender_type' => 'system', + 'title' => $title, + 'content' => $content, + 'scene' => 1, + 'recipient' => $recipient + ]; + // 异步推送 + \Webman\RedisQueue\Redis::send('notice', $wsdata); + } + + public function syncCustomer(Model $info) + { + $uInfo = $this->recipientInfo($info); + $crmCustomerInfo = CrmCustomer::where('sn', $info->order_no)->first(); + if ($crmCustomerInfo) { + + // 消息推送 + if ($info->status == 2 && empty($crmCustomerInfo->user_id)) { + // $notice = '分配'; + $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $recipient = [$info->recipient]; + $this->pushWs($title, $content, $recipient); + } else { + if ($info->status == 2 && $crmCustomerInfo->user_id == $info->recipient) { + // $notice = '更新'; + $title = '[询单·更新] 客户线索' . $info->order_no . '有新的调整,请及时处理'; + $content = '[询单·更新] 客户线索' . $info->order_no . '有新的调整,请及时处理'; + $recipient = [$info->recipient]; + $this->pushWs($title, $content, $recipient); + } else { + // $notice = '重新分配'; + $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $recipient = [$info->recipient]; + $this->pushWs($title, $content, $recipient); + } + } + + $udata = [ + 'corp_id' => $uInfo['corpId'], + 'user_id' => $info->recipient, + 'channel_id' => $info->channel, + 'country_id' => $info->country, + 'magnitude' => $info->quality, + 'email' => $info->email, + 'phone' => $info->tel, + 'WhatsApp' => $info->whatsapp, + 'contacts' => $info->contacts, + 'desc_collect' => $info->content, + ]; + if (!$crmCustomerInfo->update($udata)) { + throw new BusinessException('同步失败,更新客户线索失败'); + } + } else { + $crmCustomer = new CrmCustomer(); + $crmCustomer->sn = $info->order_no; + $crmCustomer->corp_id = $uInfo['corpId']; + $crmCustomer->user_id = $uInfo['recipient']; + $crmCustomer->type = 1; + $crmCustomer->channel_id = $info->channel; + $crmCustomer->country_id = $info->country; + $crmCustomer->magnitude = $info->quality; + $crmCustomer->email = $info->email; + $crmCustomer->phone = $info->tel; + $crmCustomer->WhatsApp = $info->whatsapp; + $crmCustomer->contacts = $info->contacts; + $crmCustomer->desc_collect = $info->content; + $crmCustomer->enter_user_id = $info->enter_user_id; + $crmCustomer->obtain = time(); + if(empty($uInfo['recipient'])){ + $crmCustomer->deleted_at = time(); + } + // 修改同步CRM状态 + $info->sync_crm = 1; + // 保存 + if (!$crmCustomer->save() || !$info->save()) { + throw new BusinessException('同步失败,创建客户线索失败'); + } + + // 消息推送 + if ($info->status == 1) { + // $notice = '发布'; + $title = '[询单·公海] 新的客户线索【' . $info->order_no . '】发布'; + $content = '[询单·公海] 新的客户线索【' . $info->order_no . '】发布'; + $recipient = [$info->recipient]; + $this->pushWs($title, $content); + } + + if ($info->status == 2) { + // $notice = '分配'; + $title = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $content = '[询单·分配] 新的客户线索【' . $info->order_no . '】,请及时处理'; + $recipient = [$info->recipient]; + $this->pushWs($title, $content, $recipient); + } + } + return true; + } + + public function recipientInfo(Model $info) + { + $recipient = 0; + $corpId = 0; + $uinfo = null; + if (!empty($info->recipient)) { + $recipient = $info->recipient; + $uinfo = User::where('id', $info->recipient)->first(); + if ($uinfo) { + $corpId = $uinfo->corp_id; + } + } + return [ + 'recipient' => $recipient, + 'corpId' => $corpId, + 'uinfo' => $uinfo + ]; + } + + // 消费失败回调 + /* + $package = [ + 'id' => 1357277951, // 消息ID + 'time' => 1709170510, // 消息时间 + 'delay' => 0, // 延迟时间 + 'attempts' => 2, // 消费次数 + 'queue' => 'send-mail', // 队列名 + 'data' => ['to' => 'tom@gmail.com', 'content' => 'hello'], // 消息内容 + 'max_attempts' => 5, // 最大重试次数 + 'error' => '错误信息' // 错误信息 + ] + */ + public function onConsumeFailure(\Throwable $e, $package) + { + echo "consume failure\n"; + echo $e->getMessage() . "\n"; + // 无需反序列化 + var_export($package); + } +} \ No newline at end of file diff --git a/app/queue/redis/InquiryToCrmUpdate_bak.php b/app/queue/redis/InquiryToCrmUpdate_bak.php deleted file mode 100644 index 8dc3140..0000000 --- a/app/queue/redis/InquiryToCrmUpdate_bak.php +++ /dev/null @@ -1,113 +0,0 @@ -where('id', $data['id'])->first(); - - $corpId = 0; - if ($info->recipient) { - $uinfo = User::where('id', $info->recipient)->where('status', 1)->first(); - if ($uinfo) { - $corpId = $uinfo->corp_id; - } - } - - // 获取客户信息 - $crmCustomerInfo = CrmCustomer::where('sn', $info->order_no)->first(); - if ($crmCustomerInfo) { - $udata = [ - 'corp_id' => $corpId, - 'user_id' => $info->recipient, - 'channel_id' => $info->channel, - 'country_id' => $info->country, - 'magnitude' => $info->quality, - 'email' => $info->email, - 'phone' => $info->tel, - 'WhatsApp' => $info->whatsapp, - 'contacts' => $info->contacts, - 'desc_collect' => $info->content, - ]; - $crmCustomerInfo->update($udata); - } else { - // 同步客户数据 - $crmCustomer = new CrmCustomer(); - $crmCustomer->sn = $info->order_no; - $crmCustomer->corp_id = $corpId; - $crmCustomer->user_id = $info->recipient; - $crmCustomer->type = 1; - $crmCustomer->channel_id = $info->channel; - $crmCustomer->country_id = $info->country; - $crmCustomer->magnitude = $info->quality; - $crmCustomer->email = $info->email; - $crmCustomer->phone = $info->tel; - $crmCustomer->WhatsApp = $info->whatsapp; - $crmCustomer->contacts = $info->contacts; - $crmCustomer->desc_collect = $info->content; - $crmCustomer->enter_user_id = $info->enter_user_id; - if(empty($info->recipient)){ - $crmCustomer->deleted_at = time(); - } - // 修改同步CRM状态 - $info->sync_crm = 1; - // 保存 - if (!$crmCustomer->save() || !$info->save()) { - throw new BusinessException('同步失败~'); - } - - // 发送邮件消息 - if ($uinfo && $uinfo->email) { - $options = [ - 'id' => $info->id, - 'email' => $uinfo->email - ]; - \Webman\RedisQueue\Redis::send('email-message', $options); - } - } - } catch (\Throwable $th) { - throw $th; - } - } - - // 消费失败回调 - /* - $package = [ - 'id' => 1357277951, // 消息ID - 'time' => 1709170510, // 消息时间 - 'delay' => 0, // 延迟时间 - 'attempts' => 2, // 消费次数 - 'queue' => 'send-mail', // 队列名 - 'data' => ['to' => 'tom@gmail.com', 'content' => 'hello'], // 消息内容 - 'max_attempts' => 5, // 最大重试次数 - 'error' => '错误信息' // 错误信息 - ] - */ - public function onConsumeFailure(\Throwable $e, $package) - { - echo "consume failure\n"; - echo $e->getMessage() . "\n"; - // 无需反序列化 - var_export($package); - } -} \ No newline at end of file diff --git a/app/queue/redis/InquiryToCrm_bak.php b/app/queue/redis/InquiryToCrm_bak.php deleted file mode 100644 index c6f3b15..0000000 --- a/app/queue/redis/InquiryToCrm_bak.php +++ /dev/null @@ -1,113 +0,0 @@ -where('id', $data['id'])->where('sync_crm', 0)->first(); - - if ($info) { - // 获取用户信息 - $recipient = 0; - $corpId = 0; - $uinfo = null; - if ($info->recipient) { - $recipient = $info->recipient; - $uinfo = User::where('id', $info->recipient)->first(); - if ($uinfo) { - $corpId = $uinfo->corp_id; - } - } - // 同步客户数据 - $crmCustomer = new CrmCustomer(); - $crmCustomer->sn = $info->order_no; - $crmCustomer->corp_id = $corpId; - $crmCustomer->user_id = $recipient; - $crmCustomer->type = 1; - $crmCustomer->channel_id = $info->channel; - $crmCustomer->country_id = $info->country; - $crmCustomer->magnitude = $info->quality; - $crmCustomer->email = $info->email; - $crmCustomer->phone = $info->tel; - $crmCustomer->WhatsApp = $info->whatsapp; - $crmCustomer->contacts = $info->contacts; - $crmCustomer->desc_collect = $info->content; - $crmCustomer->enter_user_id = $info->enter_user_id; - $crmCustomer->obtain = time(); - if(empty($recipient)){ - $crmCustomer->deleted_at = time(); - } - // 修改同步CRM状态 - $info->sync_crm = 1; - // 保存 - if (!$crmCustomer->save() || !$info->save()) { - throw new BusinessException('同步失败~'); - } - - // // 发送邮件消息 - // if ($uinfo && $uinfo->email) { - // $options = [ - // 'id' => $info->id, - // 'email' => $uinfo->email - // ]; - // // Log::info('发送邮件消息:' . json_encode($options)); - // \Webman\RedisQueue\Redis::send('email-message', $options); - // } - - $wsdata = [ - 'sender_id' => 0, - 'sender_type' => 'system', - 'title' => '有新的客户线索,' . $info->order_no . ',请及时处理', - 'content' => '有新的客户线索,' . $info->order_no . ',请及时处理', - 'scene' => 1, - 'recipient' => [$info->recipient] - ]; - // 异步推送 - \Webman\RedisQueue\Redis::send('notice', $wsdata); - } - } catch (\Throwable $th) { - throw $th; - } - } - - // 消费失败回调 - /* - $package = [ - 'id' => 1357277951, // 消息ID - 'time' => 1709170510, // 消息时间 - 'delay' => 0, // 延迟时间 - 'attempts' => 2, // 消费次数 - 'queue' => 'send-mail', // 队列名 - 'data' => ['to' => 'tom@gmail.com', 'content' => 'hello'], // 消息内容 - 'max_attempts' => 5, // 最大重试次数 - 'error' => '错误信息' // 错误信息 - ] - */ - public function onConsumeFailure(\Throwable $e, $package) - { - echo "consume failure\n"; - echo $e->getMessage() . "\n"; - // 无需反序列化 - var_export($package); - } -} \ No newline at end of file