ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Автоматизация Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π΅Ρ…ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

РСшСниС вопросов Ρ‡Π΅Ρ€Π΅Π· Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ — Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΠ°ΠΌΡ‹ΠΉ эффСктивный ΠΏΡƒΡ‚ΡŒ. НСобходимо Π½Π°Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… связСй, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ взаимодСйствиС сотрудников Π½Π° Π²ΡΠ΅Ρ… уровнях. НСобходим структурированный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° Π˜Π’ эффСктивной ΠΈ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ стал стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ Π² ΠΌΠΈΡ€Π΅ для формирования ИВ-слуТбы ΠΊΠ°ΠΊ соврСмСнного… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Автоматизация Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π΅Ρ…ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

  • Π₯арактСристика ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ тСхничСскоС Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ систСмы
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ модСль систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок
  • МодСль Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок
  • ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ интСрфСйса
  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° систСмы. Π’Ρ‹Π±ΠΎΡ€ срСдств Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • РСализация
  • Листинг основных классов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
  • Глоссарий
  • Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
  • Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников

Π₯арактСристика ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ руководство остаСтся Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ качСством ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ (ИВ), ΠΌΠ½ΠΎΠ³ΠΎ. Π§Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… находится Π² ΠΎΠ±Π»Π°ΡΡ‚ΠΈ управлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ внСдрСния Π˜Π’. Π”Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ срок ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π±ΡŽΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Но Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ, становятся Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Ρ‹Π΅ вопросы, связанныС с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ИВ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΎ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π˜Π’:

Β· К ΠΊΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ?

Β· Бколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ Π˜Π’ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ вопрос?

Β· ΠŸΠ»Π°Π½Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ видоизмСнСния ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм. Когда это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано с ΡƒΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ сохранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ для обСспСчСния Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π² Π½Π°ΡΡ‚оящий ΠΌΠΎΠΌΠ΅Π½Ρ‚?

Β· ΠšΡƒΠ΄Π° уходят рСсурсы, направляСмыС Π½Π° ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ растущих ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм? Насколько эффСктивно ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ?

Β· Как ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° Π˜Π’ Π² ΠΏΡ€Π΅Π΄Π΄Π²Π΅Ρ€ΠΈΠΈ прСдстоящСго роста ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ?

И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

РСшСниС вопросов Ρ‡Π΅Ρ€Π΅Π· Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ — Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΠ°ΠΌΡ‹ΠΉ эффСктивный ΠΏΡƒΡ‚ΡŒ. НСобходимо Π½Π°Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… связСй, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ взаимодСйствиС сотрудников Π½Π° Π²ΡΠ΅Ρ… уровнях. НСобходим структурированный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° Π˜Π’ эффСктивной ΠΈ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ стал стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ Π² ΠΌΠΈΡ€Π΅ для формирования ИВ-слуТбы ΠΊΠ°ΠΊ соврСмСнного бизнСс-подраздСлСния, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π°, постоянно ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΏΠΎΡ‚рСбности своих ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π°Ρ†Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ сохранСнии прозрачности для руководства с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния достигнутого уровня качСства ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… рСсурсов. ΠžΠΏΡ‹Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ рассматриваСмыС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ ΠΊΠ°ΠΊ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ…, Ρ‚Π°ΠΊ ΠΈ Π΄Π»Ρ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΈ Π½Π΅ Π·Π°Π²ΠΈΡΡΡ‚ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, пСрСдаСтся Π»ΠΈ сопровоТдСниС Π˜Π’ Π½Π° Π°ΡƒΡ‚сорсинг ΠΈΠ»ΠΈ организуСтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ силами. ΠšΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ИВ-Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ — это Π·Π°Π΄Π°Ρ‡Π°, ΡΡ‚Π°Π²ΡˆΠ°Ρ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ для ΠΌΠ½ΠΎΠ³ΠΈΡ… соврСмСнных российских ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ.

Π‘ Ρ€ΠΎΡΡ‚ΠΎΠΌ зависимости бизнСс-процСссов ΠΎΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ растёт ΠΈ ΡƒΡ‰Π΅Ρ€Π±, наносимый бизнСсу простоями ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ ИВ-услуг. ΠŸΡ€ΠΎΡ†Π΅ΡΡ управлСния заявками ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΈΠ·Π²Π°Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€Π΅ΠΉΡˆΠ΅Π΅ восстановлСниС прСдоставлСния ИВ-услуг Π½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… процСсса выполняСтся контролируСмая рСгистрация заявок, Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ спСциалистам (ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ), диагностика ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ИВ-инфраструктуры.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ Π·Π°ΡΠ²ΠΊΠ°Ρ… часто поступаСт ΠΊ ΠΏΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊΡƒ услуг ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡ…ΡΡ с Ρ‚рудностями ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ бизнСс-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Для обСспСчСния эффСктивных ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ ΠΏΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊΠΎΠΌ ИВ-услуг организуСтся слуТба ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ — Service Desk.

По Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π°Ρ€ΡƒΠ±Π΅ΠΆΠ½Ρ‹Ρ… ИВ-Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΎΠ², 45% происходящих Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСстах ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π° Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° для сбора ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π΅, Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ… ΠΊ ΡΠ΅Ρ‚ΠΈ, установлСнном ΠŸΠž ΠΈ Ρ‚. ΠΏ. Если эта информация Π±ΡƒΠ΄Π΅Ρ‚ доступна ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρƒ со ΡΠ²ΠΎΠ΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ мСста, Ρ‚ΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΡΡ€Π΅Π΄Π½Π΅ΠΌ Π½Π° 25%.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ:

Π¨Ρ‚Π°Ρ‚ ИВ-слуТбы ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ 30 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ

БрСдняя заработная ΠΏΠ»Π°Ρ‚Π° ИВ-спСциалиста 21 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСст Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ 1500

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ количСство заявок ΠΏΠΎ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°ΠΌ 760

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠΌ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° — 4 часа Π’ΠΎΠ³Π΄Π°:

Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ обслуТивания 1 Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ мСста Π² ΠΌΠ΅ΡΡΡ†: (30×21 000)/1500=420 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ заявок, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ…ΠΎΠ΄Π° Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°: 760×0,45=342

Экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ Service Desk Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°: 4×0,25=1 час Экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°ΠΌ Π·Π° ΠΌΠ΅ΡΡΡ†: 342×1=342 часа Час Ρ€Π°Π±ΠΎΡ‚Ρ‹ спСциалиста стоит: 21 000/22/8=120 Ρ€ΡƒΠ±Π»Π΅ΠΉ Экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π° ΠΌΠ΅ΡΡΡ† 120*342=41 040 Ρ€ΡƒΠ±Π»Π΅ΠΉ, Π·Π° Π³ΠΎΠ΄ 41 040×12=492 480 Ρ€ΡƒΠ±Π»Π΅ΠΉ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, сокращаСтся врСмя простоСв ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠŸΡ€ΠΈ срСднСй Π·Π°Ρ€Π°Π±ΠΎΡ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅ сотрудников ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ 15 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ 342 часа экономии Π² ΠΌΠ΅ΡΡΡ† Π½Π° ΠΏΡ€ΠΎΡΡ‚оях Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ суммой Π² (15 000/22/8)Ρ…342×12=349 773 рубля Π² Π³ΠΎΠ΄.

Π‘ΡƒΠΌΠΌΠ°Ρ€Π½Ρ‹ΠΉ эффСкт 842 253 рубля Π² Π³ΠΎΠ΄ Π”Π°Π½Π½Ρ‹ΠΉ расчёт вСсьма Π³Ρ€ΡƒΠ±Ρ‹ΠΉ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρƒ лишь Π·Π°Ρ€Π°Π±ΠΎΡ‚Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ ΠΈ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ мноТСства Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΡ… Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ.

Π’ Ρ‡Π°ΡΡ‚ности, ΠΏΠΎΠ»Π½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ запуск систСмы создаёт постоянно Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ основу для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ, примСняСмых для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ качСства прСдоставляСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ услуг (Π±Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ ΠΏΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌ). Π’Π°ΠΊΠΎΠ΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сниТаСт врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡΡ‚ΠΎΠ΅Π² ΠΏΠΎ ΠΈΡ… Π²ΠΈΠ½Π΅. По Π΄Π°Π½Π½Ρ‹ΠΌ извСстного нСзависимого аналитичСского агСнтства Giga Information Group врСмя Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСстах сокращаСтся ΠΏΡ€ΠΈ этом Π½Π° 30−40%

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ тСхничСскоС Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ систСмы

