SiteController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  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 sites = _siteService.GetAllSites();
  71. var siteModels = sites
  72. .Select(u => SiteDataModel.FromSite(u, false))
  73. .ToList();
  74. return View("~/Views/Sites/View.cshtml", siteModels);
  75. }
  76. /// <summary>
  77. /// Get JSON data of specific site
  78. /// </summary>
  79. /// <param name="id">Site id.</param>
  80. public ActionResult GetSite(int id = -1)
  81. {
  82. var site = _siteService.GetSiteById(id);
  83. if (site == null)
  84. return new JsonResult
  85. {
  86. Data = "notFound",
  87. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  88. };
  89. var siteModel = SiteDataModel.FromSite(site, false);
  90. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  91. siteModel.SiteTreeData = siteTreeModel;
  92. return new JsonResult
  93. {
  94. Data = JsonConvert.SerializeObject(siteModel),
  95. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  96. };
  97. }
  98. /// <summary>
  99. /// Callback result for site grid
  100. /// </summary>
  101. /// <param name="scrollHeight">The height of the grid scrollable component.</param>
  102. public ActionResult PartialSites(int scrollHeight = -1)
  103. {
  104. var sites = _siteService.GetAllSites();
  105. var siteModels = sites
  106. .Select(u => SiteDataModel.FromSite(u, false))
  107. .ToList();
  108. ViewData["ScrollHeight"] = scrollHeight;
  109. return PartialView("~/Views/Sites/_SiteGridPartial.cshtml", siteModels);
  110. }
  111. /// <summary>
  112. /// Export result for site grid
  113. /// </summary>
  114. [HttpPost]
  115. public ActionResult ExportPartialSites(GridViewExportFormat exportformat)
  116. {
  117. if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
  118. return new EmptyResult();
  119. var sites = _siteService.GetAllSites();
  120. var siteModels = sites
  121. .Select(u => SiteDataModel.FromSite(u, false))
  122. .ToList();
  123. var viewContext = new ViewContext();
  124. var viewPage = new ViewPage();
  125. var htmlHelper = new HtmlHelper(viewContext, viewPage);
  126. var gridViewSettings = Extensions.GridViewSettingsHelper.SiteGridViewSettings(htmlHelper);
  127. switch (exportformat.Format.ToLower())
  128. {
  129. case "xlsx":
  130. return GridViewExtension.ExportToXlsx(gridViewSettings, siteModels);
  131. case "xls":
  132. return GridViewExtension.ExportToXls(gridViewSettings, siteModels);
  133. case "pdf":
  134. return GridViewExtension.ExportToPdf(gridViewSettings, siteModels);
  135. default:
  136. return new EmptyResult();
  137. }
  138. }
  139. /// <summary>
  140. /// Callback result for site appendices
  141. /// </summary>
  142. /// <param name="siteId">Id of site.</param>
  143. public ActionResult PartialDeviationAppendices(int siteId)
  144. {
  145. var site = _siteService.GetSiteById(siteId);
  146. var siteModel = SiteDataModel.FromSite(site, false);
  147. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  148. siteModel.SiteTreeData = siteTreeModel;
  149. return PartialView("~/Views/Sites/_SiteEditTreePartial.cshtml", siteModel);
  150. }
  151. /// <summary>
  152. /// Partial edit for editing of existing or for new site
  153. /// </summary>
  154. /// <param name="id">Id for existing site, otherweise -1.</param>
  155. public ActionResult EditSite(int id = -1)
  156. {
  157. var site = _siteService.GetSiteById(id);
  158. var siteModel = SiteDataModel.FromSite(site, true);
  159. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  160. siteModel.SiteTreeData = siteTreeModel;
  161. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  162. }
  163. /// <summary>
  164. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  165. /// </summary>
  166. /// <param name="siteModel">Site model to be saved.</param>
  167. [HttpPost, ValidateInput(false)]
  168. public ActionResult EditSite(SiteDataModel siteModel)
  169. {
  170. try
  171. {
  172. if (!ModelState.IsValid)
  173. {
  174. foreach (var role in siteModel.UserValues)
  175. siteModel.UserDescriptions.Add(
  176. ((IList<User>)ViewData["AllUsers"])
  177. .First(r => r.Id == role).Lastname);
  178. if (siteModel.Id != -1)
  179. {
  180. var site = _siteService.GetSiteById(siteModel.Id);
  181. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  182. siteModel.SiteTreeData = siteTreeModel;
  183. }
  184. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  185. }
  186. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  187. if (siteModel.Id == -1)
  188. {
  189. var site = siteModel.ToSite();
  190. site.SetUsers(selectedUsers);
  191. _siteService.InsertSite(site);
  192. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  193. }
  194. else
  195. {
  196. var site = _siteService.GetSiteById(siteModel.Id);
  197. site.CustomNumber = siteModel.CustomNumber;
  198. site.Description = siteModel.Description;
  199. site.Start = siteModel.Start;
  200. site.End = siteModel.End;
  201. site.Comment = siteModel.Comment;
  202. site.SetUsers(selectedUsers);
  203. _siteService.UpdateSite(site);
  204. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  205. }
  206. return new JsonResult
  207. {
  208. Data = "success"
  209. };
  210. }
  211. catch (Exception ex)
  212. {
  213. _logger.Error("Fehler bei Speicherung einer Baustelle.", ex, _userHelper.FromCookies());
  214. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  215. }
  216. }
  217. /// <summary>
  218. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  219. /// </summary>
  220. /// <param name="siteModel">Site model to be saved.</param>
  221. [HttpPost, ValidateInput(false)]
  222. public ActionResult EditSiteForAppend(SiteDataModel siteModel)
  223. {
  224. try
  225. {
  226. if (!ModelState.IsValid)
  227. {
  228. foreach (var role in siteModel.UserValues)
  229. siteModel.UserDescriptions.Add(
  230. ((IList<User>)ViewData["AllUsers"])
  231. .First(r => r.Id == role).Lastname);
  232. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  233. }
  234. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  235. var siteId = siteModel.Id;
  236. if (siteModel.Id == -1)
  237. {
  238. var site = siteModel.ToSite();
  239. site.SetUsers(selectedUsers);
  240. _siteService.InsertSite(site);
  241. siteId = site.Id;
  242. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  243. }
  244. return EditSite(siteId);
  245. }
  246. catch (Exception ex)
  247. {
  248. _logger.Error("Fehler bei Speicherung einer Baustelle für einen Nachtrag.", ex, _userHelper.FromCookies());
  249. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  250. }
  251. }
  252. /// <summary>
  253. /// Simple JSON result for deleting a specific site
  254. /// </summary>
  255. /// <param name="id">Site id.</param>
  256. [HttpPost]
  257. public ActionResult DeleteSite(int id)
  258. {
  259. try
  260. {
  261. var site = _siteService.GetSiteById(id);
  262. if (site != null)
  263. _siteService.DeleteSite(site);
  264. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  265. return new JsonResult
  266. {
  267. Data = "success"
  268. };
  269. }
  270. catch (Exception ex)
  271. {
  272. _logger.Error("Fehler bei Löschung einer Baustelle.", ex, _userHelper.FromCookies());
  273. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  274. }
  275. }
  276. #endregion
  277. #region Assigning
  278. /// <summary>
  279. /// Assigns a deviation to an existing entity of type site or appendix
  280. /// </summary>
  281. /// <param name="siteId">The siteId in which the context works.</param>
  282. /// <param name="sourceKey">The sourceKey of the deviation.</param>
  283. /// <param name="targetKey">The targetKey of the site or appendix.</param>
  284. public ActionResult AssignDeviationToEntity(int siteId, string sourceKey, string targetKey)
  285. {
  286. if (!sourceKey.StartsWith("d"))
  287. return new EmptyResult();
  288. if (sourceKey == targetKey)
  289. return new EmptyResult();
  290. var determinedTargetKey = targetKey;
  291. if (targetKey.StartsWith("d"))
  292. {
  293. return new EmptyResult();
  294. //var targetDeviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  295. //var targetDeviation = _deviationService.GetDeviationById(targetDeviationId);
  296. //if (targetDeviation == null)
  297. // return new EmptyResult();
  298. //if (targetDeviation.Site != null)
  299. // determinedTargetKey = "a_0";
  300. //if (targetDeviation.Appendix != null)
  301. // determinedTargetKey = String.Format("a_{0}", targetDeviation.AppendixId);
  302. }
  303. var deviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  304. var deviation = _deviationService.GetDeviationById(deviationId);
  305. if (determinedTargetKey == "a_0")
  306. {
  307. try
  308. {
  309. var site = _siteService.GetSiteById(siteId);
  310. if (deviation.Site != null)
  311. return new EmptyResult();
  312. deviation.Appendix = null;
  313. deviation.AppendixId = null;
  314. site.Deviations.Add(deviation);
  315. _siteService.UpdateSite(site);
  316. _deviationService.UpdateDeviation(deviation);
  317. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  318. }
  319. catch (Exception ex)
  320. {
  321. _logger.Error("Fehler bei Zuweisung einer VA zu einer Baustelle.", ex, _userHelper.FromCookies());
  322. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  323. }
  324. }
  325. else
  326. {
  327. try
  328. {
  329. var appendixId = Convert.ToInt32(determinedTargetKey.Replace("a_", String.Empty));
  330. var appendix = _appendixService.GetAppendixById(appendixId);
  331. if (deviation.AppendixId == appendixId)
  332. return new EmptyResult();
  333. deviation.Site = null;
  334. deviation.SiteId = null;
  335. appendix.Deviations.Add(deviation);
  336. _appendixService.UpdateAppendix(appendix);
  337. _deviationService.UpdateDeviation(deviation);
  338. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  339. }
  340. catch (Exception ex)
  341. {
  342. _logger.Error("Fehler bei Zuweisung einer VA zu einem Nachtrag.", ex, _userHelper.FromCookies());
  343. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  344. }
  345. }
  346. return new JsonResult
  347. {
  348. Data = "success"
  349. };
  350. }
  351. #endregion
  352. }
  353. }