загрузка учбеных планов
This commit is contained in:
parent
754edb3e2a
commit
4008a5e2a5
1130
DepartmentPortal/Common/DatabaseCore/Migrations/20210408152438_ChangeAcademPlan.Designer.cs
generated
Normal file
1130
DepartmentPortal/Common/DatabaseCore/Migrations/20210408152438_ChangeAcademPlan.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,100 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
namespace DatabaseCore.Migrations
|
||||||
|
{
|
||||||
|
public partial class ChangeAcademPlan : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_AcademicPlanRecordTimeNormHours_TimeNorms_TimeNormId",
|
||||||
|
table: "AcademicPlanRecordTimeNormHours");
|
||||||
|
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_AcademicPlans_EducationDirections_EducationDirectionId",
|
||||||
|
table: "AcademicPlans");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_AcademicPlans_EducationDirectionId_YearEntrance",
|
||||||
|
table: "AcademicPlans");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<Guid>(
|
||||||
|
name: "EducationDirectionId",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
type: "uniqueidentifier",
|
||||||
|
nullable: true,
|
||||||
|
oldClrType: typeof(Guid),
|
||||||
|
oldType: "uniqueidentifier");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_AcademicPlans_EducationDirectionId_YearEntrance",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
columns: new[] { "EducationDirectionId", "YearEntrance" },
|
||||||
|
unique: true,
|
||||||
|
filter: "[EducationDirectionId] IS NOT NULL");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_AcademicPlanRecordTimeNormHours_TimeNorms_TimeNormId",
|
||||||
|
table: "AcademicPlanRecordTimeNormHours",
|
||||||
|
column: "TimeNormId",
|
||||||
|
principalTable: "TimeNorms",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.NoAction);
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_AcademicPlans_EducationDirections_EducationDirectionId",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
column: "EducationDirectionId",
|
||||||
|
principalTable: "EducationDirections",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_AcademicPlanRecordTimeNormHours_TimeNorms_TimeNormId",
|
||||||
|
table: "AcademicPlanRecordTimeNormHours");
|
||||||
|
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_AcademicPlans_EducationDirections_EducationDirectionId",
|
||||||
|
table: "AcademicPlans");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_AcademicPlans_EducationDirectionId_YearEntrance",
|
||||||
|
table: "AcademicPlans");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<Guid>(
|
||||||
|
name: "EducationDirectionId",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
type: "uniqueidentifier",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
|
||||||
|
oldClrType: typeof(Guid),
|
||||||
|
oldType: "uniqueidentifier",
|
||||||
|
oldNullable: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_AcademicPlans_EducationDirectionId_YearEntrance",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
columns: new[] { "EducationDirectionId", "YearEntrance" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_AcademicPlanRecordTimeNormHours_TimeNorms_TimeNormId",
|
||||||
|
table: "AcademicPlanRecordTimeNormHours",
|
||||||
|
column: "TimeNormId",
|
||||||
|
principalTable: "TimeNorms",
|
||||||
|
principalColumn: "Id");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_AcademicPlans_EducationDirections_EducationDirectionId",
|
||||||
|
table: "AcademicPlans",
|
||||||
|
column: "EducationDirectionId",
|
||||||
|
principalTable: "EducationDirections",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,7 +30,7 @@ namespace DatabaseCore.Migrations
|
|||||||
b.Property<DateTime?>("DateDelete")
|
b.Property<DateTime?>("DateDelete")
|
||||||
.HasColumnType("datetime2");
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
b.Property<Guid>("EducationDirectionId")
|
b.Property<Guid?>("EducationDirectionId")
|
||||||
.HasColumnType("uniqueidentifier");
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
b.Property<bool>("IsDeleted")
|
b.Property<bool>("IsDeleted")
|
||||||
@ -45,7 +45,8 @@ namespace DatabaseCore.Migrations
|
|||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("EducationDirectionId", "YearEntrance")
|
b.HasIndex("EducationDirectionId", "YearEntrance")
|
||||||
.IsUnique();
|
.IsUnique()
|
||||||
|
.HasFilter("[EducationDirectionId] IS NOT NULL");
|
||||||
|
|
||||||
b.ToTable("AcademicPlans");
|
b.ToTable("AcademicPlans");
|
||||||
});
|
});
|
||||||
@ -854,9 +855,7 @@ namespace DatabaseCore.Migrations
|
|||||||
{
|
{
|
||||||
b.HasOne("DatabaseCore.Models.Department.EducationDirection", "EducationDirection")
|
b.HasOne("DatabaseCore.Models.Department.EducationDirection", "EducationDirection")
|
||||||
.WithMany("AcademicPlans")
|
.WithMany("AcademicPlans")
|
||||||
.HasForeignKey("EducationDirectionId")
|
.HasForeignKey("EducationDirectionId");
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("EducationDirection");
|
b.Navigation("EducationDirection");
|
||||||
});
|
});
|
||||||
|
@ -17,9 +17,8 @@ namespace DatabaseCore.Models.Department
|
|||||||
public class AcademicPlan : BaseEntity, IEntitySecurityExtenstion<AcademicPlan>
|
public class AcademicPlan : BaseEntity, IEntitySecurityExtenstion<AcademicPlan>
|
||||||
{
|
{
|
||||||
[DataMember]
|
[DataMember]
|
||||||
[Required(ErrorMessage = "required")]
|
|
||||||
[MapConfiguration("EducationDirectionId")]
|
[MapConfiguration("EducationDirectionId")]
|
||||||
public Guid EducationDirectionId { get; set; }
|
public Guid? EducationDirectionId { get; set; }
|
||||||
|
|
||||||
[DataMember]
|
[DataMember]
|
||||||
[Required(ErrorMessage = "required")]
|
[Required(ErrorMessage = "required")]
|
||||||
|
@ -10,7 +10,6 @@ using ModuleTools.Enums;
|
|||||||
using ModuleTools.Extensions;
|
using ModuleTools.Extensions;
|
||||||
using ModuleTools.ViewModels;
|
using ModuleTools.ViewModels;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@ -28,7 +27,7 @@ namespace DesktopTools.Controls
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Объект бизнес-логики для получения данных
|
/// Объект бизнес-логики для получения данных
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly BL _businessLogic;
|
protected readonly BL _businessLogic;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Методы для реализации в generic-контроле
|
/// Методы для реализации в generic-контроле
|
||||||
@ -45,7 +44,7 @@ namespace DesktopTools.Controls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly int _defaultControlWidth = 350;
|
private readonly int _defaultControlWidth = 350;
|
||||||
|
|
||||||
private E _element = null;
|
protected E _element = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Событие, вызываемое при закрытии контрола
|
/// Событие, вызываемое при закрытии контрола
|
||||||
|
@ -42,6 +42,10 @@ namespace DesktopTools.Controls
|
|||||||
|
|
||||||
private readonly object _lockObject = new();
|
private readonly object _lockObject = new();
|
||||||
|
|
||||||
|
private bool _usePages = false;
|
||||||
|
|
||||||
|
private bool _useNames = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Объект бизнес-логики для получения данных
|
/// Объект бизнес-логики для получения данных
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -236,12 +240,14 @@ namespace DesktopTools.Controls
|
|||||||
// пагинация по страницам
|
// пагинация по страницам
|
||||||
if (config.CountElementsOnPage.HasValue)
|
if (config.CountElementsOnPage.HasValue)
|
||||||
{
|
{
|
||||||
|
_usePages = true;
|
||||||
toolStripTextBoxCountRecords.Text = config.CountElementsOnPage.Value.ToString();
|
toolStripTextBoxCountRecords.Text = config.CountElementsOnPage.Value.ToString();
|
||||||
toolStripLabelPageName.Visible = toolStripComboBoxPageNames.Visible = false;
|
toolStripLabelPageName.Visible = toolStripComboBoxPageNames.Visible = false;
|
||||||
}
|
}
|
||||||
// пагинация по названиям
|
// пагинация по названиям
|
||||||
else if (config.PageNamesForPagination != null)
|
if (config.PageNamesForPagination != null)
|
||||||
{
|
{
|
||||||
|
_useNames = true;
|
||||||
toolStripButtonPrev.Visible = toolStripLabelPage.Visible = toolStripTextBoxPage.Visible = toolStripLabelCountPages.Visible =
|
toolStripButtonPrev.Visible = toolStripLabelPage.Visible = toolStripTextBoxPage.Visible = toolStripLabelCountPages.Visible =
|
||||||
toolStripLabelCountRecords.Visible = toolStripTextBoxCountRecords.Visible = toolStripButtonNext.Visible = false;
|
toolStripLabelCountRecords.Visible = toolStripTextBoxCountRecords.Visible = toolStripButtonNext.Visible = false;
|
||||||
|
|
||||||
@ -264,7 +270,12 @@ namespace DesktopTools.Controls
|
|||||||
{
|
{
|
||||||
panelHeader.Visible = false;
|
panelHeader.Visible = false;
|
||||||
toolStripButtonClose.Visible = false;
|
toolStripButtonClose.Visible = false;
|
||||||
toolStripFooter.Visible = false;
|
toolStripSeparator6.Visible = false;
|
||||||
|
toolStripButtonSelect.Visible = false;
|
||||||
|
}
|
||||||
|
// Открытие через родительский элемент
|
||||||
|
if (_openMode == ControlOpenMode.Select)
|
||||||
|
{
|
||||||
toolStripSeparator6.Visible = true;
|
toolStripSeparator6.Visible = true;
|
||||||
toolStripButtonSelect.Visible = true;
|
toolStripButtonSelect.Visible = true;
|
||||||
}
|
}
|
||||||
@ -408,27 +419,24 @@ namespace DesktopTools.Controls
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// если включена пагинация
|
// если включена пагинация
|
||||||
else if (toolStripFooter.Visible)
|
// постраничная
|
||||||
|
if (_usePages)
|
||||||
{
|
{
|
||||||
// постраничная
|
if (int.TryParse(toolStripTextBoxPage.Text, out int page) && int.TryParse(toolStripTextBoxCountRecords.Text.ToString(), out int count))
|
||||||
if (toolStripTextBoxPage.Visible)
|
|
||||||
{
|
{
|
||||||
if (int.TryParse(toolStripTextBoxPage.Text, out int page) && int.TryParse(toolStripTextBoxCountRecords.Text.ToString(), out int count))
|
model.PageNumber = page - 1;
|
||||||
{
|
model.PageSize = count;
|
||||||
model.PageNumber = page - 1;
|
|
||||||
model.PageSize = count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// поименная
|
}
|
||||||
else if (toolStripComboBoxPageNames.Visible)
|
// поименная
|
||||||
|
if (_useNames)
|
||||||
|
{
|
||||||
|
if (toolStripComboBoxPageNames.SelectedItem is PageNamesForPaginationModel key)
|
||||||
{
|
{
|
||||||
if (toolStripComboBoxPageNames.SelectedItem is PageNamesForPaginationModel key)
|
var prop = typeof(G).GetProperty(toolStripComboBoxPageNames.Tag.ToString());
|
||||||
|
if (prop != null)
|
||||||
{
|
{
|
||||||
var prop = typeof(G).GetProperty(toolStripComboBoxPageNames.Tag.ToString());
|
prop.SetValue(model, key.Key);
|
||||||
if (prop != null)
|
|
||||||
{
|
|
||||||
prop.SetValue(model, key.Key);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -569,7 +577,7 @@ namespace DesktopTools.Controls
|
|||||||
control.ParentId = ParentId;
|
control.ParentId = ParentId;
|
||||||
control.ParentPropertyName = ParentPropertyName;
|
control.ParentPropertyName = ParentPropertyName;
|
||||||
}
|
}
|
||||||
if (toolStripFooter.Visible && toolStripComboBoxPageNames.Visible)
|
else if (toolStripFooter.Visible && toolStripComboBoxPageNames.Visible)
|
||||||
{
|
{
|
||||||
if (toolStripComboBoxPageNames.SelectedItem is PageNamesForPaginationModel key)
|
if (toolStripComboBoxPageNames.SelectedItem is PageNamesForPaginationModel key)
|
||||||
{
|
{
|
||||||
@ -605,6 +613,24 @@ namespace DesktopTools.Controls
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение настроек для контрола
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
private ControlViewEntityListConfiguration GetConfig() => _genericControlViewEntityList?.GetConfigControl();
|
private ControlViewEntityListConfiguration GetConfig() => _genericControlViewEntityList?.GetConfigControl();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение списка идентификаторов выбранных записей
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
protected List<Guid> GetSelectedIds()
|
||||||
|
{
|
||||||
|
List<Guid> guids = new();
|
||||||
|
foreach (DataGridViewRow selected in dataGridViewList.SelectedRows)
|
||||||
|
{
|
||||||
|
guids.Add(new Guid(selected.Cells[0].Value.ToString()));
|
||||||
|
}
|
||||||
|
return guids;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,6 +29,7 @@ namespace DesktopTools.Controls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.toolStripMenu = new System.Windows.Forms.ToolStrip();
|
this.toolStripMenu = new System.Windows.Forms.ToolStrip();
|
||||||
this.toolStripButtonAdd = new System.Windows.Forms.ToolStripButton();
|
this.toolStripButtonAdd = new System.Windows.Forms.ToolStripButton();
|
||||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
@ -62,6 +63,7 @@ namespace DesktopTools.Controls
|
|||||||
this.dataGridViewList = new System.Windows.Forms.DataGridView();
|
this.dataGridViewList = new System.Windows.Forms.DataGridView();
|
||||||
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.toolStripButtonSelect = new System.Windows.Forms.ToolStripButton();
|
this.toolStripButtonSelect = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.contextMenuStripDataGrid = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
this.toolStripMenu.SuspendLayout();
|
this.toolStripMenu.SuspendLayout();
|
||||||
this.panelHeader.SuspendLayout();
|
this.panelHeader.SuspendLayout();
|
||||||
this.panelSearch.SuspendLayout();
|
this.panelSearch.SuspendLayout();
|
||||||
@ -328,6 +330,7 @@ namespace DesktopTools.Controls
|
|||||||
this.dataGridViewList.AllowUserToDeleteRows = false;
|
this.dataGridViewList.AllowUserToDeleteRows = false;
|
||||||
this.dataGridViewList.AllowUserToResizeRows = false;
|
this.dataGridViewList.AllowUserToResizeRows = false;
|
||||||
this.dataGridViewList.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
|
this.dataGridViewList.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
|
||||||
|
this.dataGridViewList.ContextMenuStrip = this.contextMenuStripDataGrid;
|
||||||
this.dataGridViewList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
this.dataGridViewList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||||
this.dataGridViewList.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.dataGridViewList.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.dataGridViewList.Location = new System.Drawing.Point(0, 142);
|
this.dataGridViewList.Location = new System.Drawing.Point(0, 142);
|
||||||
@ -354,6 +357,11 @@ namespace DesktopTools.Controls
|
|||||||
this.toolStripButtonSelect.Text = "Выбрать";
|
this.toolStripButtonSelect.Text = "Выбрать";
|
||||||
this.toolStripButtonSelect.Visible = false;
|
this.toolStripButtonSelect.Visible = false;
|
||||||
//
|
//
|
||||||
|
// contextMenuStripDataGrid
|
||||||
|
//
|
||||||
|
this.contextMenuStripDataGrid.Name = "contextMenuStripDataGrid";
|
||||||
|
this.contextMenuStripDataGrid.Size = new System.Drawing.Size(61, 4);
|
||||||
|
//
|
||||||
// ControlViewEntityList
|
// ControlViewEntityList
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||||
|
@ -54,7 +54,7 @@ namespace ModuleTools.BusinessLogics
|
|||||||
var result = Service.Read(model);
|
var result = Service.Read(model);
|
||||||
if (!result.IsSucceeded)
|
if (!result.IsSucceeded)
|
||||||
{
|
{
|
||||||
Errors.AddRange(Errors);
|
Errors.AddRange(result.Errors);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ namespace ModuleTools.BusinessLogics
|
|||||||
var result = Service.Read(model);
|
var result = Service.Read(model);
|
||||||
if (!result.IsSucceeded)
|
if (!result.IsSucceeded)
|
||||||
{
|
{
|
||||||
Errors.AddRange(Errors);
|
Errors.AddRange(result.Errors);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return result.Result as E;
|
return result.Result as E;
|
||||||
@ -114,7 +114,7 @@ namespace ModuleTools.BusinessLogics
|
|||||||
var result = Service.Create(model);
|
var result = Service.Create(model);
|
||||||
if (!result.IsSucceeded)
|
if (!result.IsSucceeded)
|
||||||
{
|
{
|
||||||
Errors.AddRange(Errors);
|
Errors.AddRange(result.Errors);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ namespace ModuleTools.BusinessLogics
|
|||||||
var result = Service.Update(model);
|
var result = Service.Update(model);
|
||||||
if (!result.IsSucceeded)
|
if (!result.IsSucceeded)
|
||||||
{
|
{
|
||||||
Errors.AddRange(Errors);
|
Errors.AddRange(result.Errors);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ namespace ModuleTools.BusinessLogics
|
|||||||
var result = Service.Delete(model);
|
var result = Service.Delete(model);
|
||||||
if (!result.IsSucceeded)
|
if (!result.IsSucceeded)
|
||||||
{
|
{
|
||||||
Errors.AddRange(Errors);
|
Errors.AddRange(result.Errors);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,9 +18,8 @@ namespace DepartmentBusinessLogic.BindingModels
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class AcademicPlanSetBindingModel : SetBindingModel
|
public class AcademicPlanSetBindingModel : SetBindingModel
|
||||||
{
|
{
|
||||||
[Required(ErrorMessage = "required")]
|
|
||||||
[MapConfiguration("EducationDirectionId")]
|
[MapConfiguration("EducationDirectionId")]
|
||||||
public Guid EducationDirectionId { get; set; }
|
public Guid? EducationDirectionId { get; set; }
|
||||||
|
|
||||||
[Required(ErrorMessage = "required")]
|
[Required(ErrorMessage = "required")]
|
||||||
[MapConfiguration("YearEntrance")]
|
[MapConfiguration("YearEntrance")]
|
||||||
@ -30,4 +29,14 @@ namespace DepartmentBusinessLogic.BindingModels
|
|||||||
[MapConfiguration("YearFinish")]
|
[MapConfiguration("YearFinish")]
|
||||||
public int YearFinish { get; set; }
|
public int YearFinish { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Модель для зазгрузки планов
|
||||||
|
/// </summary>
|
||||||
|
public class AcademicPlanLoadPlxModel
|
||||||
|
{
|
||||||
|
public Guid AcademicPlanId { get; set; }
|
||||||
|
|
||||||
|
public string FileName { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
@ -27,12 +27,6 @@ namespace DepartmentBusinessLogic.BindingModels
|
|||||||
[MapConfiguration("DisciplineBlockOrder")]
|
[MapConfiguration("DisciplineBlockOrder")]
|
||||||
public int DisciplineBlockOrder { get; set; }
|
public int DisciplineBlockOrder { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Используется только в расчетах, не сохраняется
|
|
||||||
/// </summary>
|
|
||||||
[MapConfiguration("DisciplineBlockBlueAsteriskCode")]
|
|
||||||
public string DisciplineBlockBlueAsteriskCode { get; set; }
|
|
||||||
|
|
||||||
[MapConfiguration("DisciplineBlockBlueAsteriskName")]
|
[MapConfiguration("DisciplineBlockBlueAsteriskName")]
|
||||||
public string DisciplineBlockBlueAsteriskName { get; set; }
|
public string DisciplineBlockBlueAsteriskName { get; set; }
|
||||||
}
|
}
|
||||||
|
@ -12,5 +12,22 @@ namespace DepartmentBusinessLogic.BusinessLogics
|
|||||||
public class AcademicPlanBusinessLogic : GenericBusinessLogic<AcademicPlanGetBindingModel, AcademicPlanSetBindingModel, AcademicPlanListViewModel, AcademicPlanViewModel>
|
public class AcademicPlanBusinessLogic : GenericBusinessLogic<AcademicPlanGetBindingModel, AcademicPlanSetBindingModel, AcademicPlanListViewModel, AcademicPlanViewModel>
|
||||||
{
|
{
|
||||||
public AcademicPlanBusinessLogic(IAcademicPlanService service) : base(service, "Учебные Планы", AccessOperation.УчебныеПланы) { }
|
public AcademicPlanBusinessLogic(IAcademicPlanService service) : base(service, "Учебные Планы", AccessOperation.УчебныеПланы) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка учебного плана
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool LoadPlx(AcademicPlanLoadPlxModel model)
|
||||||
|
{
|
||||||
|
Errors.Clear();
|
||||||
|
var result = (Service as IAcademicPlanService).LoadPlx(model);
|
||||||
|
if (!result.IsSucceeded)
|
||||||
|
{
|
||||||
|
Errors.AddRange(result.Errors);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,10 +1,19 @@
|
|||||||
using DepartmentBusinessLogic.BindingModels;
|
using DepartmentBusinessLogic.BindingModels;
|
||||||
using ModuleTools.Interfaces;
|
using ModuleTools.Interfaces;
|
||||||
|
using ModuleTools.Models;
|
||||||
|
|
||||||
namespace DepartmentBusinessLogic.Interfaces
|
namespace DepartmentBusinessLogic.Interfaces
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Хранение учебных планов
|
/// Хранение учебных планов
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IAcademicPlanService : IGenerticEntityService<AcademicPlanGetBindingModel, AcademicPlanSetBindingModel> { }
|
public interface IAcademicPlanService : IGenerticEntityService<AcademicPlanGetBindingModel, AcademicPlanSetBindingModel>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка учебного плана
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public OperationResultModel LoadPlx(AcademicPlanLoadPlxModel model);
|
||||||
|
}
|
||||||
}
|
}
|
@ -35,7 +35,7 @@ namespace DepartmentBusinessLogic.ViewModels
|
|||||||
[MapConfiguration("InDepartment")]
|
[MapConfiguration("InDepartment")]
|
||||||
public bool InDepartment { get; set; }
|
public bool InDepartment { get; set; }
|
||||||
|
|
||||||
[ViewModelControlListProperty("На кафедре", ColumnWidth = 80)]
|
[ViewModelControlListProperty("На кафедре", ColumnWidth = 100)]
|
||||||
public string InDepartmentValue => InDepartment ? "Да" : "Нет";
|
public string InDepartmentValue => InDepartment ? "Да" : "Нет";
|
||||||
|
|
||||||
[ViewModelControlElementProperty("Семестр", ControlType.ControlEnum, MustHaveValue = true)]
|
[ViewModelControlElementProperty("Семестр", ControlType.ControlEnum, MustHaveValue = true)]
|
||||||
@ -61,7 +61,7 @@ namespace DepartmentBusinessLogic.ViewModels
|
|||||||
[ViewModelControlListProperty("ДВ", ColumnWidth = 50)]
|
[ViewModelControlListProperty("ДВ", ColumnWidth = 50)]
|
||||||
public string IsParentValue => IsParent ? "Да" : "Нет";
|
public string IsParentValue => IsParent ? "Да" : "Нет";
|
||||||
|
|
||||||
[ViewModelControlListProperty("По выбору", ColumnWidth = 80)]
|
[ViewModelControlListProperty("По выбору", ColumnWidth = 100)]
|
||||||
public string IsChildValue => AcademicPlanRecordParentId.HasValue ? "Да" : "Нет";
|
public string IsChildValue => AcademicPlanRecordParentId.HasValue ? "Да" : "Нет";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -13,26 +13,26 @@ namespace DepartmentBusinessLogic.ViewModels
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Элемент учебного плана
|
/// Элемент учебного плана
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ViewModelControlElementClass(HaveDependenceEntities = true, Width = 800, Height = 500)]
|
[ViewModelControlElementClass(HaveDependenceEntities = true, Width = 1200, Height = 800)]
|
||||||
[ViewModelControlElementDependenceEntity(Title = "Записи плана", Order = 1, ParentPropertyName = "AcademicPlanId",
|
[ViewModelControlElementDependenceEntity(Title = "Записи плана", Order = 1, ParentPropertyName = "AcademicPlanId",
|
||||||
ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlAcademicPlanRecordList, DepartmentWindowsDesktop")]
|
ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlAcademicPlanRecordList, DepartmentWindowsDesktop")]
|
||||||
public class AcademicPlanViewModel : ElementViewModel
|
public class AcademicPlanViewModel : ElementViewModel
|
||||||
{
|
{
|
||||||
[ViewModelControlElementProperty("Направление", ControlType.ControlGuid, MustHaveValue = true, ReadOnly = false, ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlEducationDirectionList, DepartmentWindowsDesktop")]
|
[ViewModelControlElementProperty("Направление", ControlType.ControlGuid, MustHaveValue = false, ReadOnly = false, ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlEducationDirectionList, DepartmentWindowsDesktop")]
|
||||||
[MapConfiguration("EducationDirectionId")]
|
[MapConfiguration("EducationDirectionId")]
|
||||||
public Guid EducationDirectionId { get; set; }
|
public Guid? EducationDirectionId { get; set; }
|
||||||
|
|
||||||
[ViewModelControlListProperty("Направление")]
|
[ViewModelControlListProperty("Направление")]
|
||||||
[MapConfiguration("EducationDirection.Cipher", IsDifficle = true)]
|
[MapConfiguration("EducationDirection.Cipher", IsDifficle = true)]
|
||||||
public string EducationDirectionCipher { get; set; }
|
public string EducationDirectionCipher { get; set; }
|
||||||
|
|
||||||
[ViewModelControlListProperty("Дата начала", ColumnWidth = 120)]
|
[ViewModelControlListProperty("Дата начала", ColumnWidth = 120)]
|
||||||
[ViewModelControlElementProperty("Дата начала", ControlType.ControlString, MustHaveValue = true)]
|
[ViewModelControlElementProperty("Дата начала", ControlType.ControlInt, MustHaveValue = true)]
|
||||||
[MapConfiguration("YearEntrance")]
|
[MapConfiguration("YearEntrance")]
|
||||||
public int YearEntrance { get; set; }
|
public int YearEntrance { get; set; }
|
||||||
|
|
||||||
[ViewModelControlListProperty("Дата окончания", ColumnWidth = 120)]
|
[ViewModelControlListProperty("Дата окончания", ColumnWidth = 120)]
|
||||||
[ViewModelControlElementProperty("Дата окончания", ControlType.ControlString, MustHaveValue = true)]
|
[ViewModelControlElementProperty("Дата окончания", ControlType.ControlInt, MustHaveValue = true)]
|
||||||
[MapConfiguration("YearFinish")]
|
[MapConfiguration("YearFinish")]
|
||||||
public int YearFinish { get; set; }
|
public int YearFinish { get; set; }
|
||||||
|
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
using DatabaseCore;
|
using DatabaseCore;
|
||||||
using DatabaseCore.Models.Department;
|
using DatabaseCore.Models.Department;
|
||||||
using DepartmentBusinessLogic.BindingModels;
|
using DepartmentBusinessLogic.BindingModels;
|
||||||
|
using DepartmentBusinessLogic.Enums;
|
||||||
using DepartmentBusinessLogic.Interfaces;
|
using DepartmentBusinessLogic.Interfaces;
|
||||||
using DepartmentBusinessLogic.ViewModels;
|
using DepartmentBusinessLogic.ViewModels;
|
||||||
|
using DepartmentDatabaseImplementation.Models;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ModuleTools.Enums;
|
||||||
|
using ModuleTools.Extensions;
|
||||||
using ModuleTools.Models;
|
using ModuleTools.Models;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
|
||||||
namespace DepartmentDatabaseImplementation.Implementations
|
namespace DepartmentDatabaseImplementation.Implementations
|
||||||
{
|
{
|
||||||
@ -56,5 +64,399 @@ namespace DepartmentDatabaseImplementation.Implementations
|
|||||||
protected override IQueryable<AcademicPlan> IncludingWhenReading(IQueryable<AcademicPlan> query) => query.Include(x => x.EducationDirection);
|
protected override IQueryable<AcademicPlan> IncludingWhenReading(IQueryable<AcademicPlan> query) => query.Include(x => x.EducationDirection);
|
||||||
|
|
||||||
protected override IQueryable<AcademicPlan> OrderingWhenReading(IQueryable<AcademicPlan> query) => query.OrderBy(x => x.EducationDirection.Cipher).ThenBy(x => x.YearEntrance);
|
protected override IQueryable<AcademicPlan> OrderingWhenReading(IQueryable<AcademicPlan> query) => query.OrderBy(x => x.EducationDirection.Cipher).ThenBy(x => x.YearEntrance);
|
||||||
|
|
||||||
|
public OperationResultModel LoadPlx(AcademicPlanLoadPlxModel model)
|
||||||
|
{
|
||||||
|
|
||||||
|
using var context = DatabaseManager.GetContext;
|
||||||
|
using var transaction = context.Database.BeginTransaction();
|
||||||
|
var result = new OperationResultModel();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#region Получаем настройки
|
||||||
|
//Получаем номер кафедры
|
||||||
|
var kafedraNumber = context.EnviromentSettings.FirstOrDefault(x => x.Key == "Кафедра");
|
||||||
|
if (kafedraNumber == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Настройки среды. Не найден ключ Кафедра");
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
var academicPlan = context.AcademicPlans.Include(x => x.EducationDirection).FirstOrDefault(x => x.Id == model.AcademicPlanId && !x.IsDeleted && x.EducationDirectionId.HasValue);
|
||||||
|
if (academicPlan == null)
|
||||||
|
{
|
||||||
|
return OperationResultModel.Error("Error:", "Учебный план не найден", ResultServiceStatusCode.NotFound);
|
||||||
|
}
|
||||||
|
#region помечаем как удаленные все записи плана, потом все найденные восстановим
|
||||||
|
var aprs = context.AcademicPlanRecords.Where(x => x.AcademicPlanId == academicPlan.Id).ToList();
|
||||||
|
foreach (var apr in aprs)
|
||||||
|
{
|
||||||
|
var apres = context.AcademicPlanRecordTimeNormHours.Where(x => x.AcademicPlanRecordId == apr.Id);
|
||||||
|
foreach (var apre in apres)
|
||||||
|
{
|
||||||
|
apre.IsDeleted = true;
|
||||||
|
apre.DateDelete = DateTime.Now;
|
||||||
|
}
|
||||||
|
apr.IsDeleted = true;
|
||||||
|
apr.DateDelete = DateTime.Now;
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
var xml = XDocument.Load(model.FileName)?.Element("Документ")?.Elements()?.Elements()?.Elements();
|
||||||
|
if (xml != null)
|
||||||
|
{
|
||||||
|
var plxModel = new ParsPlxModel
|
||||||
|
{
|
||||||
|
AcademicPlanId = academicPlan.Id,
|
||||||
|
BlockTypes = new(),
|
||||||
|
DisicplineTypes = new(),
|
||||||
|
DisciplineBlocks = new(),
|
||||||
|
TimeNorms = new(),
|
||||||
|
Practics = new(),
|
||||||
|
Hours = new(),
|
||||||
|
Disciplines = new()
|
||||||
|
};
|
||||||
|
#region СправочникВидОбъекта - виды дисциплин - базовая, алтернативная и т.п.
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "СправочникВидОбъекта"))
|
||||||
|
{
|
||||||
|
plxModel.DisicplineTypes.Add((TypeName: elem.Attribute("Наименование").Value, Code: elem.Attribute("Код").Value));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region ПланыЦиклы
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "ПланыЦиклы"))
|
||||||
|
{
|
||||||
|
plxModel.BlockTypes.Add(new BlueAsteriskBlockType
|
||||||
|
{
|
||||||
|
Identificator = elem.Attribute("Идентификатор").Value,
|
||||||
|
Code = elem.Attribute("Код").Value,
|
||||||
|
BlockName = elem.Attribute("Цикл").Value,
|
||||||
|
IsFacultative = Convert.ToBoolean(elem.Attribute("Факультативы").Value)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region СправочникТипОбъекта - блоки дисциплин
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "СправочникТипОбъекта"))
|
||||||
|
{
|
||||||
|
var disciplineBlock = context.DisciplineBlocks.FirstOrDefault(x => x.DisciplineBlockBlueAsteriskName == elem.Attribute("Название").Value);
|
||||||
|
if (disciplineBlock != null)
|
||||||
|
{
|
||||||
|
plxModel.DisciplineBlocks.Add((
|
||||||
|
Code: elem.Attribute("Код").Value,
|
||||||
|
Entity: disciplineBlock
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region СправочникВидыРабот - нормы времени
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "СправочникВидыРабот"))
|
||||||
|
{
|
||||||
|
if (!plxModel.TimeNorms.Exists(x => x.Code == elem.Attribute("Код").Value))
|
||||||
|
{
|
||||||
|
var timeNorms = context.TimeNorms.Where(x => x.KindOfLoadBlueAsteriskName == elem.Attribute("Название").Value);
|
||||||
|
foreach (var tn in timeNorms)
|
||||||
|
{
|
||||||
|
plxModel.TimeNorms.Add((
|
||||||
|
Code: elem.Attribute("Код").Value,
|
||||||
|
Entity: tn
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region СправочникВидыПрактик - нормы времени (практики)
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "СправочникВидыПрактик"))
|
||||||
|
{
|
||||||
|
if (!plxModel.Practics.Exists(x => x.Code == elem.Attribute("Код").Value))
|
||||||
|
{
|
||||||
|
var timeNorms = context.TimeNorms.Where(x => x.KindOfLoadBlueAsteriskPracticName == elem.Attribute("Наименование").Value);
|
||||||
|
foreach (var tn in timeNorms)
|
||||||
|
{
|
||||||
|
plxModel.Practics.Add((
|
||||||
|
Code: elem.Attribute("Код").Value,
|
||||||
|
Entity: tn
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region ПланыНовыеЧасы - часы по дисциплинам
|
||||||
|
var attributeNames = plxModel.TimeNorms.Select(x => x.Entity.KindOfLoadBlueAsteriskAttributeName).Distinct();
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "ПланыНовыеЧасы"))
|
||||||
|
{
|
||||||
|
var objectCode = elem.Attribute("КодОбъекта")?.Value;
|
||||||
|
if (objectCode.IsEmpty())
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Не найден атрибут КодОбъекта"));
|
||||||
|
}
|
||||||
|
var timeNormCode = elem.Attribute("КодВидаРаботы")?.Value;
|
||||||
|
if (timeNormCode.IsEmpty())
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Не найден атрибут КодВидаРаботы"));
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributeKurs = elem.Attribute("Курс")?.Value;
|
||||||
|
if (attributeKurs.IsEmpty())
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Не найдена атрибут Курс"));
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributeSemester = elem.Attribute("Семестр")?.Value;
|
||||||
|
if (attributeSemester.IsEmpty())
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Не найдена атрибут Семестр"));
|
||||||
|
}
|
||||||
|
|
||||||
|
var semester = attributeKurs switch
|
||||||
|
{
|
||||||
|
"1" => (attributeSemester == "1") ? Semester.Первый : Semester.Второй,
|
||||||
|
"2" => (attributeSemester == "1") ? Semester.Третий : Semester.Четвертый,
|
||||||
|
"3" => (attributeSemester == "1") ? Semester.Пятый : Semester.Шестой,
|
||||||
|
"4" => (attributeSemester == "1") ? Semester.Седьмой : Semester.Восьмой,
|
||||||
|
_ => Semester.Первый,
|
||||||
|
};
|
||||||
|
|
||||||
|
var hours = new Dictionary<string, decimal>();
|
||||||
|
|
||||||
|
foreach (var attr in attributeNames)
|
||||||
|
{
|
||||||
|
if (attr.IsNotEmpty())
|
||||||
|
{
|
||||||
|
var hour = elem.Attribute(attr)?.Value;
|
||||||
|
if (hour.IsNotEmpty() && !hours.ContainsKey(attr))
|
||||||
|
{
|
||||||
|
if (decimal.TryParse(hour, out decimal h))
|
||||||
|
{
|
||||||
|
hours.Add(attr, h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (hour.Contains('.'))
|
||||||
|
{
|
||||||
|
hour = hour.Replace('.', ',');
|
||||||
|
}
|
||||||
|
else if (hour.Contains(','))
|
||||||
|
{
|
||||||
|
hour = hour.Replace(',', '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decimal.TryParse(hour, out h))
|
||||||
|
{
|
||||||
|
hours.Add(attr, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plxModel.Hours.Add((
|
||||||
|
DisciplineCode: objectCode,
|
||||||
|
TimeNormCode: timeNormCode,
|
||||||
|
Semester: semester,
|
||||||
|
plxModel.TimeNorms.FirstOrDefault(x => x.Code == timeNormCode).Entity,
|
||||||
|
Hours: hours
|
||||||
|
));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region ПланыСтроки - сами записи учебного плана
|
||||||
|
foreach (var elem in xml.Where(x => x.Name.LocalName == "ПланыСтроки"))
|
||||||
|
{
|
||||||
|
#region получение дисциплины
|
||||||
|
var disciplineBlock = plxModel.DisciplineBlocks.FirstOrDefault(x => x.Code == elem.Attribute("ТипОбъекта")?.Value).Entity;
|
||||||
|
if (disciplineBlock == null)
|
||||||
|
{
|
||||||
|
return OperationResultModel.Error("ошибка", $"Не найден блок дисциплин с кодом {elem.Attribute("ТипОбъекта")?.Value}", ResultServiceStatusCode.NotFound);
|
||||||
|
}
|
||||||
|
|
||||||
|
var disciplineName = elem.Attribute("Дисциплина")?.Value;
|
||||||
|
// ищем по названию в планах дисциплину
|
||||||
|
var discipline = context.Disciplines.FirstOrDefault(x => x.DisciplineBlueAsteriskName == disciplineName);
|
||||||
|
if (discipline == null)
|
||||||
|
{
|
||||||
|
// ищем по названию дисциплину
|
||||||
|
discipline = context.Disciplines.FirstOrDefault(x => x.DisciplineName == disciplineName);
|
||||||
|
if (discipline == null)
|
||||||
|
{
|
||||||
|
discipline = new Discipline
|
||||||
|
{
|
||||||
|
DisciplineName = disciplineName,
|
||||||
|
DisciplineBlockId = disciplineBlock.Id,
|
||||||
|
DisciplineBlueAsteriskName = disciplineName
|
||||||
|
};
|
||||||
|
context.Disciplines.Add(discipline);
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
discipline.DisciplineBlueAsteriskName = disciplineName;
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plxModel.Discipline = (
|
||||||
|
Code: elem.Attribute("Код")?.Value,
|
||||||
|
Practic: elem.Attribute("ВидПрактики")?.Value,
|
||||||
|
Entity: discipline
|
||||||
|
);
|
||||||
|
plxModel.Disciplines.Add(plxModel.Discipline);
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//смотрим код кафедры
|
||||||
|
bool inKafedra = elem.Attribute("КодКафедры")?.Value == kafedraNumber.Value;
|
||||||
|
bool isFacultative = elem.Attribute("ДисциплинаКод")?.Value?.StartsWith("ФТД") ?? false;
|
||||||
|
var zet = elem.Attribute("ЗЕТфакт")?.Value;
|
||||||
|
// вытаскиваем часы по дисциплине
|
||||||
|
foreach (var hour in plxModel.Hours.Where(x => x.DisciplineCode == plxModel.Discipline.Code))
|
||||||
|
{
|
||||||
|
#region Родитель
|
||||||
|
AcademicPlanRecord parent = null;
|
||||||
|
var parentValue = elem.Attribute("КодРодителя")?.Value;
|
||||||
|
if (parentValue.IsNotEmpty())
|
||||||
|
{
|
||||||
|
var parentDiscipilne = plxModel.Disciplines.FirstOrDefault(x => x.Code == parentValue);
|
||||||
|
if (parentDiscipilne == default)
|
||||||
|
{
|
||||||
|
return OperationResultModel.Error("ошибка", $"Не найдена родительская дисциплина с кодом {parentValue}", ResultServiceStatusCode.NotFound);
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = context.AcademicPlanRecords.FirstOrDefault(apr =>
|
||||||
|
apr.AcademicPlanId == model.AcademicPlanId &&
|
||||||
|
apr.DisciplineId == parentDiscipilne.Entity.Id &&
|
||||||
|
apr.Semester == (int)hour.Semester);
|
||||||
|
|
||||||
|
if (parent == null)
|
||||||
|
{
|
||||||
|
// возмжно, родитель будет описан позже, заполняем данными дочернего класса пока что
|
||||||
|
parent = new AcademicPlanRecord
|
||||||
|
{
|
||||||
|
AcademicPlanId = model.AcademicPlanId,
|
||||||
|
DisciplineId = parentDiscipilne.Entity.Id,
|
||||||
|
InDepartment = inKafedra,
|
||||||
|
Semester = (int)hour.Semester,
|
||||||
|
Zet = zet.IsNotEmpty() ? Convert.ToInt32(zet) : 0,
|
||||||
|
IsParent = true,
|
||||||
|
IsFacultative = isFacultative
|
||||||
|
};
|
||||||
|
context.AcademicPlanRecords.Add(parent);
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
else if (parent.IsDeleted)
|
||||||
|
{
|
||||||
|
parent.IsDeleted = false;
|
||||||
|
parent.DateDelete = null;
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parent.IsParent)
|
||||||
|
{
|
||||||
|
parent.IsParent = true;
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Запись учебного плана
|
||||||
|
var record = context.AcademicPlanRecords.FirstOrDefault(apr =>
|
||||||
|
apr.AcademicPlanId == model.AcademicPlanId &&
|
||||||
|
apr.DisciplineId == discipline.Id &&
|
||||||
|
apr.Semester == (int)hour.Semester);
|
||||||
|
|
||||||
|
if (record == null)
|
||||||
|
{
|
||||||
|
record = new AcademicPlanRecord
|
||||||
|
{
|
||||||
|
AcademicPlanId = model.AcademicPlanId,
|
||||||
|
DisciplineId = discipline.Id,
|
||||||
|
Zet = zet.IsNotEmpty() ? Convert.ToInt32(zet) : 0,
|
||||||
|
Semester = (int)hour.Semester,
|
||||||
|
AcademicPlanRecordParentId = parent?.Id,
|
||||||
|
IsParent = false,
|
||||||
|
IsFacultative = isFacultative,
|
||||||
|
InDepartment = inKafedra
|
||||||
|
};
|
||||||
|
|
||||||
|
context.AcademicPlanRecords.Add(record);
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
else if (record.IsDeleted)
|
||||||
|
{
|
||||||
|
record.IsDeleted = false;
|
||||||
|
record.DateDelete = null;
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region
|
||||||
|
if (record != null)
|
||||||
|
{
|
||||||
|
var timeNorms = new List<TimeNorm>();
|
||||||
|
// если перед нами практика, то выбираем только один нужный тип нагрузки
|
||||||
|
if (plxModel.Discipline.Practic.IsNotEmpty())
|
||||||
|
{
|
||||||
|
timeNorms.AddRange(plxModel.Practics.Where(x => x.Code == hour.TimeNormCode &&
|
||||||
|
x.Entity.DisciplineBlockId == plxModel.Discipline.Entity.DisciplineBlockId &&
|
||||||
|
(!x.Entity.TimeNormEducationDirectionQualification.HasValue ||
|
||||||
|
x.Entity.TimeNormEducationDirectionQualification == academicPlan.EducationDirection.Qualification) &&
|
||||||
|
x.Code == plxModel.Discipline.Practic).Select(x => x.Entity));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timeNorms.AddRange(plxModel.TimeNorms.Where(x => x.Code == hour.TimeNormCode &&
|
||||||
|
x.Entity.DisciplineBlockId == plxModel.Discipline.Entity.DisciplineBlockId &&
|
||||||
|
(!x.Entity.TimeNormEducationDirectionQualification.HasValue ||
|
||||||
|
x.Entity.TimeNormEducationDirectionQualification == academicPlan.EducationDirection.Qualification)).Select(x => x.Entity));
|
||||||
|
}
|
||||||
|
foreach (var timeNorm in timeNorms)
|
||||||
|
{
|
||||||
|
decimal planHours = 1;
|
||||||
|
if (timeNorm.KindOfLoadBlueAsteriskAttributeName.IsNotEmpty())
|
||||||
|
{
|
||||||
|
if (!hour.Hours.ContainsKey(timeNorm.KindOfLoadBlueAsteriskAttributeName))
|
||||||
|
{
|
||||||
|
return OperationResultModel.Error("ошибка",
|
||||||
|
$"Не найдена атрибут {timeNorm.KindOfLoadBlueAsteriskAttributeName} по дисциплине с кодом {plxModel.Discipline.Code}", ResultServiceStatusCode.NotFound);
|
||||||
|
}
|
||||||
|
planHours = Math.Abs(hour.Hours[timeNorm.KindOfLoadBlueAsteriskAttributeName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var recordelement = context.AcademicPlanRecordTimeNormHours.FirstOrDefault(apre =>
|
||||||
|
apre.AcademicPlanRecordId == record.Id &&
|
||||||
|
apre.TimeNormId == timeNorm.Id);
|
||||||
|
|
||||||
|
if (recordelement == null)
|
||||||
|
{
|
||||||
|
context.AcademicPlanRecordTimeNormHours.Add(new AcademicPlanRecordTimeNormHour
|
||||||
|
{
|
||||||
|
AcademicPlanRecordId = record.Id,
|
||||||
|
TimeNormId = timeNorm.Id,
|
||||||
|
PlanHours = planHours
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (recordelement.IsDeleted)
|
||||||
|
{
|
||||||
|
recordelement.IsDeleted = false;
|
||||||
|
recordelement.DateDelete = null;
|
||||||
|
}
|
||||||
|
recordelement.PlanHours = planHours;
|
||||||
|
}
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
transaction.Commit();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
transaction.Rollback();
|
||||||
|
return OperationResultModel.Error(ex, ResultServiceStatusCode.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
namespace DepartmentDatabaseImplementation.Models
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательный класс для загрузки учебных планов по синей звездочке
|
||||||
|
/// Фиксирует к какому циклу относится дисциплина
|
||||||
|
/// На данный момент нужна для отсеивания факультативов
|
||||||
|
/// </summary>
|
||||||
|
public class BlueAsteriskBlockType
|
||||||
|
{
|
||||||
|
public string BlockName { get; set; }
|
||||||
|
|
||||||
|
public string Identificator { get; set; }
|
||||||
|
|
||||||
|
public string Code { get; set; }
|
||||||
|
|
||||||
|
public bool IsFacultative { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace DepartmentDatabaseImplementation.Models
|
||||||
|
{
|
||||||
|
public class BlueAsteriskNewHour
|
||||||
|
{
|
||||||
|
public int Kurs { get; set; }
|
||||||
|
|
||||||
|
public int Semester { get; set; }
|
||||||
|
|
||||||
|
public string ObjectCode { get; set; }
|
||||||
|
|
||||||
|
public string TypeNormCode { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, decimal> TimeNorms { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
using DatabaseCore.Models.Department;
|
||||||
|
using DepartmentBusinessLogic.BindingModels;
|
||||||
|
using DepartmentBusinessLogic.Enums;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Xml;
|
||||||
|
|
||||||
|
namespace DepartmentDatabaseImplementation.Models
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Данные для разбора plx-файла с планом
|
||||||
|
/// </summary>
|
||||||
|
public class ParsPlxModel
|
||||||
|
{
|
||||||
|
public Guid AcademicPlanId { get; set; }
|
||||||
|
|
||||||
|
public XmlNode Node { get; set; }
|
||||||
|
|
||||||
|
public List<(string TypeName, string Code)> DisicplineTypes { get; set; }
|
||||||
|
|
||||||
|
public List<BlueAsteriskBlockType> BlockTypes { get; set; }
|
||||||
|
|
||||||
|
public List<(string Code, DisciplineBlock Entity)> DisciplineBlocks { get; set; }
|
||||||
|
|
||||||
|
public (string Code, string Practic, Discipline Entity) Discipline { get; set; }
|
||||||
|
|
||||||
|
public List<(string Code, string Practic, Discipline Entity)> Disciplines { get; set; }
|
||||||
|
|
||||||
|
public List<(string Code, TimeNorm Entity)> TimeNorms { get; set; }
|
||||||
|
|
||||||
|
public List<(string Code, TimeNorm Entity)> Practics { get; set; }
|
||||||
|
|
||||||
|
public List<(string DisciplineCode, string TimeNormCode, Semester Semester, TimeNorm Entity, Dictionary<string, decimal> Hours)> Hours { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Common\DesktopTools\DesktopTools.csproj" />
|
<ProjectReference Include="..\..\Common\DesktopTools\DesktopTools.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Security\SecurityBusinessLogic\SecurityBusinessLogic.csproj" />
|
||||||
<ProjectReference Include="..\DepartmentBusinessLogic\DepartmentBusinessLogic.csproj" />
|
<ProjectReference Include="..\DepartmentBusinessLogic\DepartmentBusinessLogic.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -2,9 +2,12 @@
|
|||||||
using DepartmentBusinessLogic.BusinessLogics;
|
using DepartmentBusinessLogic.BusinessLogics;
|
||||||
using DepartmentBusinessLogic.ViewModels;
|
using DepartmentBusinessLogic.ViewModels;
|
||||||
using DesktopTools.Controls;
|
using DesktopTools.Controls;
|
||||||
|
using DesktopTools.Helpers;
|
||||||
using DesktopTools.Interfaces;
|
using DesktopTools.Interfaces;
|
||||||
using DesktopTools.Models;
|
using DesktopTools.Models;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace DepartmentWindowsDesktop.EntityControls
|
namespace DepartmentWindowsDesktop.EntityControls
|
||||||
{
|
{
|
||||||
@ -25,6 +28,42 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
|
|
||||||
public IControl GetInstanceGenericControl() => new ControlAcademicPlanElement() { ControlId = Guid.NewGuid() };
|
public IControl GetInstanceGenericControl() => new ControlAcademicPlanElement() { ControlId = Guid.NewGuid() };
|
||||||
|
|
||||||
public ControlViewEntityElementConfiguration GetConfigControl() => new();
|
public ControlViewEntityElementConfiguration GetConfigControl() => new()
|
||||||
|
{
|
||||||
|
ControlOnMoveElem = new Dictionary<string, (string Title, EventHandler Event)>
|
||||||
|
{
|
||||||
|
{ "ToolStripMenuItemLoadPlan", ("Загрузить план", (object sender, EventArgs e) => { LoadPlx(); }) }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка учебного плана
|
||||||
|
/// </summary>
|
||||||
|
private void LoadPlx()
|
||||||
|
{
|
||||||
|
if (_element != null)
|
||||||
|
{
|
||||||
|
var dialog = new OpenFileDialog
|
||||||
|
{
|
||||||
|
Filter = "plx|*.plx"
|
||||||
|
};
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var result = _businessLogic.LoadPlx(new AcademicPlanLoadPlxModel
|
||||||
|
{
|
||||||
|
AcademicPlanId = _element.Id,
|
||||||
|
FileName = dialog.FileName
|
||||||
|
});
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
DialogHelper.MessageInformation("Загрузка прошла успешно", "Результат");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DialogHelper.MessageException(_businessLogic.Errors, $"Ошибки при загрузке плана");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,11 +3,13 @@ using DepartmentBusinessLogic.BusinessLogics;
|
|||||||
using DepartmentBusinessLogic.ViewModels;
|
using DepartmentBusinessLogic.ViewModels;
|
||||||
using DesktopTools.Controls;
|
using DesktopTools.Controls;
|
||||||
using DesktopTools.Enums;
|
using DesktopTools.Enums;
|
||||||
|
using DesktopTools.Helpers;
|
||||||
using DesktopTools.Interfaces;
|
using DesktopTools.Interfaces;
|
||||||
using DesktopTools.Models;
|
using DesktopTools.Models;
|
||||||
using ModuleTools.Enums;
|
using ModuleTools.Enums;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace DepartmentWindowsDesktop.EntityControls
|
namespace DepartmentWindowsDesktop.EntityControls
|
||||||
{
|
{
|
||||||
@ -21,7 +23,7 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
public ControlAcademicPlanList()
|
public ControlAcademicPlanList()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Title = "Учебнве планы";
|
Title = "Учебные планы";
|
||||||
ControlId = new Guid("144d098c-ff55-4786-ae63-3105a92990cd");
|
ControlId = new Guid("144d098c-ff55-4786-ae63-3105a92990cd");
|
||||||
AccessOperation = AccessOperation.УчебныеПланы;
|
AccessOperation = AccessOperation.УчебныеПланы;
|
||||||
ControlViewEntityElement = new ControlAcademicPlanElement();
|
ControlViewEntityElement = new ControlAcademicPlanElement();
|
||||||
@ -36,7 +38,44 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
HideToolStripButton = new List<ToolStripButtonListNames>
|
HideToolStripButton = new List<ToolStripButtonListNames>
|
||||||
{
|
{
|
||||||
ToolStripButtonListNames.toolStripButtonSearch
|
ToolStripButtonListNames.toolStripButtonSearch
|
||||||
|
},
|
||||||
|
ControlOnMoveElem = new Dictionary<string, (string Title, EventHandler Event)>
|
||||||
|
{
|
||||||
|
{ "ToolStripMenuItemLoadPlx", ("Загрузить план", (object sender, EventArgs e) => { LoadPlx(); }) }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка учебного плана
|
||||||
|
/// </summary>
|
||||||
|
private void LoadPlx()
|
||||||
|
{
|
||||||
|
var ids = GetSelectedIds();
|
||||||
|
if (ids.Count != 1)
|
||||||
|
{
|
||||||
|
DialogHelper.MessageException("Должна быть выбрана одна запись", $"Ошибка");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var dialog = new OpenFileDialog
|
||||||
|
{
|
||||||
|
Filter = "plx|*.plx"
|
||||||
|
};
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var result = _businessLogic.LoadPlx(new AcademicPlanLoadPlxModel
|
||||||
|
{
|
||||||
|
AcademicPlanId = ids[0],
|
||||||
|
FileName = dialog.FileName
|
||||||
|
});
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
DialogHelper.MessageInformation("Загрузка прошла успешно", "Результат");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DialogHelper.MessageException(_businessLogic.Errors, $"Ошибки при загрузке плана");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -42,6 +42,7 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
Key = x,
|
Key = x,
|
||||||
Value = x.ToString()
|
Value = x.ToString()
|
||||||
})?.ToList(),
|
})?.ToList(),
|
||||||
|
ParentPropertyName = "Semester",
|
||||||
HideToolStripButton = new List<ToolStripButtonListNames>
|
HideToolStripButton = new List<ToolStripButtonListNames>
|
||||||
{
|
{
|
||||||
ToolStripButtonListNames.toolStripButtonSearch
|
ToolStripButtonListNames.toolStripButtonSearch
|
||||||
|
@ -40,6 +40,9 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск пользователя под учетку, либо добавление нового, если не найдено
|
||||||
|
/// </summary>
|
||||||
private void AddUser()
|
private void AddUser()
|
||||||
{
|
{
|
||||||
var model = new EmployeeSetBindingModel();
|
var model = new EmployeeSetBindingModel();
|
||||||
|
@ -37,6 +37,9 @@ namespace DepartmentWindowsDesktop.EntityControls
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск пользователя под учетку, либо добавление нового, если не найдено
|
||||||
|
/// </summary>
|
||||||
private void AddUser()
|
private void AddUser()
|
||||||
{
|
{
|
||||||
var model = new LecturerSetBindingModel();
|
var model = new LecturerSetBindingModel();
|
||||||
|
Loading…
Reference in New Issue
Block a user