Π’ ΡΠΎΠΎΡ‚вСтствии с Π“ΠžΠ‘Π’ 34.601−90, настоящий стандарт распространяСтся Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ систСмы (АБ), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄Π°Ρ… Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (исслСдованиС, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚. ΠΏ.), Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΡ… ΡΠΎΡ‡Π΅Ρ‚ания, создаваСмыС Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡΡ…, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡ… ΠΈ Π½Π° ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΡΡ‚иях (Π΄Π°Π»Π΅Π΅ — организациях).

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ устанавливаСт стадии ΠΈ ΡΡ‚Π°ΠΏΡ‹ создания ΠΠ‘.

Π‘Ρ‚Π°Π΄ΠΈΠΈ ΠΈ ΡΡ‚Π°ΠΏΡ‹ создания ΠΠ‘ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ части процСсса создания ΠΏΠΎ ΡΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡΠΌ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ планирования ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ. Π Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ ΠΠ‘ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ ΠΏΠΎ ΡΡ‚адиям ΠΈ ΡΡ‚Π°ΠΏΠ°ΠΌ, примСняСмым для создания ΠΠ‘. Бостав ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° выполнСния Ρ€Π°Π±ΠΎΡ‚ Π½Π° ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Ρ… настоящим стандартом стадиях ΠΈ ΡΡ‚Π°ΠΏΠ°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² ΠΠ‘.

НазначСниС ΠΈ Ρ†Π΅Π»ΠΈ создания систСмы:

ЦСлью создания Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ систСмы заявок ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ являСтся обСспСчСниС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивного ΠΈ ΡΠΊΠΎΡ€Π΅ΠΉΡˆΠ΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ всСх Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ Ρ‚рудностСй Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡƒΡ‡Π΅Ρ‚ качСства ΠΈ ΠΎΠ±ΡŠΠ΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ спСциалистов (ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ²) Π³Ρ€ΡƒΠΏΠΏΡ‹ тСхничСской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ тСхничСских спСциалистов, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ заявок ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ВрСбования ΠΊ Ρ„ункциям систСмы:

БистСма Π΄ΠΎΠ»ΠΆΠ½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒ заявки ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² IT-ΠΎΡ‚Π΄Π΅Π», автоматичСски ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Слям.

Π”Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… заявках Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Ρƒ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² (исполнитСлСй), Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅ ΠΈΡ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поступлСния, Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сортировки заявок, Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΡ… ΠΏΠΎΡΡ‚уплСния ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΡƒΡ‡Π΅Ρ‚Π° скорости Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ заявок руководитСлями (ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ).

БистСма Π΄ΠΎΠ»ΠΆΠ½Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… заявках, ΠΈΡ… ΡΡ‚атусах исполнСния, коммСнтариях, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ заявками, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ формирования ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ² ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΊΠ°ΠΊ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΈ Π²ΡΠ΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»Π° Π·Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄.

БистСма Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π° ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΉ заявкС, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΅Π³ΠΎ руководитСля (ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π°), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ заявка принята Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Ρ€Π΅ΡˆΠ΅Π½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Π²ΡΠ΅Ρ… двиТСниях заявки.

ВрСбования ΠΊ Π²ΠΈΠ΄Π°ΠΌ обСспСчСния — ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ, тСхничСскому, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ, ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ:

БистСма Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… трСбованиях ΠΊ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌΡƒ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, с Π»ΡŽΠ±ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти (ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚, ΠΊΠΏΠΊ, сотовый Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½). БистСма Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный интСрфСйс с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ максимального ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок Π²Π²ΠΎΠ΄Π° (Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ· Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… списков, ΠΏΠΎΠ΄Π±ΠΎΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²Ρ‹Π±ΠΎΡ€Π° Π·Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Сксту ΠΈ Ρ‚. Π΄.)

ВрСбования ΠΊ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»Ρƒ:

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования ΠΊ Π·Π½Π°Π½ΠΈΡŽ интСрфСйса Windows, ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ обращСния с ΠŸΠš.

Бостав ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡŽ систСмы:

1. ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ систСмы

2. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ систСмы

3. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° интСрфСйса

4. РСализация Π»ΠΎΠ³ΠΈΠΊΠΈ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ программирования ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ контроля ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠΊΠΈ систСмы:

БистСма Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ согласно тСхничСского задания, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, заявки, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ модСль систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок

Рис. 1 МодСль IDEF0 систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок

Рис. 2 ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΠ ΠœΡ‹)

МодСль Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок

Рис. 3 ER-Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ заявок

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ интСрфСйса

Когда говорят ΠΎ Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… основах проСктирования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… интСрфСйсов, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ HCI. HCI — это Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° английского Human-Computer Interaction, Ρ‡Ρ‚ΠΎ пСрСводится ΠΊΠ°ΠΊ «Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°». На Π—Π°ΠΏΠ°Π΄Π΅ HCI — это цСлая профСссия, Π΅ΠΉ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‚ Π² ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠΈΡ‚Π΅Ρ‚Π°Ρ…, выдавая Π΄ΠΈΠΏΠ»ΠΎΠΌΡ‹ «Π‘пСциалист ΠΏΠΎ HCI». Π˜Π·Π΄Π°Π΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΏΠΎ ΡΡ‚ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅, сущСствуСт большоС количСство Web-сайтов. Π’ Π ΠΎΡΡΠΈΠΈ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, эта Π½Π°ΡƒΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся особой ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ Π½Π°Ρ настоящих спСциалистов ΠΏΠΎ HCI ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΠ°Π»ΡŒΡ†Π°ΠΌ ΠΎΠ΄Π½ΠΎΠΉ Ρ€ΡƒΠΊΠΈ.

Как Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡŽ, составными частями HCI ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

Β· Β· Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ)

Β· Β· ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€

Β· Β· ΠΈΡ… Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс (Π°Π½Π³Π». user interface, UI) являСтся своСобразным ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ осущСствляСтся взаимодСйствиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.

Π›ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс — это Ρ‚Π°ΠΊΠΎΠΉ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ внимания, ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ просто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π³Π΄Π΅ Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΌΡ‹ΡˆΡŒΡŽ. Π’Π°ΠΊΠΎΠΉ интСрфСйс Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ — ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ°ΠΊ Π±Ρ‹ смотрит сквозь Π½Π΅Π³ΠΎ Π½Π° ΡΠ²ΠΎΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ эффСктивный интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π» Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ приятной, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ трСбования ΠΊ ΠΈΠ½Ρ‚СрфСйсу ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π­Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для собствСнных Π½ΡƒΠΆΠ΄, вСдь Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π²Ρ‹ ΡΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Π½ΠΎ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, смотритС Π½Π° Π½Π΅Π΅ Π³Π»Π°Π·Π°ΠΌΠΈ Π΅Π΅ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

ΠžΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ интуиция — Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сам Ρ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ нСкрасивыС ΠΈ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ интСрфСйсы, Ρ‚ΠΎ ΠΏΡ€ΠΈ создании собствСнной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ элСмСнт Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ. НСобходимо ΠΈΠΌΠ΅Ρ‚ΡŒ худоТСствСнный вкус, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ придаст интСрфСйсу красоту ΠΈ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π—Π°ΠΏΠ°Π΄Π½Ρ‹Π΅ исслСдоватСли Π² ΠΎΠ±Π»Π°ΡΡ‚ΠΈ HCI сформулировали основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ проСктирования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… интСрфСйсов ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Как ΠΈ Π² Π»ΡŽΠ±ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°ΡƒΠΊΠ΅, сущСствуСт довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ ΠΈ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ HCI, Π²Ρ‹ΠΏΡƒΡˆΠ΅Π½Π½Ρ‹Ρ… Π·Π° Ρ€ΡƒΠ±Π΅ΠΆΠΎΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° ΠΈΠ½ΠΎΡΡ‚Ρ€Π°Π½Π½Ρ‹Ρ… Web-сайтах.

