using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using ModelData.WebModel;
using Tools.Word;
namespace web_map.Controllers
{
public class MapController : BaseController
{
// GET: Map
public ActionResult Map()
{
return View();
}
public FileResult ExportInfo(string data, string type)
{
//WebDataManager webData = WebDataManager.Get();
// Я так и не успел реализовать возможность экспорта в формат эксель поэтому тут просто создается ворд файл
// параметр type принимает два занчения: "word" или "excel"
// для создания ворд файла используется бибилотека DocX
// для создания эксель файла подключена библиотека EPPlus, которая не используется
// созданием документа занимается DocXWrite из пространства имен Tools.Word проекта Tools
// рекомендую создать там пространство имен Tools.Excel , какой-либо соотвествующий класс
// и реализовать вывод данных в эксель формат
//
// переменная inputList содержит список всех переданных url основных поселений которые нужно экспортировать
// для большей ионфорации рекомендую просмотреть класс DocXWrite
var inputList = data.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList<string>();
var infoList = new List<ModelData.BusinessModel.MainEntities.Settlement>(inputList.Count);
WebDataManager webData = WebDataManager.Get();
foreach (var item in inputList)
infoList.Add(webData.GetSettlement(item));
DocXWrite.PrintDocX(infoList, out MemoryStream mr);
string file_name = "info.docx";
return File(mr, System.Net.Mime.MediaTypeNames.Application.Octet, file_name);
}
[HttpPost]
public JsonResult ImportForm(string formData, string type)
{
string result = "";
if (User.Identity.IsAuthenticated)
{
WebDataManager webData = WebDataManager.Get();
var inputArray = formData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> form = new Dictionary<string, string>();
string key, value;
foreach (var elem in inputArray)
{
key = elem.Split('~')[0];
value = elem.Split('~')[1];
if (value == "null" || value == null)
value = "";
form.Add(key, value);
}
// Здесь параметр type указывает, нужно создать/изменить информацию об измененном или основном поселении
// параметр принимает два значения: "origin-import" - основное поселение ИЛИ "edited-import" - измененное поселение
// параметр formData содержит переданные из формы значения, которые уникальны для каждого из двух типов
//
// в результате в переменную form запишутся все распарсенные значения, полученные с формы
//
// дальше, в зависимости от типа, нужно произвести проверку на наличие сущностей в онтологии (sparql запрос ask), добавить или удалить+добавить сведения в онтологию
// придется воспользоваться запросом на получения крайнего числа в url записи изменных поселений этот запрос выглядит вот так:
//SELECT (MAX(?value) AS ?maxValue)
//WHERE
//{
// ?editedSettlement a map: EditedSettlement.
// BIND(str(?editedSettlement) as ? str)
// BIND(xsd: int(SUBSTR(?str, strlen(?str) - 3, 4)) as ? value)
//}
// полученное число - крайнее для всех изменных поселений поэтому для нового изменного поселения нужно сделать +1
// вид url для изменных поселений такой: ИмяОсновногоПоселенияXXXX, где XXXX - число от 0000 до 9999 которое значит сквозную нумерацию всех изменных поселений (вопросы к разработчику онтологии)
// например: Saratov0023 Saratov0178 Sergeevka1234
//
// если нужно добавить новое основное поселение придется прибегнуть к генерации URL.
// в переданной форме будет название поселения, которое преобразуем транслитерацией в url.
// модуль транслитерации находится в проекте Tools в пространстве имен Tools. обращение такое: Tools.Translit.TranslitFromRussian(строка)
// создаем url такого вида: Название_Название+координаты без точек_origin
// название берем из транслитерации, координаты записываем без точек просто подряд цифры в последовательность long,lat (долгота, широта)
// потом нижнее подчеркивание _ и приписка origin
// например: Kaluga_Kaluga4716670951371835_origin где lat = 51.371835 long = 47.166709
// все преобразования url, проверки ask и тд. лучше делать в BusinessDataManager, т.е. перекинуть полученные данные в WebDataManager, оттуда в Business, там сформировать полный набор параметров
// параметры передать в RDFQuery, составить запрос в Queries, получить ответ от точки доступа и передать ответ сюда
// ответ распарсить и отправить клиенту в переменной result
// Я ВСЕ ЭТО СПРОЕКТИРОВАЛ, НО СЛЕГКА НЕ ХВАТИЛО ВРЕМЕНИ ДЛЯ РЕАЛИЗАЦИИ (12.06.2019), желаю удачи если кто-то это будет доделывать
result = "Success";
//result = "Failure|ErrorMessage";
}
else
result = "Failure|Пользователь не авторизован.";
return Json(result, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public JsonResult DeleteSettlement(string type, string url)
{
string result = "";
if (User.Identity.IsAuthenticated)
{
// Здесь примерно такие же проблемы, как описанные выше, поэтому можно читать там
// Удаление не реализовано, но вся его суть - сформировать sparql запрос, получить ответ и отправить ответ на клиентскую часть
WebDataManager webData = WebDataManager.Get();
if (new Random().Next(2) == 0)
{
result = "Success";
}
else
{
result = "Failure|ErrorMessage";
}
}
else
result = "Failure|Пользователь не авторизован.";
return Json(result, JsonRequestBehavior.AllowGet);
}
[HttpGet]
public JsonResult GetAllOfType(string type)
{
WebDataManager webData = WebDataManager.Get();
if (type == "type")
{
return Json(webData.GetAllSettlementTypes(), JsonRequestBehavior.AllowGet);
}
else if (type == "region")
{
return Json(webData.GetAllRegions(), JsonRequestBehavior.AllowGet);
}
else
return Json(""/*webData.GetSettlementsNames(type)*/, JsonRequestBehavior.AllowGet);
}
}
}