SiteController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. using DevExpress.Utils;
  2. using DevExpress.Web;
  3. using DevExpress.Web.ASPxThemes;
  4. using DevExpress.Web.Mvc;
  5. using DevExpress.XtraPrinting;
  6. using GreenTree.Nachtragsmanagement.Core.Authentication;
  7. using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
  8. using GreenTree.Nachtragsmanagement.Core.Domain.User;
  9. using GreenTree.Nachtragsmanagement.Services.Appendix;
  10. using GreenTree.Nachtragsmanagement.Services.Deviation;
  11. using GreenTree.Nachtragsmanagement.Services.Logging;
  12. using GreenTree.Nachtragsmanagement.Services.Site;
  13. using GreenTree.Nachtragsmanagement.Services.User;
  14. using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
  15. using GreenTree.Nachtragsmanagement.Web.Models.Global;
  16. using GreenTree.Nachtragsmanagement.Web.Models.Site;
  17. using Newtonsoft.Json;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Web;
  23. using System.Web.Mvc;
  24. using System.Web.UI;
  25. using System.Web.UI.WebControls;
  26. namespace GreenTree.Nachtragsmanagement.Web.Controllers
  27. {
  28. public class SiteController : Controller
  29. {
  30. private readonly ISiteService _siteService;
  31. private readonly IDeviationService _deviationService;
  32. private readonly IAppendixService _appendixService;
  33. private readonly IUserService _userService;
  34. private readonly IUserHelper _userHelper;
  35. private readonly ILogger _logger;
  36. public SiteController(
  37. ISiteService siteService,
  38. IDeviationService deviationService,
  39. IAppendixService appendixService,
  40. IUserService userService,
  41. IUserHelper userHelper,
  42. ILogger logger)
  43. {
  44. _siteService = siteService;
  45. _deviationService = deviationService;
  46. _appendixService = appendixService;
  47. _userService = userService;
  48. _userHelper = userHelper;
  49. _logger = logger;
  50. ViewData["AllUsers"] = _userService.GetAllUsers();
  51. ViewData["AllUsersWithRole"] =
  52. _userService.GetAllUsers()
  53. .Select(u => new
  54. {
  55. Id = u.Id,
  56. Description = String.Format("{0} - {1}", u.Lastname,
  57. String.Join(", ", u.Roles
  58. .Select(r => r.Description)))
  59. })
  60. .ToList();
  61. ViewData["DefaultAppendixState"] = _appendixService.GetDefaultState();
  62. }
  63. #region Sites
  64. /// <summary>
  65. /// Basic site view function
  66. /// </summary>
  67. [FunctionAuthorize(true, "Site-Sites")]
  68. public ActionResult ViewSites()
  69. {
  70. var currentUser = _userHelper.FromCookies();
  71. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  72. var siteModels = sites
  73. .Select(u => SiteDataModel.FromSite(u, false))
  74. .ToList();
  75. return View("~/Views/Sites/View.cshtml", siteModels);
  76. }
  77. /// <summary>
  78. /// Get JSON data of specific site
  79. /// </summary>
  80. /// <param name="id">Site id.</param>
  81. public ActionResult GetSite(int id = -1)
  82. {
  83. var site = _siteService.GetSiteById(id);
  84. if (site == null)
  85. return new JsonResult
  86. {
  87. Data = "notFound",
  88. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  89. };
  90. var siteModel = SiteDataModel.FromSite(site, false);
  91. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  92. siteModel.SiteTreeData = siteTreeModel;
  93. return new JsonResult
  94. {
  95. Data = JsonConvert.SerializeObject(siteModel),
  96. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  97. };
  98. }
  99. /// <summary>
  100. /// Callback result for site grid
  101. /// </summary>
  102. /// <param name="scrollHeight">The height of the grid scrollable component.</param>
  103. public ActionResult PartialSites(int scrollHeight = -1)
  104. {
  105. var currentUser = _userHelper.FromCookies();
  106. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  107. var siteModels = sites
  108. .Select(u => SiteDataModel.FromSite(u, false))
  109. .ToList();
  110. ViewData["ScrollHeight"] = scrollHeight;
  111. return PartialView("~/Views/Sites/_SiteGridPartial.cshtml", siteModels);
  112. }
  113. /// <summary>
  114. /// Export result for site grid
  115. /// </summary>
  116. [HttpPost]
  117. public ActionResult ExportPartialSites(GridViewExportFormat exportformat)
  118. {
  119. if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
  120. return new EmptyResult();
  121. var currentUser = _userHelper.FromCookies();
  122. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  123. var siteModels = sites
  124. .Select(u => SiteDataModel.FromSite(u, false))
  125. .ToList();
  126. var viewContext = new ViewContext();
  127. var viewPage = new ViewPage();
  128. var htmlHelper = new HtmlHelper(viewContext, viewPage);
  129. var gridViewSettings = Extensions.GridViewSettingsHelper.SiteGridViewSettings(htmlHelper);
  130. switch (exportformat.Format.ToLower())
  131. {
  132. case "xlsx":
  133. return GridViewExtension.ExportToXlsx(gridViewSettings, siteModels);
  134. case "xls":
  135. return GridViewExtension.ExportToXls(gridViewSettings, siteModels);
  136. case "pdf":
  137. return GridViewExtension.ExportToPdf(gridViewSettings, siteModels);
  138. default:
  139. return new EmptyResult();
  140. }
  141. }
  142. /// <summary>
  143. /// Callback result for site appendices
  144. /// </summary>
  145. /// <param name="siteId">Id of site.</param>
  146. public ActionResult PartialDeviationAppendices(int siteId)
  147. {
  148. var site = _siteService.GetSiteById(siteId);
  149. var siteModel = SiteDataModel.FromSite(site, false);
  150. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  151. siteModel.SiteTreeData = siteTreeModel;
  152. return PartialView("~/Views/Sites/_SiteEditTreePartial.cshtml", siteModel);
  153. }
  154. /// <summary>
  155. /// Partial edit for editing of existing or for new site
  156. /// </summary>
  157. /// <param name="id">Id for existing site, otherweise -1.</param>
  158. public ActionResult EditSite(int id = -1)
  159. {
  160. var site = _siteService.GetSiteById(id);
  161. var siteModel = SiteDataModel.FromSite(site, true);
  162. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  163. siteModel.SiteTreeData = siteTreeModel;
  164. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  165. }
  166. /// <summary>
  167. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  168. /// </summary>
  169. /// <param name="siteModel">Site model to be saved.</param>
  170. [HttpPost, ValidateInput(false)]
  171. public ActionResult EditSite(SiteDataModel siteModel)
  172. {
  173. try
  174. {
  175. if (!ModelState.IsValid)
  176. {
  177. foreach (var role in siteModel.UserValues)
  178. siteModel.UserDescriptions.Add(
  179. ((IList<User>)ViewData["AllUsers"])
  180. .First(r => r.Id == role).Lastname);
  181. if (siteModel.Id != -1)
  182. {
  183. var site = _siteService.GetSiteById(siteModel.Id);
  184. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  185. siteModel.SiteTreeData = siteTreeModel;
  186. }
  187. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  188. }
  189. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  190. if (siteModel.Id == -1)
  191. {
  192. var site = siteModel.ToSite();
  193. site.SetUsers(selectedUsers);
  194. _siteService.InsertSite(site);
  195. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  196. }
  197. else
  198. {
  199. var site = _siteService.GetSiteById(siteModel.Id);
  200. site.CustomNumber = siteModel.CustomNumber;
  201. site.Description = siteModel.Description;
  202. site.Start = siteModel.Start;
  203. site.End = siteModel.End;
  204. site.Comment = siteModel.Comment;
  205. site.SetUsers(selectedUsers);
  206. _siteService.UpdateSite(site);
  207. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  208. }
  209. return new JsonResult
  210. {
  211. Data = "success"
  212. };
  213. }
  214. catch (Exception ex)
  215. {
  216. _logger.Error("Fehler bei Speicherung einer Baustelle.", ex, _userHelper.FromCookies());
  217. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  218. }
  219. }
  220. /// <summary>
  221. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  222. /// </summary>
  223. /// <param name="siteModel">Site model to be saved.</param>
  224. [HttpPost, ValidateInput(false)]
  225. public ActionResult EditSiteForAppend(SiteDataModel siteModel)
  226. {
  227. try
  228. {
  229. if (!ModelState.IsValid)
  230. {
  231. foreach (var role in siteModel.UserValues)
  232. siteModel.UserDescriptions.Add(
  233. ((IList<User>)ViewData["AllUsers"])
  234. .First(r => r.Id == role).Lastname);
  235. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  236. }
  237. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  238. var siteId = siteModel.Id;
  239. if (siteModel.Id == -1)
  240. {
  241. var site = siteModel.ToSite();
  242. site.SetUsers(selectedUsers);
  243. _siteService.InsertSite(site);
  244. siteId = site.Id;
  245. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  246. }
  247. return EditSite(siteId);
  248. }
  249. catch (Exception ex)
  250. {
  251. _logger.Error("Fehler bei Speicherung einer Baustelle für einen Nachtrag.", ex, _userHelper.FromCookies());
  252. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  253. }
  254. }
  255. /// <summary>
  256. /// Simple JSON result for deleting a specific site
  257. /// </summary>
  258. /// <param name="id">Site id.</param>
  259. [HttpPost]
  260. public ActionResult DeleteSite(int id)
  261. {
  262. try
  263. {
  264. var site = _siteService.GetSiteById(id);
  265. if (site != null)
  266. _siteService.DeleteSite(site);
  267. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  268. return new JsonResult
  269. {
  270. Data = "success"
  271. };
  272. }
  273. catch (Exception ex)
  274. {
  275. _logger.Error("Fehler bei Löschung einer Baustelle.", ex, _userHelper.FromCookies());
  276. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  277. }
  278. }
  279. #endregion
  280. #region Assigning
  281. /// <summary>
  282. /// Assigns a deviation to an existing entity of type site or appendix
  283. /// </summary>
  284. /// <param name="siteId">The siteId in which the context works.</param>
  285. /// <param name="sourceKey">The sourceKey of the deviation.</param>
  286. /// <param name="targetKey">The targetKey of the site or appendix.</param>
  287. public ActionResult AssignDeviationToEntity(int siteId, string sourceKey, string targetKey)
  288. {
  289. if (!sourceKey.StartsWith("d"))
  290. return new EmptyResult();
  291. if (sourceKey == targetKey)
  292. return new EmptyResult();
  293. var determinedTargetKey = targetKey;
  294. if (targetKey.StartsWith("d"))
  295. {
  296. return new EmptyResult();
  297. //var targetDeviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  298. //var targetDeviation = _deviationService.GetDeviationById(targetDeviationId);
  299. //if (targetDeviation == null)
  300. // return new EmptyResult();
  301. //if (targetDeviation.Site != null)
  302. // determinedTargetKey = "a_0";
  303. //if (targetDeviation.Appendix != null)
  304. // determinedTargetKey = String.Format("a_{0}", targetDeviation.AppendixId);
  305. }
  306. var deviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  307. var deviation = _deviationService.GetDeviationById(deviationId);
  308. if (determinedTargetKey == "a_0")
  309. {
  310. try
  311. {
  312. var site = _siteService.GetSiteById(siteId);
  313. if (deviation.Site != null)
  314. return new EmptyResult();
  315. deviation.Appendix = null;
  316. deviation.AppendixId = null;
  317. site.Deviations.Add(deviation);
  318. _siteService.UpdateSite(site);
  319. _deviationService.UpdateDeviation(deviation);
  320. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  321. }
  322. catch (Exception ex)
  323. {
  324. _logger.Error("Fehler bei Zuweisung einer VA zu einer Baustelle.", ex, _userHelper.FromCookies());
  325. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  326. }
  327. }
  328. else
  329. {
  330. try
  331. {
  332. var appendixId = Convert.ToInt32(determinedTargetKey.Replace("a_", String.Empty));
  333. var appendix = _appendixService.GetAppendixById(appendixId);
  334. if (deviation.AppendixId == appendixId)
  335. return new EmptyResult();
  336. deviation.Site = null;
  337. deviation.SiteId = null;
  338. appendix.Deviations.Add(deviation);
  339. _appendixService.UpdateAppendix(appendix);
  340. _deviationService.UpdateDeviation(deviation);
  341. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  342. }
  343. catch (Exception ex)
  344. {
  345. _logger.Error("Fehler bei Zuweisung einer VA zu einem Nachtrag.", ex, _userHelper.FromCookies());
  346. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  347. }
  348. }
  349. return new JsonResult
  350. {
  351. Data = "success"
  352. };
  353. }
  354. #endregion
  355. }
  356. }