Рис 4 Π‘Ρ…Π΅ΠΌΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° основного интСрфСйса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° систСмы. Π’Ρ‹Π±ΠΎΡ€ срСдств Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ASP.NET MVC — это ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ‚ Microsoft, которая сочСтаСт Π² ΡΠ΅Π±Π΅ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΡΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ «ΠΌΠΎΠ΄Π΅Π»ΡŒ-прСдставлСниС-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€», новСйшиС ΠΈΠ΄Π΅ΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Π³ΠΈΠ±ΠΊΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ всС Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ASP.NET. Она прСдставляСт собой ΠΏΠΎΠ»Π½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΡƒΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ASP.NET Web Forms, прСдоставляя сущСствСнныС прСимущСства для всСх ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ…. Новая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ASP.NET MVC обСспСчила Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сдвиг Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π± — ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Microsoft. Π’ Π½Π΅ΠΉ дСлаСтся ΡƒΠΏΠΎΡ€ Π½Π° ΡΡΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, ΠΈ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ся ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ сокрытия Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π΅Π±-срСда.

Π’Π΅Ρ€ΠΌΠΈΠ½ модСль — прСдставлСниС — ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ (model — view — controller) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с ΠΊΠΎΠ½Ρ†Π° 70-Ρ… Π³Π³. ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ столСтия. Π­Ρ‚Π° модСль явилась Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Smalltalk Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Xerox, Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π·Π°Π΄ΡƒΠΌΠ°Π½Π° ΠΊΠ°ΠΊ способ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Ρ€Π°Π½Π½ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса. НСкоторыС ΠΈΠ· Π½ΡŽΠ°Π½ΡΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ MVC Π±Ρ‹Π»ΠΈ связаны с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡΠΌΠΈ, спСцифичными для Smalltalk, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ экраны ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ понятия всС Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ, ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠ½ΠΈ подходят для Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ [5, с. 63].

Если ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ понятиями высокого уровня, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ шаблон MVC ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ MVC Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π° Ρ‚Ρ€ΠΈ части (рисунок 5).

интСрфСйс Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ заявка

Рисунок 5 — Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ части Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ шаблона MVC

МодСли, содСрТащиС ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ простыми модСлями прСдставлСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ прСдставлСниями ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°ΠΌΠΈ; ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ модСлями ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат бизнСс — Π΄Π°Π½Π½Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, прСобразования ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° для манипулирования этими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ, примСняСмыС для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ части ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ запросы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠΎΠ΄Π΅Π»ΡŒΡŽ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ прСдставлСния для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Π’ MVC ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ классами, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ ΠΊΠ»Π°ΡΡΠ° System. Web. Mvc. Controller. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ public Π² ΠΊΠ»Π°ΡΡΠ΅, унаслСдованном ΠΎΡ‚ ΠΊΠ»Π°ΡΡΠ° Controller, называСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ дСйствия ΠΈ ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ систСмы ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ASP.NET связан с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ URL. Когда запрос отправляСтся URL, связанному с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ дСйствия, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ прСдставлСниС для отобраТСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. ВзаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ, модСлью ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 6

Рисунок 6 — ВзаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ, модСлью ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ

Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€Π°Π½Π° тСхнология ASP.NET MVC 3 ΠΈ ΡΠ·Ρ‹ΠΊ C#, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ самым популярным языком для написания бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅.NET, основныС прСимущСства Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ASP.NET MVC 3:

— Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ встроСнного Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ шаблона MVC.

— Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° MVC построСна Π² Π²ΠΈΠ΄Π΅ сСрии нСзависимых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² — Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйс.NET ΠΈΠ»ΠΈ построСнных Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ абстрактного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ систСму ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, с ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΠΎΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

— Π–Ссткий ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ HTML ΠΈ HTTP. Π’ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ASP.NET MVC ΡƒΡ‡Ρ‚Π΅Π½Π° Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ясного ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ стандартам ΠΊΠΎΠ΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ. Π•Π΅ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ HTML ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ стандартам Π²Ρ‹Π²ΠΎΠ΄, Π½ΠΎ Π² Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ΅ философскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Web Forms. ВмСсто Π³Ρ€ΠΎΠΌΠ°Π΄Π½ΠΎΠ³ΠΎ объСма, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ HTML-ΠΊΠΎΠ΄Π°, ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° MVC стимулируСт созданиС простых ΠΈ ΡΠ»Π΅Π³Π°Π½Ρ‚Π½Ρ‹Ρ…, стилизованных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CSS ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

— Π’Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ. ЕстСствСнноС разнСсСниС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ прилоТСния ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ, нСзависимым Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° частям ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ MVC. позволяСт ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ сопровоТдаСмыС ΠΈ Ρ‚СстируСмыС прилоТСния. Однако ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ ASP.NET MVC Π½Π° ΡΡ‚ΠΎΠΌ Π½Π΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠ½ΠΈ обСспСчили ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для выполнСния Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования ΠΈ ΡΡ€Π΅Π΄ΡΡ‚Π² макСтирования.

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ IDE Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€Π°Π½Π° Visual Studio 2010 — это интСгрированная срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Microsoft (IDE), ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ IDE для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅.NET.

Для ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€Π°Π½Π° встроСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² Visual Studio 2010 Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π°ΡΡ‚оящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ встроСнной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½ΠΈΡ‡ΡƒΡ‚ΡŒ Π½Π΅ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ Ρƒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΠ², Π° Ρ‚Ссная интСграция с IDE ставит Π΅Ρ‘ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ мСсто.

Для хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½Π° Π‘Π£Π‘Π” SQL Server 2008 R2 ΠΎΡ‚ Microsoft. Из Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Π‘Π£Π‘Π” для создания Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π±Ρ€Π°Π½Π° Π‘Π£Π‘Π” MS SQL Server, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ срСдствами для создания ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡ работоспособности Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, стандарт языка SQL.

РСализация

Рис. 7 Основной интСрфСйс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Рис. 8 Π€ΠΎΡ€ΠΌΠ° для ΠΏΠΎΠ΄Π°Ρ‡ΠΈ заявки

Листинг основных классов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

using System;

using System.Collections.Generic;

using System. Linq;

using System.Runtime.Serialization;

using System. ServiceModel;

using System.ServiceModel.Web;

using System. Text;

using System. Timers;

using PlanningService. DataClasses;

using System. Diagnostics;

namespace PlanningService

