<?php namespace app\admin\service\approval; use Illuminate\Support\Str; use Illuminate\Support\Collection; use support\spark\model\system\AdminOrg; use support\spark\model\system\AdminRole; use support\spark\model\system\ApprovalFlow; use support\spark\model\system\ApprovalFlowLine; use app\admin\service\approval\ApprovalFlowEngine; use support\spark\model\system\ApprovalFlowLineNode; /** * 审批æµæž„建类 * * å‡è®¾å·²ç»æœ‰äº†ç”³è¯·ç»„织ã€å®¡æ‰¹æµç¨‹å’Œè§’色对象 * $applicantOrg = AdminOrg::find(1); * $approvalFlow = ApprovalFlow::find(1); * $role1 = AdminRole::find(1); * $role2 = AdminRole::find(2); * 创建一个 ApprovalFlowBuilder 实例 * $builder = new ApprovalFlowBuilder($applicantOrg, $approvalFlow); * 设置审批æµç¨‹æ ‡é¢˜ã€æ‘˜è¦å’Œå†…容路径 * $builder->setTitle('采è´ç”³è¯·å®¡æ‰¹æµç¨‹'); * $builder->setSummary('用于审批采è´ç”³è¯·çš„æµç¨‹'); * $builder->setContentUrl('/approval/workflow/purchase'); * æ·»åŠ å®¡æ‰¹èŠ‚ç‚¹ï¼ˆå·²åºŸå¼ƒï¼‰ * $builder->addNode($role1); // 第一个审批节点 * $builder->addNode($role2); // 第二个审批节点 * 构建审批æµçº¿ * $approvalFlowLine = $builder->build(); */ class ApprovalFlowBuilder { /** * @var ApprovalFlow 审批æµç¨‹ */ private ApprovalFlow $approvalFlow; /** * @var AdminOrg 申请组织 */ private AdminOrg $applicationOrg; /** * @var string 审批æµçº¿æ ‡è¯†ç¬¦ */ private string $flowlineCode; /** * @var string æ ‡é¢˜ */ private string $title = ''; /** * @var string æ‘˜è¦ */ private string $summary = ''; /** * @var string 内容路径 */ private string $contentUrl = ''; /** * @var array 审批节点 */ private array $nodes = []; public function __construct(AdminOrg $applicantOrg, ApprovalFlow $approvalFlow) { $this->applicationOrg = $applicantOrg; $this->approvalFlow = $approvalFlow; $this->flowlineCode = static::createFlowLineCode($approvalFlow->flow_code); } /** * è®¾ç½®æ ‡é¢˜ * @param string $title */ public function setTitle(string $title) { $this->title = $title; } /** * è®¾ç½®æ‘˜è¦ * @param string $summary */ public function setSummary(string $summary) { $this->summary = $summary; } /** * 设置内容路径 * @param string $contentUrl */ public function setContentUrl(string $contentUrl) { $this->contentUrl = $contentUrl; } /** * 生æˆå®¡æ‰¹æµçº¿æ ‡è¯†ç¬¦ * * @param string $flowCode 审批æµæ ‡è¯†ç¬¦ * @return string */ private function createFlowLineCode(string $flowCode): string { $dateTime = date('YmdHis', time()); $randomLetters = Str::random(6); return "{$flowCode}_{$dateTime}{$randomLetters}"; } public function addNodeNew($path,$project_org_id,$company_org_id){ $user_ids = getOrgUser($path['roleid'],$path['category'],$project_org_id,$company_org_id); // 节点 $node = [ 'flow_line_node_role_id' => $path['roleid'], 'flow_line_node_user_ids' => implode(',',$user_ids) ]; // 如果nodes数组为空,设置开始时间 if (!$this->nodes) { $node['flow_line_node_start_time'] = now(); } // æ·»åŠ èŠ‚ç‚¹ $this->nodes[] = $node; } /** * æ·»åŠ ä¸€ä¸ªå®¡æ‰¹èŠ‚ç‚¹ * * @param AdminRole $roleId 角色ID */ public function addNode(AdminRole $role) { // 节点 $node = [ 'flow_line_node_role_id' => $role->id, 'flow_line_node_user_ids' => implode(',', $role->users()->pluck('id')->toArray()) ]; // 如果nodes数组为空,设置开始时间 if (!$this->nodes) { $node['flow_line_node_start_time'] = now(); } // æ·»åŠ èŠ‚ç‚¹ $this->nodes[] = $node; } /** * 构建审批æµçº¿ */ public function build(): ApprovalFlowLine { /** @var ApprovalFlowLine $line */ $line = $this->approvalFlow->lines()->create([ 'project_org_id' => $this->applicationOrg->id, 'company_org_id' => $this->applicationOrg->pid, 'flow_line_code' => $this->flowlineCode, 'flow_line_title' => $this->title, 'flow_line_summary' => $this->summary, 'flow_line_content_url' => $this->contentUrl, 'flow_line_creator_id' => admin_id(), ]); // // å¦‚æžœæ²¡æœ‰æ‰‹åŠ¨æ·»åŠ èŠ‚ç‚¹ åˆ™è‡ªåŠ¨ç”Ÿæˆ // if (!$this->nodes) { // // 从 flow_path ä¸æå– roleid 列作为需è¦æŸ¥è¯¢çš„ id 数组 // $roleIds = array_column($this->approvalFlow->flow_path, 'roleid'); // /** @var Collection|AdminRole[] $roles */ // $roles = AdminRole::findMany($roleIds); // foreach ($roles as $role) { // $this->addNode($role); // } // } $line->nodes()->createMany($this->nodes); if($this->approvalFlow->flow_dingtalk_status == 1) { $approvalFlowLineNode = new ApprovalFlowLineNode(); $node = $approvalFlowLineNode->where('approval_flow_line_id',$line->id)->first(); (new ApprovalFlowEngine($line))->notifyDingTalk($node); } return $line; } }