节点 */ protected Collection $nodes; /** * @param ApprovalFlowLine $approvalFlowLine */ public function __construct(ApprovalFlowLine $approvalFlowLine) { $this->requester = new GuzzleHttpRequester(); $this->approvalFlowLine = $approvalFlowLine; $this->nodes = $approvalFlowLine->nodes; } /** * 审批当前节点 * * @param AdminUser $user 审批人 * @param bool $isAgreed 是否通过 * @param string $remark 备注 * @return void */ public function approve(AdminUser $user, bool $isAgreed, string $remark): void { $activedNode = $this->getActivedNode(); if (!$activedNode) { $this->endApproval(true); } else { // 设置审批状态和完成时间 $now = now(); $activedNode->update([ 'flow_line_node_actual_role_id' => $user->role_id, 'flow_line_node_actual_user_id' => $user->id, 'flow_line_node_status' => $isAgreed ? 1 : 2, 'flow_line_node_remark' => $remark, 'flow_line_node_end_time' => $now, 'update_time' => $now, ]); // 调用回调函数,执行审批完成后的操作 if ($isAgreed) { $this->onApprovalNodeResolved($activedNode, $user); // 此时这个节点已经审批完成,下一个节点自动激活,设置下一个节点的开始时间 $nextNode = $this->getActivedNode(); if ($nextNode) { $approval_flow = ApprovalFlow::where('id', $this->approvalFlowLine->approval_flow_id)->first()->toArray(); if ($approval_flow['is_auto_approval'] == 1) { $this->notifyDingTalk($nextNode); } $nextNode->update([ 'flow_line_node_start_time' => $now, 'update_time' => $now, ]); } else { $this->endApproval(true); } } else { $this->endApproval(false); } } } /** * 获取激活节点(唯一) * * @return ApprovalFlowLineNode|null */ protected function getActivedNode(): ?ApprovalFlowLineNode { return $this->nodes->whereNull('flow_line_node_end_time')->first(); } /** * 审批节点通过后执行的回调函数 * * @param ApprovalFlowLineNode $node * @param AdminUser $user * @return void */ protected function onApprovalNodeResolved(ApprovalFlowLineNode $node, AdminUser $user): void { // 在这里添加你想要在审批通过后执行的操作 // 例如,你可以在这里发送通知邮件或者更新数据等操作 $approval_flow = ApprovalFlow::where('id', $this->approvalFlowLine->approval_flow_id)->first()->toArray(); //如果开启了钉钉推送相关 if ($approval_flow['flow_dingtalk_status'] == 1) { //更新钉钉状态为已完成 $uids_ary = explode(',', $node->flow_line_node_user_ids); $unionIds = []; $adminUser = new AdminUser(); $dingTalkController = new DingTalkController(); foreach ($uids_ary as $v) { $adminInfo = AdminUser::find($v); if (!$adminInfo) { continue; } if (!$adminInfo->unionId) { continue; } $unionIds[] = $adminInfo->unionId; } if (count($unionIds) > 0) { $talk_info = DingTalk::putTask($unionIds, $node->talkId); } } } /** * 钉钉通知 * * @param ApprovalFlowLineNode $node * @return void */ public function notifyDingTalk(ApprovalFlowLineNode $node) { $uids_ary = explode(',', $node->flow_line_node_user_ids); $unionIds = []; $adminUser = new AdminUser(); foreach ($uids_ary as $v) { $adminInfo = AdminUser::find($v); if (!$adminInfo) { continue; } if ($adminInfo->unionId) { $unionIds[] = $adminInfo->unionId; } elseif (!$adminInfo->unionId && $adminInfo->mobile) { $res = DingTalk::getUserInfo($adminInfo->mobile); if (!$res) { continue; } $unionIds[] = $res; $adminUser->updateById(['unionId' => $res], $adminInfo->id); } } if (count($unionIds) > 0) { $talk_info = DingTalk::createTaskDo($unionIds, $this->approvalFlowLine->flow_line_title, $this->approvalFlowLine->open_url, $node->id); $node->update(['talkId' => $talk_info['id']]); } } /** * 审批节点被拒绝后执行的回调函数 * * @param ApprovalFlowLineNode $node * @param AdminUser $user * @return void */ protected function onApprovalNodeRejected(ApprovalFlowLineNode $node, AdminUser $user): void { // 在这里添加你想要在审批被拒绝后执行的操作 // 例如,你可以在这里发送通知邮件或者更新数据等操作 } /** * 终止审批流程 * * @param bool $isAgreed * @return void */ protected function endApproval(bool $isAgreed) { // 更新审批流线状态 $this->approvalFlowLine->update([ 'flow_line_status' => $isAgreed ? 1 : 2, 'update_time' => now(), ]); // 在这里添加你想要在审批流程结束时执行的操作 // 回调 if ($this->approvalFlowLine->flow_line_callback_url) { $this->requester->post($this->approvalFlowLine->flow_line_callback_url, [ 'approval_flow_line_id' => $this->approvalFlowLine->id, 'status' => $isAgreed ? 'COMPLETE' : 'FAILED', 'message' => $isAgreed ? '流程已完成' : '流程已关闭' ]); } } }