В нашей модели сделаем следующие добавления. Все цены будем считать в у. е., единица модельного времени будет соответствовать одной минуте реального времени.
Для подсчета длительности состоявшегося телефонного разговора введем новый тип сообщения (), который назовем call. Этот тип будет наследоваться от базового класса Entity и иметь два вещественных поля, tstart и tFinish (рис. 9.13).
В блоке source параметр newEntity определим как Call.class (используя выпадающее меню). В этом поле определяется класс тех объектов, которые
будут генерироваться данным источником. В языке Java <имя_класса>. class как раз задает класс объектов. |
В блоке processQ параметр onEnter определим как:
((Call)entity).tStart=getTime();
а параметр onExit как:
((Call)entity).tFinish=getTime();
Во всех блоках Enterprise Library имя текущего объекта (сообщения) по умолчанию установлено как entity. Для того чтобы пользоваться элементами структуры текущего сообщения (здесь — данными tstart и tFinish). необходима операция явной конверсии типов (call(entity, указывающая, что этот объект имеет тип call. Операция кастинга имеет меньший приоритет, чем точка, поэтому выражение это нужно взять в скобки, чтобы затем использовать "точечную" операцию доступа к данным этого объекта.
Теперь после обработки каждая заявка будет хранить момент начала и момент конца разговора. Эти значения нужны для того, чтобы начислить плату за обслуживание заявки.
Зададим теперь правило расчета за состоявшиеся телефонные переговоры. Его удобно определить алгоритмической функцией. Щелкните на кнопке или выберите команду Новая алгоритмическая функция в контекстном
меню при выделенном корневом объекте модели Main. Назовите функцию callPrice. У нее должен быть один вещественный параметр, назовите его t. Саму функцию в окне Тело функции определите так (рис. 9.14):
return t<=l? minPrice: t*minPrice;
Функция callPrice (t) определяет стоимость разговора так: если длительность t разговора не больше одной минуты, то взимается плата за одну минуту В размере minPrice, если больше, ТО t*minPrice. Параметр minPrice
(цена минуты разговора) задайте как вещественный параметр модели со значением 0.12.
Введите в модель вещественную переменную income, суммирующую полученный с течением времени доход от предоставления соединения (с начальным значением 0). Каждый раз, как обслуженная заявка попадает в блок sink, величина income должна возрастать на величину:
callPrice(((Call)entity).tFinish-((Call)entity).tStart);
Как только получено новое значение суммарной величины дохода income, можно вычислить новую реализацию среднего дохода gain, которая равна Invcome/getTime (). Поэтому в поле с именем onEnter окна свойств блока sink следует вставить следующие операторы (рис. 9.15):
Income += callPrice(((Call)entity).tFinish-((Call)entity).tStart);
gain.add (Income/getTime());