{

public class RequestComparer: IComparer

{

public int Compare (Request x, Request y)

{

if (x.CurrentStatus < y. CurrentStatus)

{

return -1;

}

else if (x.CurrentStatus > y. CurrentStatus)

{

return 1;

}

else

{

if (x.CurrentStatus == Status. WaitingOpen_StatusCode && y. CurrentStatus == Status. WaitingOpen_StatusCode && x. Type == y. Type && x. PlanningTime < 10 && y. PlanningTime < 10)

{

return 0;

}

else

{

if (y.Priority==1)

{

return 1;

}

else if (x.Priority==1)

{

return -1;

}

else

{

if (x.PlanningOnDate < y. PlanningOnDate)

{

return -1;

}

else if (x.PlanningOnDate > y. PlanningOnDate)

{

return 1;

}

else

{

return 0;

}

}

}

}

}

}

public class UserRequestComparer: IEqualityComparer

{

#region IEqualityComparer Members

public bool Equals (Request x, Request y)

{

if (x.ReqID == y. ReqID)

{

if (x.CurrentStatus == y. CurrentStatus && x. ExecutorID == y. ExecutorID && x. PlanningOnDate == y. PlanningOnDate && x. PlanningCompleteDate==y.PlanningCompleteDate)

{

return true;

}

else

{

return false;

}

}

else

{

return false;

}

}

public int GetHashCode (Request obj)

{

return obj. GetHashCode ();

}

#endregion

}

[ServiceBehavior (InstanceContextMode=InstanceContextMode.Single)]

public class PlanningService: IService1

{

private ServiceResponse Response =null;

private List UserList = null;

private static linqDataContext dc = null;

private static ViolationsDataContext vdc= null;

private RequestComparer ReqComparer = null;

public PlanningService ()

{

Response = new ServiceResponse (false, «»);

UserList = new List ();

dc = new linqDataContext ();

vdc = new ViolationsDataContext ();

ReqComparer = new RequestComparer ();

SOTRUD user = null;

foreach (Sessions session in dc. Sessions)

{

user = dc.SOTRUD.SingleOrDefault (s => s. ID == session. EmployeeID);

if (user ≠ null)

{

if (user.ID_SOTRUD_DOLG.HasValue)

{

SetWorkDay (user.ID, user. ID_SOTRUD_DOLG.Value, false, session. DuringTime);

}

private static UsersList ContainerToUser (UserContainer uc)

{

SOTRUD CurrentSotr = dc.SOTRUD.Single (s=>s.ID==uc.UserID);

return new UsersList { ID = CurrentSotr. ID, name = CurrentSotr. FIO, position = CurrentSotr. SOTRUD_DOLG.SOTRUD_DOLG1, BeginTime = uc.ComeTime.ToString (@" hh: mm:ss") };

}

private void AddViolation (Guid ReqID, string Type)

{

Violations V = new Violations{ Data=DateTime.Now, Request=ReqID, Type=Type };

vdc.Violations.InsertOnSubmit (V);

vdc.SubmitChanges ();

}

public bool SetWorkDay (int id, int posID, bool itIsEnd, int minutes = 0)

{

if (!itIsEnd)

UserContainer CurrentContainer = UserList. SingleOrDefault (s => s. UserID == id);

if (CurrentContainer == null)

{

UserContainer NewContainer = new UserContainer (id, posID, dc);

NewContainer.ComeTime = NewContainer.ComeTime.Subtract (new TimeSpan (0, minutes, 0));

try

{

foreach (Request r in NewContainer.ReqList.FindAll (r=>r.CurrentStatus>Status.Opened_StatusCode && r.PlanningOnDate.Date<=DateTime.Now.Date && !r.PlannedRequest))

{

int ind = NewContainer.ReqList.IndexOf®;

if (ind == 0)

{

r.PlanningOnDate = DateTime. Parse (GetPlanningTime (r.CreatorID, r. IsCycle, r. Type, r.Executor.LocationID.Value, false, r. ExecutorID));

}

else

{

r.PlanningOnDate = NewContainer. ReqList[ind — 1]. PlanningCompleteDate.Value.AddMinutes (5);

}

r.PlanningCompleteDate = r.PlanningOnDate.AddMinutes (r.PlanningTime);

}

dc.SubmitChanges ();

UserList.Capacity++;

UserList.Add (NewContainer);

CheckForCyclicRequests ();

return true;

}

catch

{

return false;

}

}

else

{

return false;

}

}

else

{

UserContainer Current = UserList. Single (s=>s.UserID==id);

int DepID = dc.SOTRUD.Single (s=>s.ID==id).ID_OTD;

Current.ReqList.ForEach (ListRequestHandlers.SetMinutesLeft);

dc.SubmitChanges ();

List lreq = dc.Request.Where (r=>r.PlanningOnDate.Date==DateTime.Now.Date && r. ExecutorID==Current.UserID).ToList ();

TimeSpan WorkedTime = DateTime.Now.TimeOfDay.Subtract (Current.ComeTime);

int RequestsPlanning = lreq. Count;

int RequestsExecuted = lreq. Where (r=>r.CurrentStatus>=Status.Completed_StatusCode).Count ();

List forgrade = lreq. Where (r=>r.grade.HasValue).ToList ();

int ViolCount = vdc.Violations.Where (r => r.Re.PlanningOnDate.Date == DateTime.Now.Date && r.Re.ExecutorID == Current. UserID).Count ();

double AvgGrade = 0;

if (forgrade.Count > 0)

{

AvgGrade = forgrade. Average (a => a.grade.Value);

}

Tabel tab = new Tabel

{

BeginWorkTime = DateTime.Now.Subtract (WorkedTime),

EndWorkTime = DateTime. Now,

ExecutorID = Current. UserID,

TimeOnBreak = Current. TimeInBreak,

RequestsAssigned = RequestsPlanning,

RequestsExecuted = RequestsExecuted,

AverageGrade = Convert. ToDecimal (AvgGrade),

ViolationsCount = ViolCount,

ViolationsPercent = RequestsExecuted ≠ 0? ViolCount / RequestsExecuted: 0,

DepID= DepID

};

vdc.Tabel.InsertOnSubmit (tab);

vdc.SubmitChanges ();

bool Deleted = UserList. Remove (Current);

return false;

}

}

private void DeleteSession (int uid)

{

try

{

Sessions session = dc.Sessions.SingleOrDefault (s => s. EmployeeID == uid);

if (session ≠ null)

{

dc.Sessions.DeleteOnSubmit (session);

dc.SubmitChanges ();

}

}

catch

{

}

}

private void WriteSession (int uid, int minutes)

{

try

{

Sessions session = dc.Sessions.SingleOrDefault (s => s. EmployeeID == uid);

if (session == null)

{

session = new Sessions { DuringTime = minutes, ID = Guid. NewGuid (), EmployeeID = uid };

dc.Sessions.InsertOnSubmit (session);

}

else

{

session.DuringTime = minutes;

}

dc.SubmitChanges ();

}

catch

{

}

}

public bool ToggleBreak (int UID)

{

UserContainer Current = UserList. SingleOrDefault (s => s. UserID == UID);

if (Current ≠ null)

{

int index = UserList. IndexOf (Current);

UserList[index]. IsOnBreak = !Current.IsOnBreak;

if (UserList[index]. IsOnBreak)

{

UserList[index]. TimeInLastBreak = 0;

UserList[index]. BreakTimer. Start ();

UserList[index]. PauseTimer. Stop ();

}

else

{

UserList[index]. BreakTimer. Stop ();

UserList[index]. MovePlanningCompleteTime (0, Convert. ToDouble (UserList[index]. TimeInLastBreak));

}

}

return true;

}

public Request GetRequest (int userID, string reqID)

{

Guid outGID;

Request req = null;

if (Guid.TryParse (reqID, out outGID))

{

req = dc.Request.SingleOrDefault (r => r. ReqID == outGID);

}

return req;

}

public void ResetReplannedFlag (int id)

{

UserContainer uc = GetUserContainer (id);

if (uc≠null)UserList[UserList.IndexOf (uc)]. IsReplanned=false;

}

public void SetPlannedFlag (Guid RID, bool value)

{

Request r = dc.Request.SingleOrDefault (s => s. ReqID == RID);

if (r ≠ null)

{

UserContainer ul = UserList. SingleOrDefault (a => a. UserID == r. ExecutorID);

if (ul ≠ null) ul. IsReplanned = true;

r.PlannedRequest = value;

dc.SubmitChanges ();

}

}

public void SetPlanningTime (Guid RID, DateTime On, DateTime Complete)

{

Request r = dc.Request.SingleOrDefault (s => s. ReqID == RID);

if (r ≠ null)

{

UserContainer ul = UserList. SingleOrDefault (a => a. UserID == r. ExecutorID);

if (ul ≠ null) ul. IsReplanned = true;

r.PlanningOnDate = On;

r.PlanningCompleteDate = Complete;

dc.SubmitChanges ();

}

}

public bool CheckForListEquality (IEnumerable OldList, int UID)

{

IEnumerable newList = GetUserRequests (UID);

return OldList. SequenceEqual (newList, new UserRequestComparer ());

}

private void AddCommentToRequest (Guid RID, int CommentType, string comment, int CreatorID)

{

if (comment.Trim ()≠string.Empty)

{

if (comment.Length > 998)

{

comment = «ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚Π΅Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±Ρ‹Π» слишком большим ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ» ;

}

try

{

ReqComment rc = new ReqComment { CommentID = Guid. NewGuid (), UID = CreatorID, EnterDate = DateTime. Now, CommentType = CommentType, Comment = comment, ReqID = RID };

dc.ReqComment.InsertOnSubmit (rc);

dc.SubmitChanges ();

}

catch (Exception ex)

{

Trace.Write («ΠžΡˆΠΈΠ±ΠΊΠ° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AddCommentToRequest «+ ex. Message);

}

}

}

private ServiceResponse SetErrorMessage (string message)

{

Response.IsError = true;

Response.ErrorMessage = message;

return Response;

}

public ServiceResponse CreateRequest (string intCreatorUID, string gidReqType, string dtmPlanningOnDate, string strcomment, string intCount, string LocationID, bool Cyclic, bool HighestPriority, string HostName, bool NeedReconcile, int? ExecutorID)

{

byte StatusID = NeedReconcile? Status. Reconciling_StatusCode: Status. WaitingOpen_StatusCode;

return this. CreateRequestWithCurrentStatus (intCreatorUID, gidReqType, dtmPlanningOnDate, strcomment, intCount, LocationID, Cyclic, HighestPriority, HostName, StatusID, ExecutorID);

}

public ServiceResponse CreateRequestWithCurrentStatus (string intCreatorUID, string gidReqType, string dtmPlanningOnDate, string strcomment, string intCount, string LocationID, bool Cyclic, bool HighestPriority, string HostName, byte StatusID, int? ExecutorID)

{

int CreatorUID;

if (!int.TryParse (intCreatorUID, out CreatorUID))

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ID ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€Π°»);

}

int locationID;

if (!int.TryParse (LocationID, out locationID))

{

locationID = GetLocID (CreatorUID);

}

Guid ReqType;

if (!Guid.TryParse (gidReqType, out ReqType))

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Ρ‚ΠΈΠΏ заявки»);

}

DateTime PlanningOnDate;

if (!DateTime.TryParse (dtmPlanningOnDate, out PlanningOnDate))

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π΄Π°Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° дСйствия заявки, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ: Π΄Π΄ ΠΌΠΌ Π³Π³Π³Π³ Ρ‡Ρ‡: ΠΌΠΌ»);

}

