dicibi/orgs

用于管理企业结构的数据库和基本模型。

dev-main 2024-05-11 19:51 UTC

This package is auto-updated.

Last update: 2024-09-12 05:33:39 UTC


README

Test codecov

组织结构。

此包遵循企业结构标准。它不包含默认的结构或名称,您自行定义。此包仅提供组织、管理和与工作结构相关的业务流程的功能。

主要组件

orgs 包包含 3 个主要组织组件。

  1. 结构
  2. 职位名称
  3. 办公室

每个组件都有嵌套集实现。

使用方法

通过 composer 安装。

composer require dicibi/orgs

通过 app('orgs') 使用。

app('orgs')->structures(); // Dicibi\Orgs\Resolvers\StructureResolver
app('orgs')->offices(); // Dicibi\Orgs\Resolvers\OfficeResolver
app('orgs')->jobTitles(); // Dicibi\Orgs\Resolvers\JobTitleResolver

或者通过服务绑定使用 orgs

use Dicibi\Orgs\Organizer;

function (Organizer $organizer) {
    $organizer->structures(); // Dicibi\Orgs\Resolvers\StructureResolver
    $organizer->offices(); // Dicibi\Orgs\Resolvers\OfficeResolver
    $organizer->jobTitles(); // Dicibi\Orgs\Resolvers\JobTitleResolver
}

定义就业将附加的位置。通常将其附加到 users

class User extends Model {
    
    use HasEmployment; // add ability to this model have Job Position (historical)
    
}

用例 - 一个简单的开放职位

分配用户到职位。

// by inherit this trait
use Dicibi\Orgs\Concerns\HasEmployment;

// it's as simple as to call `assignPosition(position)` to assign a Position
auth()->user()->assignPosition($position);

// to get historically employed/assigned positions, call employments().
// @return QueryBuilder<Dicibi\Orgs\Models\Pivot\Position>
auth()->user()->employments();

// to get current/active position (latest).
// @return Dicibi\Orgs\Models\Pivot\Position
auth()->user()->activePosition();

如何通过办公室和职位名称打开新的职位(Job Position)。

// create an Office
$newOffice = $organizer->offices()->create('Jakarta Central Office');

// create a Job title
$newTitle = $organizer->titles()->create('Vice President');

// create a position by office
$newPosition = $newOffice->openPositionFor($newTitle, quota: 1);

// or create a position by title (quota is optional)
$newPosition = $newTitle->openPositionIn($newOffice, quota: 1);

// for addition, you might get available/unavailable positions information via Office (TBA)
$newOffice->availablePositions();
$newOffice->unavailablePositions();
$newOffice->positions(); // all positions

// for addition, you might get information about Offices that open for specific Job Title
$customerServiceTitle->availableOffices();
$customerServiceTitle->offices(); // all offices

用例 - 管理办公室之间的层次结构

管理中央办公室和分支机构之间的层次结构。

// manage via offices resolver
/** @var \Dicibi\Orgs\Resolvers\OfficeResolver $resolver */
$resolver->attach(child: $surabayaBranch, parent: $jakartaCentralOffice);
$resolver->attach(child: $bandungBranch, parent: $jakartaCentralOffice);
$resolver->attach(child: $lampungBranch, parent: $jakartaCentralOffice);
$resolver->tree($jakartaCentralOffice); // get tree

// or manage directly via NodeTrait (kalnoy/nestedset)
/** @var \Dicibi\Orgs\Models\Office|NodeTrait $jakartaCentralOffice */
$jakartaCentralOffice->appendNode($surabayaBranch);
$jakartaCentralOffice->appendNode($bandungBranch);
$jakartaCentralOffice->appendNode($lampungBranch);
$jakartaCentralOffice->tree();

用例 - 管理职位名称之间的层次结构

管理职位名称之间的层次结构。

// manage via titles resolver
/** @var \Dicibi\Orgs\Resolvers\JobTitleResolver $resolver */
$resolver->attach(child: $presidentDirector, parent: $presidentCommissioner);
$resolver->attach(child: $financeDirector, parent: $presidentDirector);
$resolver->attach(child: $operationsDirector, parent: $presidentDirector);
$resolver->tree($presidentCommissioner);

// or manage directly via NodeTrait (kalnoy/nestedset)
/** @var \Dicibi\Orgs\Models\Pivot\Position|NodeTrait $presidentCommissioner */
$presidentCommissioner->appendNode($presidentDirector);
$presidentDirector->appendNode($financeDirector);
$presidentDirector->appendNode($operationsDirector);
$presidentCommissioner->tree();

用例 - 使用结构模板建立层次结构

我们可以在每个办公室中管理组织结构,而不是管理'结构模板',该模板可以分配给办公室。当我们有1个中央办公室和30个分支机构时,我们不想每次都定义每个办公室的31个结构。

通过使用'结构'模板,我们可以处理这种情况。假设在31个办公室中,有称为:中央办公室、分支机构、地点的办公室结构。

/** @var \Dicibi\Orgs\Resolvers\StructureResolver $structure */
$structure->create('ID Central');
$structure->create('Branch');
$structure->create('Site');

/** @var \Dicibi\Orgs\Resolvers\JobTitleResolver $title */
$title->create('Head', structure: 'ID Central');
  $title->create('Vice-Head', structure: 'ID Central', attachTo: 'Head');
  $title->create('Division Head', structure: 'ID Central', attachTo: 'Head');
    $title->create('Group Head', structure: 'ID Central', attachTo: 'Division Head');

/** @var \Dicibi\Orgs\Resolvers\OfficeResolver $office */
$office->create('Jakarta Central Office', structure: 'ID Central');
$office->create('Aceh Branch Office', structure: 'Branch');
$office->create('Jakarta Branch Office', structure: 'Branch');
$office->create('Surabaya Site', structure: 'Site');

在每种结构中,我们可以定义独特的职位名称结构。在中央结构中,我们可能定义总监、部门主管、组长等。但在分支机构,将没有总监、部门或小组,而是包含分支机构主管、副分支机构主管、部门主管、经理等。

仍然可以设置跨结构层次结构,例如,如果我们有分支机构结构和中央结构,则可能 分支机构主管运营部门主管 的下级。