На этом этапе мы разработаем экранные формы для планирования и учета ремонтов оборудования, допишем необходимый функционал в источники данных DataSource, скорректируем главное меню системы.
Вот содержимое файла контроллера источника данных для таблицы оборудования machine, файл php/datasources/machine.php:
class DataSource_Machine_Ext extends DataSource_Machine { protected function onRowAfter(&$row, $params=Array()) { $row['sectorid.readonly']=$row['departmentid']?0:1; } public function execChange($params=Array()) { $result=parent::execChange($params); $fieldName=$params['#request.mode']; if ($fieldName=='departmentid') { $row=Array(); $row['row.change']=1; $row['sectorid.readonly']=$params['departmentid']?0:1; $row['sectorid']=''; $row['sector_name']=''; $result[]=$row; } return $result; } } return new DataSource_Machine_Ext();
Вот содержимое файла контроллера источника данных для таблицы запланированных и фактически выполненных ремонтов machinerepair, файл php/datasources/machinerepair.php:
class DataSource_Machinerepair_Ext extends DataSource_Machinerepair { protected function initRequests() { $result=parent::initRequests(); $result[]=Array( 'name'=>'rebuild', 'permoper'=>'write' ); return $result; } public function exec($params=Array()) { $requestName=$params['#request.name']; $requestMode=$params['#request.mode']; if ($requestName=='rebuild') { return $this->execRebuild($params); } return parent::exec($params); } public function execRebuild($params=Array()) { $this->rebuild(24); $result=Array(); return $result; } protected function rebuild($maxperiod) { $sql_dmax=(new DateTime())->modify("+{$maxperiod} month")->format('Y-m-01'); { // удаляем строки плана ремонтов $sql=<<<SQL delete from "machinerepair" where "machinerepair".dfact is null SQL; $this->pdo($sql); } { // упорядочиваем справочник видов ремонтов $sql=<<<SQL update "repair" set npp=a.npp from ( select "repair".id, rank() over (order by "repair".name, "repair".id) as npp from "repair" ) a where "repair".id=a.id and "repair".npp<>a.npp SQL; $this->pdo($sql); } { // добавляем строки планов ремонтов for($i=0; $i<500; $i++) { $sql=<<<SQL insert into "machinerepair" ( machineid, repairid, dplan ) select m.machineid, m.repairid, m.dnext from( select *, rank() over (partition by machineid order by m.dnext, m.repair_npp) as npp from ( select *, date_trunc('MONTH', m.dlast + (interval '1 month')*m.period)::DATE as dnext from ( select "machine".id as machineid, "repair".id as repairid, max("repair".npp) as repair_npp, max("repairnorm".period) as period, max( case when "machinerepair".id is null then "machine".dfrom when "machinerepair".dfact is null then "machinerepair".dplan else "machinerepair".dfact end ) as dlast from "machine" left join "repairnorm" on "repairnorm".machinetypeid="machine".machinetypeid left join "repair" on "repair".id="repairnorm".repairid left join "repair" "prepair" on "prepair".npp<="repair".npp left join "machinerepair" on "machinerepair".machineid="machine".id and "machinerepair".repairid="prepair".id group by "machine".id, "repair".id ) m ) m ) m where m.dnext<='{$sql_dmax}' and m.npp=1 SQL; $q=$this->pdo($sql); if (!$q->rowCount()) break; } } return; } protected function onRowAfter(&$row, $params=Array()) { $row['dplan.readonly']=1; if ($row['dplan']) { $row['repairid.readonly']=1; $row['machineid.readonly']=1; } } protected function onRowAfterDelete(&$row, $params=Array()) { if ($row['dplan']) throw new Exception('Задана плановая дата ремонта, нельзя удалять'); } } return new DataSource_Machinerepair_Ext();
Вот содержимое файла контроллера источника данных для таблицы норм ремонтов repairnorm, файл php/datasources/repairnorm.php:
class DataSource_Repairnorm_Ext extends DataSource_Repairnorm { /// переопределяем проверку после правки строки protected function onRowValid(&$row) { { // проверка значений repairid и machinetypeid на уникальность - для более понятного пользователю сообщения об ошибке $sql_repairid=$this->str2Sql($row['repairid']); $sql_machinetypeid=$this->str2Sql($row['machinetypeid']); $sql_id=$this->str2Sql($row['id']); $sql=<<<SQL select count(*) as n from "repairnorm" where "repairnorm".repairid='{$sql_repairid}' and "repairnorm".machinetypeid='{$sql_machinetypeid}' and "repairnorm".id<>'{$sql_id}' SQL; $rec=$this->pdoFetch($sql); if ($rec['n']) throw new Exception("Для типа оборудования '{$row['machinetype_name']}' периодичность ремонта '{$row['repair_name']}' уже задана"); } { // проверка значения периодичности ремонта if ($row['period']<=0) throw new Exception('Периодичность ремонтов должна быть положительна'); } } } return new DataSource_Repairnorm_Ext();
Экранная форма справочника Типы оборудования переделана в экранную форму Типы оборудования и нормативы ремонта:
<form name="%form%" caption="Типы оборудования и нормативы ремонтов"> <rowsets> <rowset name="machinetype"> <rowset name="repairnorm"> <param name="filter.machinetypeid" js_value="get('machinetype.id')"/> </rowset> </rowset> </rowsets> <panels> <panel> <panel type="grid" rowset="machinetype"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="name"/> </fields> </panel> <panel splitter="1" type="grid" rowset="repairnorm" align="right" width="50%"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="repair_name" stretch="1"/> <field name="period"/> </fields> </panel> </panel> </panels> </form>
Разработана экранная форма formMachine, XML описание ее расположено в файле php/forms/formMachine/formMachine.xml:
<form name="%form%" caption="Паспорт оборудования"> <rowsets> <rowset name="machine"> <rowset name="machinerepair"> <param name="filter.machineid" js_value="get('machine.id')"/> </rowset> <rowset name="repairnorm" readonly="1"> <param name="filter.machinetypeid" js_value="get('machine.machinetypeid')"/> </rowset> </rowset> </rowsets> <requests> <request name="machinerepair-rebuild" icon="process" caption="Пересчитать план" confirm="Пересчитать план ремонтов для всего оборудования?"> <request rowset="machinerepair" name="rebuild"/> <request rowset="machinerepair" name="refresh"/> </request> </requests> <panels> <panel> <panel type="grid" rowset="machine" align="left" width="40%"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="invnum"/> <field name="machinetype_name" stretch="1"/> </fields> <buttons> <request name="machinerepair-rebuild" align="right"/> </buttons> </panel> <panel type="tab"> <panel rowset="machine" caption="Паспорт"> <panel type="scroll"> <panel align="top" type="fields" captionup="1" caption="Оборудование"> <field name="invnum" line="invnum"/> <field name="machinetype_name" line="invnum" stretch="1"/> <field name="dfrom" line="invnum" caption="ввод в экспл"/> <field name="model" line="dfrom" stretch="1"/> </panel> <panel align="top" type="fields" captionup="1" caption="Место размещения"> <field name="department_name" line="department" stretch="1"/> <field name="sector_name" line="department" stretch="1"/> </panel> <panel align="top" type="fields" captionup="1" caption="Состояние"> <field name="machinestatus_name" line="dstatus" stretch="1"/> <field name="dstatus" line="dstatus" caption="начало состояния"/> </panel> </panel> </panel> <panel rowset="machinerepair" caption="Ремонты"> <panel type="grid"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="dfact" caption="фактическая дата" len="12"/> <field name="repair_name" stretch="1"/> <field name="dplan"/> </fields> </panel> </panel> <panel rowset="repairnorm" caption="Нормативы ремонтов"> <panel type="grid"> <toolbar menu="1"> <request rowset="#this" name="refresh"/> </toolbar> <fields> <field name="repair_name" stretch="1"/> <field name="period"/> </fields> </panel> </panel> </panel> </panel> </panels> </form>
Главное меню проекта описывается в XML файле php/config/appmenu.xml:
<node name="Паспорта оборудования и ремонты" icon="box" form="formMachine"/> <node name="Типы оборудования и нормативы ремонтов" icon="ref" form="ref.formMachineType"/> <node name="Справочники" icon="reffolder"> <node name="Структура предприятия" icon="ref" form="ref.formDepartment"/> <node name="Виды ремонта" icon="ref" form="ref.formRepair"/> <node name="Состояния оборудования" icon="ref" form="ref.formMachineStatus"/> </node>
Демонстрационные примеры доступны в режиме «только чтение». Для входа используйте логин root, пароль 1.