int Count;

if (!int.TryParse (intCount, out Count))

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ количСство заявок»);

}

//Если ΠΏΠ»Π°Π½Π½ΠΈΠ½Π³ дСнь Π½Π΅ ΡΠ΅Π³ΠΎΠ΄Π½Ρ Ρ‚ΠΎΠ³Π΄Π° пишСм заявку Π² Π±Π°Π·Ρƒ, ΠΈ Π½Π΅ ΠΏΠΈΡˆΠ΅ΠΌ Π² ΡŽΠ·Π΅Ρ€Π»ΠΈΡΡ‚

if (PlanningOnDate.DayOfYear < DateTime.Now.DayOfYear)

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ Π΄Π°Ρ‚Π° заявки мСньшС сСгодняшнСй»);

}

try

{

WorkClassificator wclass = dc.WorkClassificator.SingleOrDefault (s => s. ID == ReqType);

if (wclass ≠ null) dc. Refresh (System.Data.Linq.RefreshMode.OverwriteCurrentValues, wclass);

}

catch

{

Trace.TraceWarning («An error in function CreateRequest, workcls refresh»);

}

UserContainer ExecutorContainer = null;

if (ExecutorID.HasValue)

{

ExecutorContainer = UserList. SingleOrDefault (s => s. UserID == ExecutorID. Value);

}

else

{

ExecutorContainer = FindUser (ReqType, CreatorUID, locationID);

ExecutorID = ExecutorContainer ≠ null? ExecutorContainer. UserID: FindExecutorByReqType (ReqType, CreatorUID, locationID);

}

if (ExecutorID < 0 || !ExecutorID.HasValue)

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ исполнитСля»);

Request NewReq = new Request { ReqID = Guid. NewGuid (), CreationDate = DateTime. Now, PlanningOnDate = PlanningOnDate, CreatorID = CreatorUID, ExecutorID = ExecutorID. Value, CurrentStatus = StatusID, Type = ReqType, IsCycle = Cyclic };

if (HostName is string)

{

if (HostName.Length > 1) NewReq. HostName = HostName;

}

NewReq.Priorities = SetRequestPriority (NewReq.IsCycle, CreatorUID, HighestPriority);

try

{

dc.Request.InsertOnSubmit (NewReq);

dc.SubmitChanges ();

}

catch (Exception ex)

{

return SetErrorMessage («ΠžΡˆΠΈΠ±ΠΊΠ° ΠΏΡ€ΠΈ записи заявки «+ ex. Message);

}

NewReq.PlanningTime = NewReq.WorkClassificator.PlanningTime.HasValue? NewReq.WorkClassificator.PlanningTime.Value * Count: 0;

NewReq.PlanningCompleteDate = NewReq.PlanningOnDate.AddMinutes (Convert.ToDouble (NewReq.PlanningTime));

dc.SubmitChanges ();

AddCommentToRequest (NewReq.ReqID, ReqCommentTypes. Open_CommentType, strcomment, CreatorUID);

if (ExecutorContainer ≠ null && NewReq.PlanningOnDate.Date >= DateTime.Now.Date && NewReq.PlanningOnDate.Date <= DateTime.Now.Date.AddDays (5) && StatusID ≠ Status. Reconciling_StatusCode)

{

int indexContainer = UserList. IndexOf (ExecutorContainer);

UserList[indexContainer]. IsReplanned = true;

UserList[indexContainer]. ReqList. Add (NewReq);

UserList[indexContainer]. ReqList. Sort (ReqComparer);

double minInterval = NewReq.PlanningOnDate.Subtract (DateTime.Now).TotalMinutes;

if (UserList[indexContainer]. ReqList. Count == 1 && minInterval < 10) UserList[indexContainer]. StartRequest ();

}

if (StatusID ≠ Status. Reconciling_StatusCode)

{

OTD Department = dc.OTD.SingleOrDefault (s => s. ID == NewReq.WorkClassificator.DepartmentID);

long? AccEmailId = null;

if (Department ≠ null)

{

AccEmailId = Department. ID_EmailAccount;

}

UserContainer.NotificateUser (ExecutorID.Value, CreatorUID, «ΠžΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ заявки», «Π’Π°ΡˆΠ° заявка «+ NewReq.WorkClassificator.TitleRow + «Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π°. Π’Π°Ρˆ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ «+ NewReq.Executor.FIO + «. ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ врСмя закрытия — «+ NewReq.PlanningCompleteDate.Value.ToString (), AccEmailId);

UserContainer.NotificateUser (ExecutorID.Value, ExecutorID. Value, «ΠžΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ Π½ΠΎΠ²ΠΎΠΉ заявкС», «Π’Π°ΠΌ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° новая заявка: «+ NewReq.WorkClassificator.TitleRow + «ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля «+ NewReq.Creator.FIO, AccEmailId);

}

Response.IsError = false;

Response.ReturnObject = NewReq.ReqID.ToString ();

return Response;

}

public int GetCurrentRequestTime (UserContainer Container)

{

Request CurrentReq = Container.ReqList.FirstOrDefault (s => s. CurrentStatus == Status. Opened_StatusCode);

int CurrentRequestRemaining = 0;

if (CurrentReq ≠ null)

{

CurrentRequestRemaining = Convert. ToInt32(CurrentReq.PlanningCompleteDate.Value.Subtract (DateTime.Now).TotalMinutes);

}

return CurrentRequestRemaining;

}

public void CreateGroupRequest (string intCreatorUID, string gidReqType, string dtmPlanningOnDate, string strcomment, string intCount, string LocationID, bool Cyclic, bool Highest, int? ExecutorID)

