Разработка CRM модуля приема и обработки заявок сотрудников и учащихся НИУ ВШЭ

Организация работы системы управления взаимоотношениями с клиентами. Функциональные возможности MS Sharepoint 2010 для создания CRM модуля приема и обработки заявок. Описание и алгоритмизация бизнес-процессов CRM модуля приема и обработки заявок.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 06.07.2016
Размер файла 4,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Файл для поиска возможного решения отправляется в базу данных лишь для одноразовых заявок, так как периодические и многоразовые заявки по своему определению подразумевают наличие какого-либо готового решения.

Существует определенный формат передаваемых в общую папку файлов. Так, CRM модуль должен передавать файлы следующего содержания:

· "0 | Идентификатор заявки | Описание технической проблемы".

· "1 | Описание технической проблемы пользователя | Решение технической проблемы пользователя |0 или 1".

Первая цифра определяет операцию, которую база данных должна будет выполнить. То есть, "0" подразумевает операцию поиска возможного решения по проблеме, а "1" - добавление новой записи в базу данных. При этом, в первом случае файл будет называться "Search" + "Идентификатор заявки", а во втором - "AddToDB" + "Идентификатор заявки". Во втором случае последним элементом строки файла может быть либо "0" либо "1", "0" означает, что для данного решения требуется участие дежурного инженера, а "1" - что оно не требуется.

База данных после проведения операции поиска возможного решения должна передавать в общую папку файлы следующего содержания:

· "Идентификатор заявки|1".

· "Идентификатор заявки|0|0 или 1|Решение технической проблемы пользователя".

В данном случае, вторая цифра определяет, найдено ли какое-либо решение по заданной технической проблеме, "0" означает, что решение найдено, "1" - что оно не найдено. Во втором случае третьим элементом строки файла может быть либо "0" либо "1", "0" означает, что для данного решения требуется участие дежурного инженера, а "1" - что оно не требуется.

4.4 Требования к обеспечению

4.4.1 Требования к информационному обеспечению модуля

Хранение и организация данных в модуле должны осуществляться средствами списков MS Sharepoint и MS SQL Server. Обеспечение целостности данных должно быть достигнуто за счет встроенных средств Sharepoint.

Доступ к данным должен предоставляться только авторизованным пользователям с учетом их роли в системе.

4.4.2 Требования к лингвистическому обеспечению модуля

Пользовательский интерфейс модуля должен быть реализован на русском языке. При составлении технической документации возможно использование англоязычных терминов и понятий.

4.4.3 Требования к программному обеспечению системы

Основной средой разработки должна быть платформа MS Sharepoint 2010. Дополнительно для разработки могут быть использованы средства платформ MS Visual Studio 2010 и MS Sharepoint Designer 2010. Для создания форм кроме стандартных средств MS Sharepoint 2010 можно использовать MS Infopath 2010.

При этом не должно использоваться никаких компонентов, требующих дополнительной установки программного обеспечения у пользователя.

Пользователи системы должны иметь доступ к ней с совместимых браузеров согласно перечню производителя.

4.4.4 Требования к техническому обеспечению

Для ведения разработки и поддержки системы должны быть доступны следующие сервера:

· Web-сервер, отвечающий за взаимодействие с веб-приложениями и информационными ресурсами в сети Интернет.

· Сервер приложений.

· Сервер баз данных.

Минимальные требования к техническим характеристикам односерверной фермы:

· Процессор - 2 х 3 ГГц.

· Объем оперативной памяти - не менее 2 Гб.

· Объем жесткого диска - не менее 120 Гб.

· Сетевая карта - с поддержкой скорости не менее 1 Гбит/сек.

Возможны различные варианты конечного развертывания системы, начиная от использования односерверной фермы, где один сервер выполняет все роли, до использования многосерверной фермы, где каждый сервер в ферме выполняет соответствующую роль.

Минимальные требования к техническим характеристикам пользовательского компьютера:

· Наличие браузера, совместимого с MS Sharepoint 2010 согласно перечню производителя.

5. Требования к документации

Для модуля должна быть сформирована следующая документация:

1. Описание работы системы.

2. Руководство пользователя.

3. Руководство дежурного инженера.

4. Руководство разработчика.

Приложение В. Исходные коды

Листинг B.1. Обработчик событий Sharepoint: ItemAddedReceiver

public class ItemAddedReceiver : SPItemEventReceiver

