Разработка 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
...Подобные документы
Разработка и внедрение автоматизированной информационной системы (АИС) работы с клиентами туристической фирмы (приема и обработки заявок). Технико-экономическая оценка туристического агентства, алгоритм и схема интерфейса программного обеспечения его АИС.
дипломная работа [4,0 M], добавлен 21.07.2011Создание автоматизированной системы обработки заявок пользователей. Анализ требований к информационному, техническому и программному обеспечению. Проектирование интерфейса системы. Выбор средств реализации. Модель базы данных системы обработки заявок.
курсовая работа [1,6 M], добавлен 22.12.2014Развитие глобальной сети Интернет. Средства разработки web-сайта. Основные возможности CMS "Joomla", ее достоинства и недостатки, особенности, основные принципы и способы работы с данной системой управления контентом. Help Desk как система заявок.
курсовая работа [213,1 K], добавлен 06.01.2015Разработка базы данных учета и хранения заявок пользователя. Создание программного средства на основе клиент/серверной технологии. Описание возможностей платформы Tandem Framework. Апробация программы автоматизации процессов подачи и обработки заявок.
дипломная работа [3,6 M], добавлен 08.03.2013Автоматизированные системы учета и обработки заявок от пользователей. Функциональное проектирование и моделирование системы учета. Проектирование базы данных, алгоритм работы системы и ее программная реализация. Технико-экономическое обоснование проекта.
дипломная работа [1,6 M], добавлен 05.04.2014Проектирование базы данных системы принятия, обработки и учёта заявок в отдел информационных технологий; разработка инфологической и даталогической моделей, реализация физической модели. Создание приложений для визуализации работы с базой данных.
дипломная работа [2,8 M], добавлен 25.01.2013Определение иерархии системы управления и контроля, а также структуры АСКУЭ. Разработка программного модуля обработки данных счётчиков электроэнергии. Определение технико-экономической актуальности, необходимости и возможности модернизации системы.
дипломная работа [1,0 M], добавлен 20.05.2017Программное проектирование модуля автоматического приема платежей в составе комплекса электронной торговли по продаже товаров с физической доставкой, организованного на базе SQL-базы данных с использованием cgi-технологии генерации динамических страниц.
дипломная работа [1,9 M], добавлен 16.12.2012Описание общих закономерностей функционирования организации. Изучение структуры предприятия, определение функций его подразделений и основных бизнес процессов. Разработка клиент-серверной системы по автоматизации получения и обработки заявок от абонентов.
курсовая работа [1,8 M], добавлен 02.10.2011Разработка методов повышение прибыльности бизнеса, путем решения проблем отдела продаж в процессе обработки заказов клиентов с помощью информационных технологий, что предполагает разработку модуля для автоматизированной обработки заказов клиентов.
дипломная работа [4,0 M], добавлен 06.12.2013Технология приема и учета обращений граждан в организации. Особенности разработки автоматизированной информационной системы регистрации заявок на услуги муниципальной организации. Использование разработанной АИС в различных предприятиях сферы ЖКХ.
дипломная работа [3,3 M], добавлен 30.09.2013Проектирование систем обработки данных для заданных объектов управления, автоматизированных систем разного назначения. Разработка автоматизированной системы приема заказов организации. Модель бизнес-процесса. Основные алгоритмы работы программы.
курсовая работа [910,8 K], добавлен 25.05.2015Определение комплекса задач для автоматизации бизнес-процессов отдела по работе с клиентами и склада ООО "ЖилРемСтрой". Выбор стратегии автоматизации и формализация программной задачи. Разработка программного модуля в среде 1C, его тестирование, отладка.
дипломная работа [3,2 M], добавлен 28.01.2013Разработка автоматизированной информационной системы учета заявок сотрудников на обслуживание компьютерной, офисной и торговой техники в ООО "Платина". Проектирование информационных процессов с помощью средства BPWin в офисном приложении Access.
дипломная работа [2,5 M], добавлен 02.02.2016Создание совершенной автоматизированной системы формирования, учета и фиксирования выполнения заявок. Формализация задачи, построение структуры таблиц для хранения информации, схемы их взаимосвязей и описания алгоритмов обработки. Описание алгоритма.
курсовая работа [2,2 M], добавлен 30.06.2014Разработка модуля для вычисления значения функции, который впоследствии подключается к программе ввода исходных данных с контролем допусимого значения в таблицу. Проектирование модуля для работы со строками и для обработки массивов текстовой информации.
курсовая работа [17,8 K], добавлен 24.09.2010Разработка СУБД - программного модуля для систематизации, хранения и обработки сведений о работниках лаборатории. Технологический процесс машинной реализации задачи, составление алгоритма, описание переменных процедур и функций. Листинг программы.
курсовая работа [1,7 M], добавлен 11.01.2013Электронная система, реализующая сложный алгоритм обработки данных. Общая структура устройства управления. Проектирование процессорного модуля. Основные операционные элементы. Общие вопросы функционирования устройств управления с программируемой логикой.
курсовая работа [1,3 M], добавлен 29.06.2011Методика разработки программного модуля для нахождения методом хорд корня уравнения x3-x-0,3=0 с точностью до 0,001 на языке программирования Visual Basic for Application. Схема программного модуля и описание процедуры обработки кнопки "Найти корни".
курсовая работа [394,0 K], добавлен 08.09.2010Освоение методов манипуляции параметрами SVG изображений при помощи JavaScript и возможности по анимации в современных браузерах. Интерфейс и структура модуля визуализации данных. Определение аномальных данных и их определение, реализованные типы.
курсовая работа [1,7 M], добавлен 20.05.2014