{

int countReq = int. Parse (intCount);

for (int i = 0; i < countReq; i++)

{

string planDate = GetPlanningTime (int.Parse (intCreatorUID), false, Guid. Parse (gidReqType), int. Parse (LocationID), Highest, null);

CreateRequest (intCreatorUID, gidReqType, planDate, strcomment, «1», LocationID, false, Highest, null, false, ExecutorID);

public string GetPlanningTime (int CreatorID, bool ReqIsCycle, Guid ReqType, int LocationID, bool HighestPriority, int? ExecutorID)

{

Priorities PriorityEntity = SetRequestPriority (ReqIsCycle, CreatorID, HighestPriority);

int Priority = PriorityEntity. ID;

dc.Refresh (System.Data.Linq.RefreshMode.OverwriteCurrentValues, dc. WorkClassificator);

WorkClassificator Class = dc.WorkClassificator.Single (s => s. ID == ReqType);

int pause = 5;

int CurrentExecutor;

int TimeNeedToRequest = Class.PlanningTime.Value + (pause * 2);

UserContainer ExecutorContainer = !ExecutorID.HasValue? FindUser (ReqType, CreatorID, LocationID): UserList. SingleOrDefault (s => s. UserID == ExecutorID. Value);

List reversed;

if (ExecutorContainer ≠ null)

{

reversed = ExecutorContainer.ReqList.Where (r=>r.Priority<=Priority && r. CurrentStatus r.PlanningOnDate).ToList ();

CurrentExecutor = ExecutorContainer. UserID;

}

else

{

int OfflineExecutor = !ExecutorID.HasValue? FindExecutorByReqType (ReqType, CreatorID, LocationID): ExecutorID. Value;

reversed = (from r in dc. Request where r.PlanningOnDate.Date == DateTime.Now.Date && r. ExecutorID == OfflineExecutor && r. Priority <= Priority && r. CurrentStatus < Status. Excluded_StatusCode orderby r. PlanningOnDate select r).ToList ();

CurrentExecutor = OfflineExecutor;

}

int currentIndex=-1;

Request Next;

foreach (Request req in reversed)

{

currentIndex = reversed. IndexOf (req);

Next = reversed. ElementAtOrDefault (currentIndex + 1);

if (Next ≠ null)

{

if (Next.PlanningOnDate.TimeOfDay.Subtract (req.PlanningCompleteDate.Value.TimeOfDay).TotalMinutes >= TimeNeedToRequest)

{

//Ссли нашли ΠΎΠΊΠ½ΠΎ Ρ‚ΠΎ Π²Ρ‚Ρ‹ΠΊΠ°Π΅ΠΌ сюда.

if (DateTime.Now.CompareTo (req.PlanningCompleteDate.Value) > 0) continue;

return req.PlanningCompleteDate.Value.AddMinutes (Convert.ToDouble (pause)).ToString («dd MM yyyy HH: mm:ss»);

}

}

else

{

if (DateTime.Now.CompareTo (req.PlanningCompleteDate.Value) > 0)

{

return DateTime.Now.ToString («dd MM yyyy HH: mm:ss»);

}

else

{

return req.PlanningCompleteDate.Value.AddMinutes (Convert.ToDouble (pause)).ToString («dd MM yyyy HH: mm:ss»);

}

}

}

Request LastOpenedReq = dc.Request.Where (r => r. CurrentStatus <= Status. Opened_StatusCode && r.PlanningCompleteDate.HasValue && r. ExecutorID==CurrentExecutor).OrderByDescending (r=>r.PlanningCompleteDate).FirstOrDefault ();

if (LastOpenedReq ≠ null && DateTime.Now.CompareTo (LastOpenedReq.PlanningCompleteDate.Value) < 0)

{

return LastOpenedReq.PlanningCompleteDate.Value.AddMinutes (Convert.ToDouble (pause)).ToString («dd MM yyyy HH: mm:ss»);

}

else

{

return DateTime.Now.ToString («dd MM yyyy HH: mm:ss»);

}

}

//Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, поэтому Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π»ΠΈΡΡ‚Π΅, ΠΏΠΎΡ‚ΠΎΠΌ, Ссли Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ — Π² Π±Π°Π·Π΅

public bool ReopenRequest (int UID, Guid ReqID, string comment)

{

UserContainer Current = UserList. SingleOrDefault (s => s. UserID == UID);

Request ReqObj = dc.Request.Single (s => s. ReqID == ReqID);

ReqObj.Status = dc.Status.Single (s => s. ID == Status. WaitForResponse_StatusCode);

if (Current≠null)

{

ReqObj.PlanningOnDate = DateTime. Parse (GetPlanningTime (UID, ReqObj. IsCycle, ReqObj. Type, ReqObj.Executor.LocationID.Value, false, ReqObj. ExecutorID));

ReqObj.PlanningCompleteDate = ReqObj.PlanningOnDate.AddMinutes (Convert.ToDouble (ReqObj.PlanningTime));

int index = UserList. IndexOf (Current);

UserList[index]. ReqList. Sort (new RequestComparer ());

UserList[index]. IsReplanned= true;

}

try

{

dc.SubmitChanges ();

AddCommentToRequest (ReqID, ReqCommentTypes. Reopen_CommentType, comment, ReqObj. CreatorID);

return true;

}

catch

{

return false;

}

}

public bool CloseRequest (int UID, Guid ReqID, string comment="", int grade=0)

{

UserContainer Current = UserList. SingleOrDefault (s => s. UserID == UID);

Request ReqObj = dc.Request.Single (s => s. ReqID == ReqID);

ReqObj.CloseDate = DateTime. Now;

ReqObj.Status = dc.Status.Single (s => s. ID == Status. Closed_StatusCode);

ReqObj.grade = grade;

if (grade > 0 && grade < 3)

{

AddViolation (ReqObj.ReqID, Violations. BadGradeViolation);

}

try

{

dc.SubmitChanges ();

if (Current ≠ null)

{

int currindex = UserList. IndexOf (Current);

UserList[currindex]. IsReplanned = true;

UserList[currindex]. ReqList. Remove (ReqObj);

}

if (!string.IsNullOrEmpty (comment))

{

this.AddCommentToRequest (ReqObj.ReqID, ReqCommentTypes. UserClose_CommentType, comment, ReqObj. ExecutorID);

}

return true;

}

catch

{

return false;

}

}

public bool CancelRequest (int UID, Guid ReqID, string comment = «», int grade = 0)

{

UserContainer Current = UserList. SingleOrDefault (s => s. UserID == UID);

Request ReqObj = dc.Request.Single (s => s. ReqID == ReqID);

ReqObj.CloseDate = DateTime. Now;

ReqObj.Status = dc.Status.Single (s => s. ID == Status. Cancelled_StatusCode);

ReqObj.grade = grade;

if (grade > 0 && grade < 3)

{

AddViolation (ReqObj.ReqID, Violations. BadGradeViolation);

}

try

{

dc.SubmitChanges ();

if (Current ≠ null)

{

int currindex = UserList. IndexOf (Current);

UserList[currindex]. IsReplanned = true;

UserList[currindex]. ReqList. Remove (ReqObj);

}

if (!string.IsNullOrEmpty (comment))

{

this.AddCommentToRequest (ReqObj.ReqID, ReqCommentTypes. UserClose_CommentType, comment, ReqObj. ExecutorID);

}

return true;

}

catch

{

return false;

}

private void CheckForCyclicRequests ()

{

DateTime Now = DateTime. Now;

IEnumerable CRList = (from creq in dc. CyclicRequests

join req in dc. Request

on new { creq. CreatorID, creq. Type }

equals

new { req. CreatorID, req. Type }

where creq. BeginDateTime <= Now

&& creq. EndDate > Now

&& creq.BeginDateTime.TimeOfDay <= Now. TimeOfDay

&& creq. isActive==true

&& req. IsCycle==true

&& req.PlanningOnDate.Date == Now. Date

select creq);

List CycleList = (from c in dc. CyclicRequests where c. BeginDateTime <= Now && c. EndDate > Now && c. isActive == true select c).ToList ();

CycleList.RemoveAll (c => CRList. Contains (c));

bool AddToRequests;

string CombinedTime;

foreach (CyclicRequests CycleReq in CycleList)

{

AddToRequests=false;

switch (CycleReq.ScheduleType)

{

case Schedule. DailyScheduleType:

AddToRequests = true;

break;

case Schedule. WeeklyScheduleType:

if (CycleReq.RunDays.Contains (DateTime.Now.DayOfWeek.ToString ()))

{

AddToRequests = true;

}

break;

case Schedule. MonthlyScheduleType:

if (CycleReq.RunWeeks.Contains (Service.GetWeekOfMonth (DateTime.Now).ToString ()) && CycleReq.RunDays.Contains (DateTime.Now.DayOfWeek.ToString ()))

{

AddToRequests = true;

}

break;

}

if (AddToRequests)

{

string LocID = GetLocID (CycleReq.CreatorID).ToString ();

CombinedTime = DateTime.Now.ToString («dd MM yyyy «)+CycleReq.Time;

CreateRequest (CycleReq.CreatorID.ToString (), CycleReq.Type.ToString (), CombinedTime, CycleReq. comment, «1», LocID, true, false, null, false, null);

}

}

return;

public string Validate (string[] str)

{

return «» ;

public string CreateCycleRequest (string dtBeginDT, string dtEndDT, string intCrID, string comment, string gdType, string SchedType, string ReqTime, string RunDays=null, string RunWeeks=null)

{

int CreatorUID;

if (!int.TryParse (intCrID, out CreatorUID))

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ID ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€Π°» ;

}

Guid ReqType;

if (!Guid.TryParse (gdType, out ReqType))

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Ρ‚ΠΈΠΏ заявки» ;

}

if (ReqTime.Trim () == String. Empty)

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° ВрСмя Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ» ;

}

DateTime BeginDate;

if (!DateTime.TryParse (dtBeginDT, out BeginDate))

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π΄Π°Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° дСйствия заявки, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ: Π΄Π΄ ΠΌΠΌ Π³Π³Π³Π³ Ρ‡Ρ‡: ΠΌΠΌ» ;

DateTime EndDate;

if (!DateTime.TryParse (dtEndDT, out EndDate))

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° НС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π΄Π°Ρ‚Π° окончания дСйствия заявки, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ: Π΄Π΄ ΠΌΠΌ Π³Π³Π³Π³ Ρ‡Ρ‡: ΠΌΠΌ» ;

CyclicRequests CReq = new CyclicRequests { BeginDateTime = BeginDate, EndDate = EndDate, ID = Guid. NewGuid (), isActive = true, CreatorID = CreatorUID, RunDays = RunDays, Type = ReqType, comment = comment, Time=ReqTime, ScheduleType=SchedType, RunWeeks=RunWeeks };

try

{

dc.CyclicRequests.InsertOnSubmit (CReq);

dc.SubmitChanges ();

return «» ;

}

catch (Exception ex)

{

return «ΠžΡˆΠΈΠ±ΠΊΠ° Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ заявку «+ex.Message ;

}

}

public bool SetRequestCompleted (int Uid, Guid ReqID)

{

UserContainer Current = UserList. SingleOrDefault (c => c. UserID == Uid);

if (Current ≠ null)

{

int CurrIndex = UserList. IndexOf (Current);

Request RObj = dc.Request.SingleOrDefault (c => c. ReqID == ReqID);

if (RObj ≠ null)

{

RObj.Status = dc.Status.First (s => s. ID == Status. Completed_StatusCode);

RObj.CompleteDate = DateTime. Now;

if (RObj.PlanningCompleteDate.Value.CompareTo (RObj.CompleteDate) < 0)

{

AddViolation (RObj.ReqID, Violations. BreakTimeViolation);

}

try

{

dc.SubmitChanges ();//ΠŸΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ заявки ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π΅Π΅ ΠΈΠ· Π»ΠΈΡΡ‚Π° ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π±Π°Π·Ρƒ (сначала Π² Π±Π°Π·Ρƒ ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ)

UserList[CurrIndex]. IsReplanned = true;

UserList[CurrIndex]. PauseTimer. Start ();

CheckForCyclicRequests ();

UserList[CurrIndex]. ReqList. Sort (ReqComparer);

OTD Department = dc.OTD.SingleOrDefault (s => s. ID == RObj.WorkClassificator.DepartmentID);

long? AccEmailId = null;

if (Department ≠ null)

{

AccEmailId = Department. ID_EmailAccount;

}

UserContainer.NotificateUser (RObj.ExecutorID, RObj. CreatorID, «ΠžΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ заявки», «Π’Π°ΡˆΠ° заявка «+ RObj.WorkClassificator.TitleRow + «Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° исполнитСлСм «+ RObj.Executor.FIO + «. ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚Π΅ Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΈΠ½Ρ‚СрфСйсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ», AccEmailId);

UserList[CurrIndex]. ReqList. Remove (RObj);

return true;

}

catch

{

return false;

}

}

}

return false;

}

public void StartFirst (int id)

{

UserContainer Current = UserList. SingleOrDefault (c => c. UserID == id);

if (Current ≠ null)

{

int CurrIndex = UserList. IndexOf (Current);

UserList[CurrIndex]. PauseTimer. Stop ();

UserList[CurrIndex]. StartRequest ();

}

}

public IEnumerable GetUserRequests (int CreatorID)

{

List IReq = (from cr in dc. Request where cr. CreatorID == CreatorID && cr. CurrentStatus ≠ Status. Closed_StatusCode select cr).ToList ();

IReq.Sort (new RequestComparer ());

return IReq. AsEnumerable ();

}

private Priorities SetRequestPriority (bool isCycle, int CreatorID, bool HighestPriority)

{

if (!HighestPriority)

{

SOTRUD Creator = dc.SOTRUD.Single (s => s. ID == CreatorID);

dc.Refresh (System.Data.Linq.RefreshMode.OverwriteCurrentValues, Creator);

return Creator. Priorities;

}

else

{

return dc.Priorities.Single (e => e. ID == 1);

}

public void TransmitRequest (string RID, int FromUID, int ToUID, string comment, bool isOffline)

{

Request Current = dc.Request.SingleOrDefault (s => s. ReqID == Guid. Parse (RID));

if (Current ≠ null)

{

if (this.UserIsHere (FromUID))

{

int indexFrom = UserList. IndexOf (UserList.Single (u => u. UserID == FromUID));

UserContainer uc = UserList[indexFrom];

if (Current ≠ null && uc.ReqList.Contains (Current))

{

UserList[indexFrom]. ReqList. Remove (Current);

UserList[indexFrom]. ReqList. Sort (new RequestComparer ());

UserList[indexFrom]. IsReplanned = true;

}

}

AddCommentToRequest (Guid.Parse (RID), ReqCommentTypes. Redirect_CommentType, comment, FromUID);

if (Current.CurrentStatus ≠ Status. onRegistration_StatusCode)

{

Current.Status = dc.Status.Single (i => i. ID == Status. WaitingOpen_StatusCode);

Current.Executor = dc.SOTRUD.Single (s => s. ID == ToUID);

Current.PlanningOnDate = DateTime. Parse (GetPlanningTime (Current.CreatorID, Current. IsCycle, Current. Type, Current.Executor.LocationID.Value, false, ToUID));

dc.SubmitChanges ();

OTD Department = dc.OTD.SingleOrDefault (s => s. ID == Current.WorkClassificator.DepartmentID);

long? AccEmailId = null;

if (Department ≠ null)

{

AccEmailId = Department. ID_EmailAccount;

}

UserContainer.NotificateUser (Current.ExecutorID, Current. CreatorID, «ΠžΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ заявки», «Π’Π°ΡˆΠ° заявка «+ Current.WorkClassificator.TitleRow + «ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŽ. Π’Π°Ρˆ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ «+ Current.Executor.FIO + «. ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ врСмя закрытия — «+ Current.PlanningCompleteDate.Value.ToString (), AccEmailId);

UserContainer.NotificateUser (Current.CreatorID, Current. ExecutorID, «ΠžΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ заявки», «Π’Π°ΠΌ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° заявка «+ Current.WorkClassificator.TitleRow + «. Π˜Π½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ заявки «+ Current.Creator.FIO + «. ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ врСмя закрытия — «+ Current.PlanningCompleteDate.Value.ToString (), AccEmailId);

if (!isOffline)

{

int indexTo = UserList. IndexOf (UserList.Single (u => u. UserID == ToUID));

UserList[indexTo]. ReqList. Add (Current);

UserList[indexTo]. ReqList. Sort (new RequestComparer ());

UserList[indexTo]. IsReplanned = true;

}

}

}

public void EditPlanningTime (string RID, int UID, string NewTime, string comment)

{

int index = UserList. IndexOf (UserList.Single (u => u. UserID == UID));

DateTime NewT = DateTime. Parse (NewTime);

double MinutesToMove=0;

Request Current = UserList[index]. ReqList. Single (r => r. ReqID == Guid. Parse (RID));

int ReqIndex = UserList[index]. ReqList. IndexOf (Current);

AddCommentToRequest (Guid.Parse (RID), ReqCommentTypes. ChangeData_CommentType, comment, UID);

if (NewT.Date==DateTime.Now.Date)

{

MinutesToMove= NewT. Subtract (UserList[index]. ReqList[ReqIndex].PlanningCompleteDate.Value).TotalMinutes;

}

UserList[index]. ReqList[ReqIndex].PlanningCompleteDate = NewT;

UserList[index]. ReqList[ReqIndex].PlanningOnDate = UserList[index]. ReqList[ReqIndex].PlanningCompleteDate.Value.Subtract (new TimeSpan (0, Current. PlanningTime, 0));

//}

if (UserList[index]. ReqList[ReqIndex].CurrentStatus<=Status.Opened_StatusCode)

{

UserList[index]. ReqList[ReqIndex].Status = dc.Status.Single (s => s. ID == Status. WaitingOpen_StatusCode);

UserList[index]. ReqList. Sort (new RequestComparer ());

dc.SubmitChanges ();

ReqIndex = UserList[index]. ReqList. IndexOf (Current);

UserList[index]. MovePlanningCompleteTime (ReqIndex, MinutesToMove);

UserList[index]. IsReplanned = true;

AddViolation (Current.ReqID, Violations. ChangeTimeViolation);

private UserContainer FindUser (Guid TypeReq, int creatorID, int CreatorLocationID)

{

/*Если ΡŽΠ·Π΅Ρ€ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ — Π½Π°ΠΉΡ‚ΠΈ замСститСля, Ссли Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈΠ΄Π΅ΠΌ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΡ‚ΠΎΡ€Ρƒ

Если Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ = Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ -1*/

WorkClassificator ClassObj = dc.WorkClassificator.SingleOrDefault (r => r. ID == TypeReq && r.responsibleDolgID.HasValue);

UserContainer User = UserList. Find (r => (r.PositionID == ClassObj.responsibleDolgID.Value || ClassObj. SOTRUD_DOLG.MainPost.Count (a=>a.ID==r.PositionID)>0) && GetLocID (r.UserID)==CreatorLocationID);

if (User ≠ null)

{

return User;

}

else

User = UserList. Find (r => (r.PositionID == ClassObj.AssistantDolgID.Value

if (User ≠ null)

{

return User;

}

else

{

if (ClassObj.ParentUID.HasValue)

{

FindUser (ClassObj.ParentUID.Value, creatorID, CreatorLocationID);

}

}

if (User == null)

{

return UserList. SingleOrDefault (s => s. UserID == 104);

}

return User;

}

private int GetLocID (int id)

{

SOTRUD sotr = dc.SOTRUD.Single (s => s. ID == id);

if (sotr.LocationID.HasValue)

{

return sotr.LocationID.Value;

}

else

{

return 1;

}

}

public int FindExecutorByReqType (Guid TypeReq, int CreatorID, int CreatorLocationID)

{

WorkClassificator ClassObj = dc.WorkClassificator.Single (r => r. ID == TypeReq);

SOTRUD User = dc.SOTRUD.FirstOrDefault (r => (r.SOTRUD_DOLG.ID == ClassObj.responsibleDolgID.Value || ClassObj. SOTRUD_DOLG.MainPost.Contains (r.SOTRUD_DOLG)) && r. LocationID == CreatorLocationID && r. DATA_YVOL.HasValue == false);

if (User == null)

{

User = dc.SOTRUD.FirstOrDefault (r => (r.SOTRUD_DOLG.ID == ClassObj.AssistantDolgID.Value || ClassObj. SOTRUD_DOLG1.MainPost.Contains (r.SOTRUD_DOLG)) && r. LocationID == CreatorLocationID && r. DATA_YVOL.HasValue == false);

if (User == null)

{

return ClassObj.ParentUID.HasValue== true? FindExecutorByReqType (ClassObj.ParentUID.Value, CreatorID, CreatorLocationID): 104;

return User. ID;

public UserContainer GetUserContainer (int id)

{

UserContainer uc = UserList. SingleOrDefault (u => u. UserID == id);

if (uc ≠ null)

{

uc.ReqList.Sort (ReqComparer);

}

return uc;

}

public bool UserIsHere (int id)

{

return (UserList.Find (f => f. UserID == id) ≠ null);

}

public List GetActiveUsers ()

{

try

List ul = UserList. ConvertAll (new Converter (ContainerToUser));

return ul;

}

catch

{

List ul = UserList. ConvertAll (new Converter (ContainerToUser));

return ul;

}

private void SetHighestPriority (Request Req, UserContainer user)

{

//Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΡΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ == 1

if (user.ReqList.Contains (Req) && !Req.PlannedRequest)

{

Req.Priorities = dc.Priorities.SingleOrDefault (p => p. ID == 1);

Request LastOpen = user.ReqList.FindLast (e=>e.CurrentStatus==Status.Opened_StatusCode);

if (LastOpen ≠ null)

{

Req.PlanningOnDate = LastOpen.PlanningCompleteDate.Value;

}

else

{

Req.PlanningOnDate = DateTime. Now;

}

Req.PlanningCompleteDate = Req.PlanningOnDate.AddMinutes (Req.PlanningTime);

dc.SubmitChanges ();

user.ReqList.Sort (ReqComparer);

user.ReplanAll (user.ReqList.IndexOf (Req) + 1, Req.PlanningCompleteDate.Value);

}

//ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ врСмя Π² ΡΠΎΠΎΡ‚вСтствии с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ

}

private void MoveUp (Request Req, UserContainer user)

{

if (user.ReqList.Contains (Req) && !Req.PlannedRequest)

{

int CurrentIndex = user.ReqList.IndexOf (Req);

if (CurrentIndex > 0)

{

Req.PlanningOnDate = user. ReqList[CurrentIndex — 1]. PlanningOnDate;

Req.PlanningCompleteDate = Req.PlanningOnDate.AddMinutes (Req.PlanningTime);

user.ReqList[CurrentIndex — 1]. PlanningOnDate = Req.PlanningCompleteDate.Value.AddMinutes (5);

user.ReqList[CurrentIndex — 1]. PlanningCompleteDate=user.ReqList[CurrentIndex — 1]. PlanningOnDate. AddMinutes (user.ReqList[CurrentIndex — 1]. PlanningTime);

}

private void MoveDown (Request Req, UserContainer user)

{

if (user.ReqList.Contains (Req) && !Req.PlannedRequest)

int CurrentIndex = user.ReqList.IndexOf (Req);

if (CurrentIndex < user.ReqList.Count-1)

{

Req.PlanningOnDate = user. ReqList[CurrentIndex + 1]. PlanningOnDate;

Req.PlanningCompleteDate = Req.PlanningOnDate.AddMinutes (Req.PlanningTime);

user.ReqList[CurrentIndex + 1]. PlanningCompleteDate = Req.PlanningOnDate.AddMinutes (-5);

user.ReqList[CurrentIndex + 1]. PlanningOnDate = user. ReqList[CurrentIndex + 1]. PlanningCompleteDate.Value.AddMinutes (user.ReqList[CurrentIndex + 1]. PlanningTime * -1);

public void ManagerContextAction (string ActCode, string ReqID)

{

Guid gReqID;

if (Guid.TryParse (ReqID, out gReqID))

{

Request Req = dc.Request.SingleOrDefault (s => s. ReqID == gReqID);

if (Req ≠ null)

{

UserContainer container = UserList. SingleOrDefault (s => s. UserID == Req. ExecutorID);

if ((Req.CurrentStatus < Status. Completed_StatusCode) && container≠null)

{

switch (ActCode)

{

case ContextAction. SetHighestPriority:

SetHighestPriority (Req, container);

break;

case ContextAction. MoveUp:

MoveUp (Req, container);

break;

case ContextAction. MoveDown:

MoveDown (Req, container);

break;

case ContextAction. IncludeToQueue:

IncludeToQueue (Req, container);

break;

case ContextAction. ExcludeFromQueue:

ExcludeFromQueue (Req, container);

break;

case ContextAction. CloseRequest:

SetRequestCompleted (container.UserID, Req. ReqID);

break;

default:

break;

}

try

{

dc.SubmitChanges ();

container.IsReplanned = true;

container.ReqList.Sort (ReqComparer);

}

catch

{

}

}

}

}

}

private void ExcludeFromQueue (Request Req, UserContainer container)

{

Req.Status = dc.Status.Single (s => s. ID == Status. Excluded_StatusCode);

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