skynet/moysklad-module
Composer 安装命令:
composer require skynet/moysklad-module
包简介
Cloned from: https://github.com/Tooyz/moysklad
README 文档
README
Библиотека для сервиса "Мой склад" JSON API 1.1. Некоторые примеры можно найти в "tests". Все ещё далека от завершения.
Установка
composer require tooyz/moysklad
Запуск тестов:
1) composer global require phpunit/phpunit<br />
2) cd tests<br />
3) composer update<br />
4) Отредактировать Config.php <br />
5) phpunit --configuration="./phpunit.xml" <ИЛИ> npm run test
Класс MoySklad
Используется для авторизации, явно передается параметром в большинство компонентов т.к. возможно использование нескольких аккаунтов моегосклада одновременно.
$sklad = MoySklad::getInstance($login, $password);
Сущности
Основной объект библиотеки
$product = new Product($sklad, [
"name" => "Банан"
]);
Можно, например, сделать так
$product = new Product($sklad, [
"id" => "12345-654321-123456-54321",
"name" => "Банан"
]);
$product->fresh(Expand::create(['country']));
Или так
$product->transformToClass(Counterparty::class);
Или не сделать. Большая часть логики делегирована другим классам.
Получение сущностей
Получение всех сущностей:
$list = Product::query($sklad)->getList();
Можно добавить параметры запроса. Описание параметров в описании класса QuerySpecs.
$list = Product::query($sklad, QuerySpecs::create([
"offset" => 15,
"maxResults" => 50,
]))->getList();
Фильтрация. Описание методов FilterQuery в комментариях.
$filteredList = Product::query($sklad)->filter(
(new FilterQuery())
->eq("article", 12345)
);
Поиск по строке. К Query-объекту можно прицепить expand для получения связей с указанными названиями
$searchedList = Product::query($sklad)->withExpand(Expand::create(['owner']))->search("трусы");
Функции выше возвращают объект EntityList.
Получение по id.
$product = Product::query($sklad)->byId("12345-654321-123456-54321");
Создание, обновление
$counterparty = (new Counterparty($sklad, [
"name" => "Васян"
]))->create();
Некоторым сущностям нужно указать связи при создании. Например для customerorder нужно указание counterparty и organization, и опционально массив позиций
$order = (new CustomerOrder($this->sklad))->buildCreation()
->addCounterparty($counterparty)
->addOrganization($organization)
->addPositionList($positions)
->execute();
Для обновления то-же самое
$product->buildUpdate()->addCountry($country)->execute();
Удаление
$product->delete();
Связи
Чаще всего сущность полученная через api имеет какие-то связи
$product->relations;
Зная что, к примеру, у продукта есть связанный employee, но не зная название этого поля можно получить его так
$employee = $product->relations->find(Employee::class)
Так как связи обычно приходят в формате meta-объекта для получения полного объекта можно сделать так
$group = $product->relations->group->fresh()
А если связь - массив объектов типо такого, то на нем можно сделать операции описанные в разделе "Получение сущностей"
$products = $order->relationListQuery("positions")->getList()
Список сущностей
EntityList - обертка для массива для работы с апи
Например получение assortment и превращение элементов в нужный тип
$differentProductsAndStuff = Assortment::query($sklad)->getList()->transformItemsToMetaClass();
Или массовое создание сущностей
$neko = new Product($sklad, ["name" => "Кот"]);
$doge = new Product($sklad, ["name" => "Пёс"]);
$el = new EntityList($sklad, [$neko, $doge])->each(function($e) use($vasyan){
$e->buildCreation()->addEmployee($vasyan);
})->massCreate();
Можно превратить в массив
$el->toArray();
Работа с картинками
Прицепление изображений к сущности
$product->attachImage(ImageField::createFromUrl(
"http://url.ru/img.jpg"
));
или
$product->attachImage(ImageField::createFromPath(
"images/123.jpg",
"renamed_image.jpg"
));
Скачивание изображения
$product->image->download('/usr/images/cat.jpg', 'normal');
/* normal, miniature, tiny - размеры изображений */
Specs
Классы для конфигурации различных действий
<SpecsClass>::create(["field"=>"value"]);
В метод create передаются поля конфигурации
LinkingSpecs используется для описания связывания сущности и других сущностей учавствующих в обновлении/создании первой
Имеет следующие поля:
name - имя, которое получит новая связь. Если не указано - будет использоваться имя сущности в моемскладе
multiple - связь будет массивом сущностей, то есть можно указать несколько связей с одинаковым именем
fields - взять только указанные поля для создания связи
excludedFields - взять все поля, кроме указанных
Пример добавления доп. поля к контрагенту
$specs = LinkingSpecs::create([
"name" => "attributes", //в апи доп поля хранятся в поле attributes
"multiple" => true //и являются массивом
]);
$counterparty = $counterparty->buildUpdate()
->addAttribute($attribute, $specs)
->addAttribute($attribute2, $specs)
->execute();
QuerySpecs конфигурация EntityQuery и RelationQuery объектов
Поля:
limit - количество результатов в одном отправляемом запросе (100 по умолчанию)
offset - сдвиг результатов
maxResults - максимальное возвращаемое количество результатов
expand - возможность получить результат с указанными связями (Expand объект)
updatedFrom - объекты, момент обновления которых меньше или равен значению, указанному в параметре (CommonDate объект)
updatedTo - объекты, момент обновления которых меньше или равен значению, указанному в параметре (CommonDate объект)
updatedBy - В выборку попадут все объекты, автором последних изменений которых является пользователь с uid, указанным в значении параметра.
Product::query($sklad, QuerySpecs::create([
'maxResults' => 25,
'expand' => Expand::create([Employee::$entityName]),
'updatedFrom' => new CommonDate("2017-01-01"),
'updatedBy' => "admin@admin"
]))->getList();
Публикации
Документные сущности поддерживают публикации
Получение
$publications = $customerOrder->getPublications(QuerySpecs::create())
Создание
$publication = $customerOrder->createPublication($customTemplate)
Удаление
$customerOrder->deletePublication($publication)
Получение публикации по id
$publication = $customerOrder->getPublicationById("123-456")
Печать документов
Документные сущности поддерживают печать
Создание
При создании запроса на печать можно передать либо AbstractTemplate либо EntityList<AbstractTemplate>
$export = $demand->createExport($templateEntity, 'xls');
$exports = $demand->createExport($templateList);
Получение стандартных шаблонов
$templates = $demand->getExportEmbeddedTemplates();
Получение пользовательских шаблонов
$templates = $demand->getExportCustomTemplates();
Получение стандартного шаблона по id
$templates = $demand->getExportEmbeddedTemplateById(123);
Получение пользовательского шаблона по id
$templates = $demand->getExportCustomTemplateById(123);
Отчеты
Содержат статические методы для получения отчетов.
$report = DashboardReport::day($sklad);
Некоторым можно указать особые поисковые запросы типо CounterpartyReportQuerySpecs
$report = SalesReport::byEmployee($sklad, SalesReportQuerySpecs::create([
"counterparty.id" => $cpId
]));
Аудит
История событий системы
Получить последние 5 контекстов по заказам покупателей
$audits = Audit::query($this->sklad, QuerySpecs::create([
'maxResults' => 5
]))->filter((new FilterQuery())
->eq("entityType", "customerorder")
);
Получить события по контексту
$events = $audit->getAuditEvents();
Получить события по сущности
$events = $customerOrder->getAuditEvents();
Получить список фильтров
$filters = Audit::getFilters($this->sklad);
Отладка
Статический класс RequestLog содержит ограниченную историю запросов/ответов в апи.
Можно получить последний запрос/ответ
RequestLog::getLast()
Или все
RequestLog::getList()
По умолчанию для ограничения потребления памяти хранится 50 последних запросов, по достижению лимита старые запросы удаляются. Изменить лимит можно так:
RequestLog::setStorageSize(500); // 500 запросов
RequestLog::setStorageSize(0); //Без лимита
Для остановки логирования можно вызвать
RequestLog::setEnabled(false);
Другие библиотеки
- Ruby https://github.com/dapi/moysklad
- JavaScript/nodejs https://github.com/wmakeev/moysklad-client
skynet/moysklad-module 适用场景与选型建议
skynet/moysklad-module 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 74 次下载、GitHub Stars 达 0, 最近一次更新时间为 2020 年 12 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 skynet/moysklad-module 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 skynet/moysklad-module 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 skynet/moysklad-module 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
This module allows drag & drop grouping of items in a GridField
Adds text size controls and text-to-speech controls to Flarum discussion content.
Native Blade date, datetime, and date range pickers.
Symfony and Flysystem integration for the maintained KCFinder continuation.
Laravel integration for the maintained KCFinder continuation.
PHPStan rules shared across KnpLabs organization projects
统计信息
- 总下载量: 74
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 4
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2020-12-08
