dnj / laravel-ticketing
用于票务系统的包。
dev-master
2023-01-27 14:47 UTC
Requires
- php: ^8.1
Requires (Dev)
- dnj/laravel-user-logger: dev-master
- dnj/local-filesystem: ^1.0
- dnj/tmp-filesystem: ^1.1
- friendsofphp/php-cs-fixer: ^3.1
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-15 15:31:03 UTC
README
介绍
此包将帮助您管理票据并支持您的客户。
- 功能包括
- 部门管理
- 票据管理
- 票据消息管理
- 票据附件管理
- PHP、PHPUnit和PHPCsFixer的最新版本
- 应用最佳实践
安装
使用Composer要求此包。
composer require dnj/laravel-ticketing
Laravel使用包自动发现,因此不需要您手动添加ServiceProvider。
使用发布命令将包配置复制到您的本地配置
php artisan vendor:publish --provider="dnj\Ticket\TicketServiceProvider"
配置文件
use dnj\Filesystem\Local\Directory; return [ // If set True we will migrate and validate title field for ticket. 'title' => true, // Define your user model class for connect tickets to users. | example: App\User:class 'user_model' => null, /** * By default, the dnj/local-filesystem package is used to store files. * According to the Directory class, you can specify the main path for storing file */ 'attachment_root' => new Directory(public_path('ticket')), /** * Specifies the number of folders to create for storage based on the file hash * If the hash of your file is 8c7dd922ad47494fc02c388e12c00eac and dir_layer_number is 2, * the file is saved with this structure : [path]/8c/7d/8c7dd922ad47494fc02c388e12c00eac.jpg */ 'dir_layer_number' => 2, /** * You can set the validations you want to store files from here. */ 'attachment_rules' => [ 'mimes:jpg,png,txt', 'mimetypes:text/plain,image/jpeg,image/png', 'max:1024', ] ];
ℹ️ 注意
默认情况下,用户活动日志被禁用,如果您想保存它们,请将
$userActivityLog
设置为true。
示例
use dnj\Ticket\Contracts\IDepartmentManager; $departmentManager = app(IDepartmentManager::class); $department = $departmentManager->store( title:'Sell Department', userActivityLog: true ); // returns an Department model which implementes IDepartment
与部门协同工作
搜索部门
use dnj\Ticket\Contracts\IDepartmentManager; use dnj\Ticket\Contracts\IDepartment; $departmentManager = app(IDepartmentManager::class); /** * @param array{title?:string,created_start_date?:string,created_end_date?:string,updated_start_date?:string,updated_end_date?:string}|null $filters * @var iterable<IDepartment> $departments */ $departments = $departmentManager->search( filters:['title' => 'sales'] );
创建新部门
use dnj\Ticket\Contracts\IDepartmentManager; $departmentManager = app(IDepartmentManager::class); /** * @param string $title * @param bool $userActivityLog = false * @return IDepartment */ $department = $departmentManager->store(title:'Sell Department');
显示部门
use dnj\Ticket\Contracts\IDepartmentManager; $departmentManager = app(IDepartmentManager::class); /** * @param int $id * @return IDepartment */ $department = $departmentManager->find(id:1);
更新部门
use dnj\Ticket\Contracts\IDepartmentManager; $departmentManager = app(IDepartmentManager::class); /** * @param int $id * @param array{title?:string} $changes * @param bool $userActivityLog = false * @return IDepartment */ $department = $departmentManager->update( id:1, changes: ['title' => 'Support'] );
删除部门
use dnj\Ticket\Contracts\IDepartmentManager; $departmentManager = app(IDepartmentManager::class); /** * @param int $id * @param bool $userActivityLog = false * @return void */ $departmentManager->destroy( id:1, userActivityLog: false, // Prevent saving a log for authenticated user );
与票据协同工作
搜索票据
use dnj\Ticket\Contracts\ITicketManager; use dnj\Ticket\Contracts\ITicket; use dnj\Ticket\Enums\TicketStatus; $ticketManager = app(ITicketManager::class); /** * @param array{title?:string,client_id?:int,department_id?:int,status?:TicketStatus[],created_start_date?:DateTimeInterface,created_end_date?:DateTimeInterface,updated_start_date?:DateTimeInterface,updated_end_date?:DateTimeInterface}|null $filters * @param bool $userActivityLog = false * @return iterable<ITicket> */ $tickets = $ticketManager->search( filters: [ 'client_id' => 1, 'status' => [TicketStatus::UNREAD, TicketStatus::IN_PROGRESS], ] );
创建新票据
use dnj\Ticket\Managers\TicketManager; $ticketManager = app(ITicketManager::class); /** * @param int $clientId * @param int $departmentId * @param string $message * @param array<int|UploadedFile> $files * @param string|null $title = null * @param int|null $userId = null * @param dnj\Ticket\Enums\TicketStatus|null $status = null * @param bool $userActivityLog = false * @throws ITicketTitleHasBeenDisabledException if $title is set but title is disabled * @return IMessage */ $message = $ticketManager->store( clientId: 1, departmentId: 1, message:'First message for ticket', files:[], title:'Ticket subject', userId: auth()->user()->id, status: null );
显示票据
use dnj\Ticket\Managers\TicketManager; $ticketManager = app(ITicketManager::class); /** * @param int id * @return ITicket */ $ticket = $ticket->find(id:1);
更新票据
use dnj\Ticket\Managers\TicketManager; $ticketManager = app(ITicketManager::class); /** * @param int $id * @param array{title?:string,client_id?:int,department_id?:int,status?:TicketStatus} $changes * @param bool $userActivityLog = false * @return ITicket */ $ticket = $ticket->update( id: 1, changes: ['client_id' => 3], userActivityLog: true );
删除票据
use dnj\Ticket\Managers\TicketManager; $ticketManager = app(ITicketManager::class); /** * @param int $id * @param bool $userActivityLog = false * @return void */ $ticket->destroy(id:1);
与票据消息协同工作
搜索票据消息
use dnj\Ticket\Contracts\IMessageManager; use dnj\Ticket\Contracts\IMessage; $messageManager = app(IMessageManager::class); /** * @param int $ticketId * @param array{user_id?:int,sort?:string,created_start_date?:DateTimeInterface,created_end_date?:DateTimeInterface,updated_start_date?:DateTimeInterface,updated_end_date?:DateTimeInterface}|null $filters * @return iterable<IMessage> */ $ticketMessages = $messageManager->search( ticketId:5, filters:[ 'user_id' => 1, ] );
创建新票据消息
use dnj\Ticket\Contracts\IMessageManager; use dnj\Ticket\Contracts\IMessage; use dnj\Ticket\Enums\TicketStatus; $messageManager = app(IMessageManager::class); /** * @param int $ticketId * @param string $message * @param array<int|UploadedFile> $files * @param int|null $userId = null * @param bool $userActivityLog = false * @return IMessage */ $ticketMessage = $messageManager->store( ticketId: 1, message: 'Second message for ticket', files: [113], userId: auth()->user()->id );
显示票据消息
use dnj\Ticket\Contracts\IMessageManager; use dnj\Ticket\Contracts\IMessage; $messageManager = app(IMessageManager::class); /** * @param int id * @return IMessage */ $ticketMessage = $messageManager->find(id:4);
更新票据消息
use dnj\Ticket\Contracts\IMessageManager; use dnj\Ticket\Contracts\IMessage; $messageManager = app(IMessageManager::class); /** * @param int $id * @param array{message?:string,userId?:int} $changes * @param bool $userActivityLog = false * @return IMessage */ $ticketMessage = $messageManager->update( id:1, changes: ['message'=>'Ticket message has updated'] );
删除票据消息
use dnj\Ticket\Contracts\IMessageManager; $messageManager = app(IMessageManager::class); /** * @param int $id * @param bool $userActivityLog = false * @return void */ $messageManager->destroy(id:1);
票据附件基本用法
搜索票据附件
use dnj\Ticket\Contracts\IAttachmentManager; use dnj\Ticket\Contracts\IAttachment; $attachmentManager = app(IAttachmentManager::class); /** * @param int $messageId * @return iterable<IAttachment> */ $ticketAttachment = $attachmentManager->search(messageId:5);
创建新票据附件
use dnj\Ticket\Contracts\IAttachmentManager; use dnj\Ticket\Contracts\IAttachment; use Illuminate\Http\UploadedFile; $attachmentManager = app(IAttachmentManager::class); /** * @param UploadedFile $file * @param int $messageId * @param bool $userActivityLog = false * @return IAttachment */ $attachment = $attachmentManager->storeByUpload( file: UploadedFile::fake()->image('avatar.jpg'), messageId: 2, );
使用ID显示附件模型
use dnj\Ticket\Contracts\IAttachmentManager; use dnj\Ticket\Contracts\IAttachment; $attachmentManager = app(IAttachmentManager::class); /** * @param int $id * @return IAttachment */ $attachment = $attachmentManager->find(id:4);
查找孤儿附件
此方法可以帮助您找到未附加到消息的游离文件
use dnj\Ticket\Contracts\IAttachmentManager; use dnj\Ticket\Contracts\IAttachment; $attachmentManager = app(IAttachmentManager::class); /** * @param int id * @return iterable<IAttachment> */ $orphans = $attachmentManager->findOrphans();
更新附件
use dnj\Ticket\Contracts\IAttachment; use dnj\Ticket\Contracts\IAttachmentManager; $attachmentManager = app(IAttachmentManager::class); /** * @param int $id * @param array{message_id?:int} $changes * @param bool $userActivityLog = false * @throws dnj\Ticket\Contracts\Exceptions\IAttachmentAlreadyAsignedException if you double assign a attachment * @return IAttachment */ $attachment = $attachmentManager->update( id:1, changes: [message_id => 5] );
删除票据附件
use dnj\Ticket\Contracts\IAttachmentManager; $attachmentManager = app(IAttachmentManager::class); /** * @param int $id * @param bool $userActivityLog = false * @return void */ $attachmentManager->destroy(id:1);
如何使用Restful API
已准备好YAML格式的文档,以便更好地熟悉和使用包的Web服务,它位于docs
文件夹中。
要使用此文件,您可以在stoplight.io网站上导入它并查看所有可用的Web服务。
贡献
贡献使开源社区成为一个如此令人惊叹的学习、灵感和创造的地方。您所做的任何贡献都将受到高度赞赏。
如果您有改进此项目的建议,请fork仓库并创建一个pull request。您也可以简单地通过带有“增强”标签的问题来提交问题。别忘了给项目加星!再次感谢!
- 分支项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开Pull Request
安全
如果您发现任何安全相关的问题,请通过电子邮件security@dnj.co.ir联系,而不是使用问题跟踪器。
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅许可文件。