{

public override void ItemAdded(SPItemEventProperties properties)

{

base.ItemAdded(properties);

base.EventFiringEnabled = false;

if (properties.List.ToString() == "Список заявок")

{

SPListItem item = properties.ListItem;

if (Convert.ToString(item["Period"]) != "Нет")

{

item["RequestType"] = "Периодическая";

item["PeriodDate"] = DateTime.Today;

item["sendToWfms"] = true;

base.EventFiringEnabled = true;

item.Update();

System.Threading.Thread.Sleep(10000);

base.EventFiringEnabled = false;

var go = Convert.ToDateTime(item["PeriodDate"]);

var frequency = Convert.ToString(item["Period"]);

switch (frequency)

{

case "День":

item["PeriodDate"] = go.AddDays(1);

item.Update();

break;

case "Неделя":

item["PeriodDate"] = go.AddDays(7);

item.Update();

break;

case "Месяц":

item["PeriodDate"] = go.AddMonths(1);

item.Update();

break;

case "Квартал":

item["PeriodDate"] = go.AddMonths(3);

item.Update();

break;

case "Полугодие":

item["PeriodDate"] = go.AddMonths(6);

item.Update();

break;

case "Год":

item["PeriodDate"] = go.AddYears(1);

item.Update();

break;

}

}

if ((Convert.ToString(item["RequestType"]) == "Многоразовая") && (Convert.ToString(item["RequestFromConstant"]) == ""))

{

item["SolvedUserReaction"] = "Проблема решена";

item["CurrentStat"] = "Готово дежурное решение";

item.Update();

}

}

base.EventFiringEnabled = true;

}

}

Листинг B.2. Обработчик событий Sharepoint: ItemUpdatedReceiver

public class ItemUpdatedReceiver : SPItemEventReceiver

{

public void exchange(string fileContents, SPWeb web, SPListItem request)

{

MemoryStream ms = new MemoryStream();

SPList docLib = web.Lists["Exchange"];

SPListItem docDestination = null;

for (int i = 0; i < docLib.Folders.Count; i++)

if (docLib.Folders[i].Folder.Name == "Export")

docDestination = docLib.Folders[i];

SPFolder destRoot = web.GetFolder(docDestination.Folder.ServerRelativeUrl);

SPFileCollection flColl = destRoot.Files;

string destFile = null;

string path = null;

if (fileContents[0] == '0')

{

destFile = flColl.Folder.Url + "/Search" + request["id"].ToString() + ".txt";

path = @"//kafitb-09$\Exchange\Export\Search" + request["id"].ToString() + ".txt";

}

else

{

destFile = flColl.Folder.Url + "/AddToDB" + request["id"].ToString() + ".txt";

path = @"//kafitb-09$\Exchange\Export\AddToDB" + request["id"].ToString() + ".txt";

}

StreamWriter w;

w = File.CreateText(path);

w.WriteLine(fileContents);

w.Flush();

w.Close();

request["sendToExchange"] = false;

request.Update();

}

public override void ItemUpdated(SPItemEventProperties properties)

{

base.ItemUpdated(properties);

base.EventFiringEnabled = false;

SPList list = properties.List;

if (properties.List.ToString() == "Список заявок")

{

SPListItem request = properties.ListItem;

SPSite site = properties.OpenSite();

SPWeb web = site.OpenWeb();

bool sendToExchange = Convert.ToBoolean(request["sendToExchange"]);

bool problemSolved = Convert.ToBoolean(request["ProblemSolved"]);

if ((sendToExchange) && (!problemSolved))

{

string fileContents = "0|" + request["id"].ToString() +

"|" + request["ProblemDescription"].ToString();

exchange(fileContents, web, request);

}

if ((sendToExchange) && (problemSolved))

{

string needWorker = null;

if (Convert.ToBoolean(request["NeedWorker"])) needWorker = "0";

else needWorker = "1";

string fileContents = "1|" + request["ProblemDescription"].ToString() + "|"

+ request["Solution"].ToString() + "|" + needWorker;

exchange(fileContents, web, request);

}

string reqType = Convert.ToString(request["RequestType"]);

string reqFromConst = Convert.ToString(request["RequestFromConstant"]);

string reqFrom = Convert.ToString(request["RequestFrom"]);

if ((reqType == "Многоразовая") && (reqFromConst == "") && (reqFrom != ""))

{

SPListItem newItem = list.Items.Add();

newItem["Title"] = request["Title"];

newItem["SolvedUserReaction"] = "В разработке";

newItem["ProblemDescription"] = request["ProblemDescription"];

newItem["Solution"] = request["Solution"];

newItem["NeedWorker"] = request["NeedWorker"];

newItem["RequestType"] = request["RequestType"];

newItem["RequestStatus"] = "Актуальная";

newItem["RequestFrom"] = request["RequestFrom"];

newItem["RequestFromConstant"] = request["RequestFrom"];

newItem["CurrentStat"] = request["CurrentStat"];

//newItem["id"] = newItem["ID"]; //НЕ ПРИСВАИВАЕТ АЙДИШНИК!!

base.EventFiringEnabled = true;

newItem.Update();

System.Threading.Thread.Sleep(10000);

base.EventFiringEnabled = false;

if (Convert.ToBoolean(request["NeedWorker"]))

{

SPList wfm = web.Lists["Общий список модулей"];

SPListItem newComItem = wfm.Items.Add();

newComItem["Название"] = "РАБОТАЙ";

newComItem["ProblemDescription"] = request["ProblemDescription"];

newComItem["Request"] = newItem["id"];

newComItem["request_id"] = newItem["id"];

newComItem["Solution"] = request["Solution"];

newComItem["NeedWorker"] = request["NeedWorker"];

newComItem.Update();

}

else

{

newItem["SendNotificationToUser"] = true;

base.EventFiringEnabled = true;

newItem.Update();

base.EventFiringEnabled = false;

}

request["RequestFrom"] = null;

request.Update();

}

}

base.EventFiringEnabled = true;

}

}

