Обслуживание юридических лиц в ABilling 7: устройство кода
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance
Поведение процессов в общем случае
1) Вручную создается родительский процесс обслуживания ЮЛ на единый договор;
2) Из родительского процесса автоматически создаются дочерние процессы на услуги в рамках единого договора (статус "Проверен");
3) Запускается обработка дочерних процессов (статус "В обработке");
4) При отмене родительского процесса (статус "Отмена") все дочерние ставятся в аналогичный статус;
5) При успешной обработке всех дочерних процессов родительский процесс успешно завершается (статус "Закрыт");
6) При ошибке обработки одного из дочерних процессов родительский процесс ставится в статус "Ошибка обработки в биллинге".
Структура кода
Обработчик событий процесса обслуживания ЮЛ на договор
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.listener.contract
Наследуется от абстрактного класса BaseContractMaintenance, в котором реализованы вызовы создания и обработки дочерних процессов, а также установка статуса "Отмена" в дочерних процессах при отмене операции.
Класс лисенера нужно пометить аннотацией @EventDispatcher и определить событие, при котором будет вызван метод создания дочерних процессов для обработки субдоговоров createLinkedProcesses().
В лисенере создаваемого типа процесса необходимо переопределить необходимые методы, в частности связанные с созданием, получением и обработкой дочерних процессов на услуги.
Также в объявлении класса лисенера определяются типы интеракторов для процесса обслуживания договора и процесса обслуживания услуги.
public class ContractRelocationListener
extends BaseContractMaintenance<ContractRelocationProcess, ServiceRelocationProcess> {
}
Обработчик событий процесса обслуживания ЮЛ на услугу
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.listener.service
Наследуется от абстрактного класса BaseServiceMaintenance, в котором реализована установка статуса родительского процесса в Закрыт/Ошибка обработки в биллинге и проверки некоторых параметров.
Класс BaseServiceMaintenance наследуется от ProcessAnnotatedEventListener, что позволяет подписываться на события через аннотации. По этой же причине необходимо переопределить метод getProcessType() для получения класса интерактора, наследующегося от родительского интерактора процессов обслуживания субдоговоров, для данного типа процесса.
В лисенере создаваемого типа процесса необходимо переопределить получение родительского процесса и получение интерактора.
Также в объявлении класса лисенера определяются типы интеракторов для процесса обслуживания договора и процесса обслуживания услуги.
public class ServiceRelocationListener
extends BaseServiceMaintenance<ServiceRelocationProcess, ContractRelocationProcess> {
}
Модель данных для обработки в биллинге
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.model
Наследуется от класса ProcessParameters.
Должен содержать данные, необходимые для обработки услуг.
Интерактор процесса обслуживания ЮЛ на договор
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.process.contract
Наследуется от абстрактного класса BaseMaintenanceProcess, в котором, в частности, реализованы методы, используемые в абстрактном классе BaseContractMaintenance.
Здесь необходимо реализовать:
-
статический метод получения экземпляра интерактора:
static ContractRelocationProcess extract(int processId) {
return Interactor.create(processId, ContractRelocationProcess.class);
}
-
получение дочерних процессов для обработки субдоговоров:
@Override
@BindLinkedProcesses(linkTypes = LINK_TYPE_MADE, processTypes = PROCESS_TYPE_SERVICE_RELOCATION)
List<Process> getChildProcesses();
Интерактор процесса обслуживания ЮЛ на услугу
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.process.service
Наследуется от родительского интерфейса BaseServiceMaintenanceProcess, все остальное аналогично Интерактором процесса обслуживания ЮЛ на договор.
Handler (Отправка сообщений в AMQ и их принятие на обработку и вызов обработки)
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.consumer
Наследуется от MQBaseService, который отправляет сообщения в AMQ в очередь с указанным в текущем хэндлере адресом.
Здесь же принимается сообщение из очереди AMQ, получается экземпляр процессора, в котором вызывается метод execute с передачей параметров из сообщения.
Processor (Запуск сервиса и обработка его результатов)
package ru.bgcrm.dyn.ufanet.wizard.ul.maintenance.processor
Processor наследуется от абстрактного класса BaseProcessor.
Здесь в объявлении класса определяются тип модели данных для обработки и тип интерактора для процесса на услуги:
public class RelocationProcessor extends BaseProcessor<RelocationParameters, ServiceRelocationProcess> {
}
В методе executeImpl вызывается экземпляр`MaintenanceULBillingService` для произведения операции над услугой.
В классе BaseStatusChangeProcessor предусмотрена возможность управления как над всей услугой (субдоговором), так и над частью услуги.