У нас есть система одобрения. Сотрудники могут просмотреть заявку клиента и решить, одобрить ли ее. Мы проектируем ApprovalFlow как AggregateRoot для обработки всех действий по утверждению сотрудников. Его поля следующие:
Код: Выделить всё
ApprovalFlow {
private EventBus eventBus;
private Long approvalFlowId;
private Status status;
private ApprovalResult approvalResult;
public void reject() {
this.status = Status.COMPLETED;
this.approvalResult = ApprovalResult.REJECT;
eventBus.push(new RejectEvent(approvalFlowId));
}
enum Status {
APPROVING(1),
COMPLETED(2);
private Integer code;
Status(Integer code) {
this.code = code;
}
}
enum ApprovalResult {
PASS(1),
REJECT(2);
private Integer code;
Status(Integer code) {
this.code = code;
}
}
}
Мы пытаемся сделать следующее: если сотрудник отклоняет отказ решение, мы хотим зарегистрировать это решение и включить причину отклонения в запись. Согласно нашей модели, поток вызовов выглядит следующим образом.
Код: Выделить всё
// remote api method
public void rejectApproval(Long approvalFlowId, String rejectReason) {
commandService.rejectApproval(Long approvalFlowId);
}
// command service
public void rejectApproval(Long approvalFlowId) {
ApprovalFlow approvalFlow = approvalRepository.find(approvalFlowId);
approvalFlow.reject();
approvalRepository.save(approvalFlow);
}
// domain event handler and write a reject approval log;
@Subscribe
public void handleEvent(RejectEvent rejectEvent) {
RejectLog rejectLog = new RejectLog();
rejectLog.setApprovalFlowId(rejectEvent.getApprovalFlowId);
// can't transfer rejectReason through ApprovalFlow to RejectEvent, because the rejectReason is not a domain object, how to implement the product function?
// rejectLog.setRejectReason(rejectReason);
rejectLogMapper.insert(rejectLog);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... nt-handler
Мобильная версия