Листинг B.3. Обработчик событий Sharepoint: AddedImportFile

public class AddedImportFile : SPItemEventReceiver

{

public override void ItemAdded(SPItemEventProperties properties)

{

base.ItemAdded(properties);

base.EventFiringEnabled = false;

SPListItem listItem = properties.ListItem;

SPSite site = properties.OpenSite();

SPWeb web = site.OpenWeb();

SPFolder docFolder = web.GetFolder(listItem.Url).ParentFolder;

if (docFolder.Name == "Import")

{

string path = @"//kafitb-09\Exchange\Import\" + listItem.Name;

string contents = File.ReadAllText(path);

string[] strArr = contents.Split('|');

int id = 0;

bool buf = Int32.TryParse(strArr[0], out id);

int solPrep = 0;

buf = Int32.TryParse(strArr[1], out solPrep); //0-есть решение, 1-нет решения

SPList requests = web.Lists["Список заявок"];

SPListItemCollection requestsCollection = requests.Items;

var selectRequest = requestsCollection.Cast<SPListItem>().Where(x => (Convert.ToInt32(x["id"]) == 1)).ToList();

SPListItem request = selectRequest.First();

if (solPrep == 1)

{

request["sendToWfms"] = true;

request["SendNotificationToUser"] = false;

base.EventFiringEnabled = true;

request.Update();

System.Threading.Thread.Sleep(10000);

base.EventFiringEnabled = false;

}

if (solPrep == 0)

{

if (strArr[2] == "1") request["NeedWorker"] = false;

else

{

request["NeedWorker"] = true;

SPList comModules = web.Lists["Общий список модулей"];

SPListItem newItem = comModules.Items.Add();

newItem["request_id"] = id;

newItem["Solution"] = strArr[3];

newItem["NeedWorker"] = true;

newItem["Request"] = request;

newItem.Update();

}

request["Solution"] = strArr[3];

request["SendNotificationToUser"] = true;

base.EventFiringEnabled = true;

request.Update();

System.Threading.Thread.Sleep(10000);

base.EventFiringEnabled = false;

}

listItem.Delete();

}

base.EventFiringEnabled = true;

}

}

Листинг B.4. Таймер Sharepoint: ListTimerJob

class ListTimerJob : SPJobDefinition

{

public ListTimerJob()

{

}

public ListTimerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType) : base(jobName, service, server, targetType)

{ }

public ListTimerJob(string jobName, SPWebApplication webApplication)

: base(jobName, webApplication, null, SPJobLockType.Job)

{

Title = jobName;

}

public override void Execute(Guid contentDbId)

{

SPWebApplication webapp = this.Parent as SPWebApplication;

if (!Properties.Contains("ursSiteUrl")) throw new ApplicationException("Site url not found in properties.");

string siteUrl = this.Properties["ursSiteUrl"].ToString();

SPSite site = new SPSite(siteUrl);

SPWeb web = site.OpenWeb();

SPList requests = web.Lists["Список заявок"];

SPListItemCollection requestsCollection = requests.Items;

var PeriodicRequests = requestsCollection.Cast<SPListItem>().Where(x =>((Convert.ToString(x["RequestType"]) == "Периодическая"))).ToList();

foreach (SPListItem item in PeriodicRequests)

{

var go = Convert.ToDateTime(item["PeriodDate"]);

bool cancel = Convert.ToBoolean(item["Cancel"]);

if ((go == DateTime.Today)&&(cancel==false))

{

item["SolvedUserReaction"] = "В разработке";

item["ProblemSolved"] = false;

item["RequestStatus"] = "Актуальная";

item["CurrentStatus"] = "В обработке";

item.Update();

var frequency = Convert.ToString(item["Period"]);

switch (frequency)

{

case "День":

item["PeriodDate"] = go.AddDays(1);

item.Update();

break;

case "Неделя":

item["PeriodDate"] = go.AddDays(7);

item.Update();

break;

case "Месяц":

item["PeriodDate"] = go.AddMonths(1);

item.Update();

break;

case "Квартал":

item["PeriodDate"] = go.AddMonths(3);

item.Update();

break;

case "Полугодие":

item["PeriodDate"] = go.AddMonths(6);

item.Update();

break;

case "Год":

item["PeriodDate"] = go.AddYears(1);

item.Update();

break;

}

if (Convert.ToBoolean(item["NeedWorker"]))

{

SPList wfm = web.Lists["Общий список модулей"];

SPListItem newItem = wfm.Items.Add();

newItem["Название"] = "РАБОТАЙ";

newItem["ProblemDescription"] = item["ProblemDescription"];

newItem["Request"] = item["id"];

newItem["request_id"] = item["id"];

newItem["Solution"] = item["Solution"];

newItem["NeedWorker"] = item["NeedWorker"];

newItem.Update();

}

else

{

item["SendNotificationToUser"] = true;

item.Update();

SPWorkflowAssociation workflowAssociation = requests.WorkflowAssociations.GetAssociationByName("Изменение элемента списка заявок",

System.Threading.Thread.CurrentThread.CurrentCulture);

item.Web.Site.WorkflowManager.StartWorkflow(item, workflowAssociation, workflowAssociation.AssociationData);

}}

}}

}

Листинг B.5. Обработчик событий таймера Sharepoint: JobDefinition.EventReceiver

public class JobDefinitionEventReceiver : SPFeatureReceiver

{

private const string ListJobName = "CRM daily";

public override void FeatureActivated(SPFeatureReceiverProperties properties)

{

SPSecurity.RunWithElevatedPrivileges(delegate()

{

var web = properties.Feature.Parent as SPWebApplication;

DeleteJob(web);

var timerJob = new ListTimerJob(ListJobName, web);

timerJob.Properties.Add("ursSiteUrl", web.Sites[0].Url);

timerJob.Schedule = new SPDailySchedule { BeginHour = 5, BeginMinute = 0, EndHour = 5, EndMinute = 59 };

timerJob.Update();

});

}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)

{

var web = properties.Feature.Parent as SPWebApplication;

DeleteJob(web);

}

private static void DeleteJob(SPWebApplication web)

{

foreach (var job in web.JobDefinitions.Where(job => job.Name == ListJobName))

{

job.Delete();

}

}

}

Листинг B.6. Веб часть Sharepoint: UserRedirect

namespace CRM_module.UserRedirect

{

[ToolboxItemAttribute(false)]

public class UserRedirect : WebPart

{

private const string allowedGroup = "Help Desk";

private const string redirectRelativeUrl = "/Lists/List/HelpDeskNewForm.aspx";

[Category("Настройки")]

[WebBrowsable(true)]

[WebDisplayName("Список групп пользователей с доступом")]

[WebDescription("Введите имена групп")]

[Personalizable(PersonalizationScope.Shared)]

public string AllowedGroup

{ get; set; }

[Category("Настройки")]

[WebBrowsable(true)]

[WebDisplayName("Ссылка редиректа")]

[WebDescription("Введите относительную ссылку страницы")]

[Personalizable(PersonalizationScope.Shared)]

public string RedirectRelativeUrl

{ get; set; }

protected override void CreateChildControls()

{

base.CreateChildControls();

}

protected override void OnLoad (EventArgs e)

{

base.OnLoad(e);

if (String.IsNullOrEmpty(this.AllowedGroup)) this.AllowedGroup = allowedGroup;

if (String.IsNullOrEmpty(this.RedirectRelativeUrl)) this.RedirectRelativeUrl = redirectRelativeUrl;

SPWeb web = SPContext.Current.Web;

if (IsUserMemberOfGroup(web.CurrentUser, this.AllowedGroup))

{

string url = this.RedirectRelativeUrl;

string edit = this.RedirectRelativeUrl.Split('/')[3].Split('.')[0];

if(edit.Contains("Edit"))

{

string id = SPContext.Current.ListItem["id"].ToString();

url = this.RedirectRelativeUrl + "?ID=" + id + "&IsDlg=1";

}

SPUtility.Redirect(url, SPRedirectFlags.Default, HttpContext.Current);

}

}

public static bool IsUserMemberOfGroup(SPUser user, string groupName)

{

bool result = false;

if (!String.IsNullOrEmpty(groupName) && user != null)

{

foreach (SPGroup group in user.Groups)

{

if (group.Name == groupName)

{

// found it

result = true;

break;

}

}

}

return result;

}

}

}

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.