wanggang 1 year ago
parent
commit
56f046ecea
  1. 12
      code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/BBAC_SE_DETAIL_DTO.cs
  2. 40
      code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SE_DETAIL_DTO.cs
  3. 23
      code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SE_DETAIL_DTO.cs
  4. 6
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SE_DETAIL_SERVICE.cs
  5. 20
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/TB_RePartsRelationship_SERVICE.cs
  6. 102
      code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/PUB_SE_DETAIL.cs
  7. 4984
      code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/20230731014604_20230731-1.Designer.cs
  8. 216
      code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/20230731014604_20230731-1.cs
  9. 66
      code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/SettleAccountDbContextModelSnapshot.cs

12
code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/BBAC_SE_DETAIL_DTO.cs

@ -1,4 +1,4 @@
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Core;
using System;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
@ -88,31 +88,31 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
/// <summary>
/// 期间
/// </summary>
[ExporterHeader(DisplayName = "日顺序号")]
[ExporterHeader(DisplayName = "期间")]
public int Version { set; get; }
/// <summary>
/// 发货时间
/// </summary>
[ExporterHeader(DisplayName = "日顺序号")]
[ExporterHeader(DisplayName = "发货时间")]
public DateTime ShippingDate { set; get; }
/// <summary>
/// 发运单号
/// </summary>
[ExporterHeader(DisplayName = "日顺序号")]
[ExporterHeader(DisplayName = "发运单号")]
public string WmsBillNum { set; get; }
/// <summary>
/// 零件号
/// </summary>
[ExporterHeader(DisplayName = "日顺序号")]
[ExporterHeader(DisplayName = "零件号")]
public string LU { get; set; }
/// <summary>
/// 生产号
/// </summary>
[ExporterHeader(DisplayName = "日顺序号")]
[ExporterHeader(DisplayName = "生产号")]
public string PN { get; set; }
/// <summary>

40
code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SE_DETAIL_DTO.cs

@ -1,4 +1,4 @@
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Core;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
@ -87,11 +87,11 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
public class HBPO_SE_DETAIL_EXPORT_DTO
{
/// <summary>
/// 期间
/// 发运单号
/// </summary>
[Display(Name = "期间")]
[ExporterHeader(DisplayName = "期间")]
public int Version { set; get; }
[Display(Name = "发运单号")]
[ExporterHeader(DisplayName = "JIS单据编号")]
public string WmsBillNum { set; get; }
/// <summary>
/// 发货时间
@ -101,11 +101,26 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
public DateTime ShippingDate { set; get; }
/// <summary>
/// 发运单
/// 日顺序
/// </summary>
[Display(Name = "发运单号")]
[ExporterHeader(DisplayName = "发运单号")]
public string WmsBillNum { set; get; }
[Display(Name = "日顺序号")]
[ExporterHeader(DisplayName = "JIS排序单号")]
public string SeqNumber { get; set; }
/// <summary>
/// 期间
/// </summary>
[Display(Name = "期间")]
[ExporterHeader(DisplayName = "期间")]
public int Version { set; get; }
/// <summary>
/// 零件号
@ -135,12 +150,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
[ExporterHeader(DisplayName = "数量")]
public decimal Qty { get; set; }
/// <summary>
/// 日顺序号
/// </summary>
[Display(Name = "日顺序号")]
[ExporterHeader(DisplayName = "日顺序号")]
public string SeqNumber { get; set; }
/// <summary>
/// 小总成号

23
code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SE_DETAIL_DTO.cs

@ -1,14 +1,10 @@
using Magicodes.ExporterAndImporter.Core;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Magicodes.ExporterAndImporter.Core;
using Volo.Abp.Application.Dtos;
namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
{
namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos;
/// <summary>
/// PUB发运数据
/// </summary>
@ -81,6 +77,17 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
public DateTime BeginDate { get; set; }
}
/// <summary>
/// 查询
/// </summary>
public class PUB_SE_DETAIL_RequestDto : RequestDto
{
/// <summary>
/// 业务类别
/// </summary>
public EnumBusinessType BusinessType { get; set; }
}
/// <summary>
/// 导出
/// </summary>
@ -156,5 +163,3 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos
[ExporterHeader(DisplayName = "订单时间")]
public DateTime BeginDate { get; set; }
}
}

6
code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SE_DETAIL_SERVICE.cs

@ -1,4 +1,4 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SettleAccount.Domain.BQ;
using Shouldly;
@ -10,6 +10,7 @@ using Volo.Abp.Application.Services;
using Win.Sfs.BaseData.ImportExcelCommon;
using Win.Sfs.SettleAccount.Entities.BQ.Dtos;
using Win.Sfs.SettleAccount.ExcelImporter;
using Win.Sfs.Shared.Filter;
using Win.Sfs.Shared.RepositoryBase;
namespace Win.Sfs.SettleAccount.Entities.BQ
{
@ -64,8 +65,9 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
/// 获取列表
/// </summary>
[HttpPost]
public async Task<PagedResultDto<PUB_SE_DETAIL_DTO>> GetListAsync(RequestDto input)
public async Task<PagedResultDto<PUB_SE_DETAIL_DTO>> GetListAsync(PUB_SE_DETAIL_RequestDto input)
{
input.Filters.Add(new FilterCondition("BusinessType", input.BusinessType.ToString(), EnumFilterAction.Equal, EnumFilterLogic.And));
var entities = await _repository.GetListByFilterAsync(input.Filters, input.Sorting, input.MaxResultCount, input.SkipCount, true);
var totalCount = await _repository.GetCountByFilterAsync(input.Filters);
var dtos = ObjectMapper.Map<List<PUB_SE_DETAIL>, List<PUB_SE_DETAIL_DTO>>(entities);

20
code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/TB_RePartsRelationship_SERVICE.cs

@ -1,3 +1,4 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@ -14,8 +15,10 @@ using Win.Sfs.BaseData.ImportExcelCommon;
using Win.Sfs.SettleAccount.CommonManagers;
using Win.Sfs.SettleAccount.Constant;
using Win.Sfs.SettleAccount.Entities.BQ.Dtos;
using Win.Sfs.SettleAccount.Entities.Prices;
using Win.Sfs.SettleAccount.ExcelImporter;
using Win.Sfs.SettleAccount.ExportReports;
using Win.Sfs.SettleAccount.MaterialRelationships;
using Win.Sfs.Shared.RepositoryBase;
namespace Win.Sfs.SettleAccount.Entities.BQ;
@ -32,8 +35,14 @@ public class TB_RePartsRelationship_SERVICE : SettleAccountApplicationBase<TB_Re
/// </summary>
private readonly INormalEfCoreRepository<TB_RePartsRelationship, Guid> _repository;
/// <summary>
/// 客户零件关系仓储
/// </summary>
private readonly INormalEfCoreRepository<MaterialRelationship, Guid> _materialRelationshipRepository;
public TB_RePartsRelationship_SERVICE(
INormalEfCoreRepository<TB_RePartsRelationship, Guid> repository,
INormalEfCoreRepository<MaterialRelationship, Guid> materialRelationshipRepository,
IDistributedCache<TB_RePartsRelationship> cache,
IExcelImportAppService excelImportService,
ISnowflakeIdGenerator snowflakeIdGenerator,
@ -41,6 +50,7 @@ public class TB_RePartsRelationship_SERVICE : SettleAccountApplicationBase<TB_Re
) : base(cache, excelImportService, snowflakeIdGenerator, commonManager)
{
_repository = repository;
_materialRelationshipRepository = materialRelationshipRepository;
}
#region 导入、导出
@ -58,6 +68,16 @@ public class TB_RePartsRelationship_SERVICE : SettleAccountApplicationBase<TB_Re
if (_ls.Count > 0)
{
//导入的替换零件号
var tbRePartsRelationshipLus = _ls.Select(t => t.LU);
var haveLu = (await _materialRelationshipRepository.GetListAsync(t => tbRePartsRelationshipLus.Contains(t.SettleMaterialCode) == false)).Select(t => t.SettleMaterialCode);
//导入不存在的零件号
var exceptLus = tbRePartsRelationshipLus.Except(haveLu).ToList();
exceptLus.ForEach(exceptLu =>
{
checkList.Add(new ErrorExportDto(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Format("客户物料号{0}不存在,无法替换", exceptLu), string.Empty));
});
var query = from arc in _ls
group arc by new { arc.LU }
into g

102
code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/PUB_SE_DETAIL.cs

@ -1,5 +1,6 @@
using SettleAccount.Bases;
using SettleAccount.Bases;
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Win.Sfs.SettleAccount;
@ -32,7 +33,7 @@ public class PUB_SE_DETAIL :SE_BASE
public string Extend3 { get; set; } = null!;
/// <summary>
/// 1、JIT 2、买单件 3、备件 3、印度件
/// 业务分类
/// </summary>
[Display(Name = "业务分类")]
public EnumBusinessType BusinessType { get; set; }
@ -46,6 +47,103 @@ public class PUB_SE_DETAIL :SE_BASE
//[Display(Name = "Wms发货单号")]
//public string WmsBillNum { get; set; } = null!;
/// <summary>
/// 发货时间
/// </summary>
[DisplayName("发货时间")]
public DateTime BillTime { get; set; }
[DisplayName("零件号")]
public string PartCode { get; set; }
/// <summary>
/// 批次
/// </summary>
[DisplayName("批次")]
public string Batch { get; set; }
/// <summary>
/// 发货人
/// </summary>
[DisplayName("发货人")]
public string Oper { get; set; }
/// <summary>
/// DN单据号
/// </summary>
[DisplayName("DN单据号")]
public string DnBillNum { get; set; }
/// <summary>
/// DN单据时间
/// </summary>
[DisplayName("DN单据时间")]
public DateTime DnBillTime { get; set; }
/// <summary>
/// DN单添加人
/// </summary>
[DisplayName("DN单添加人")]
public string DnOper { get; set; }
/// <summary>
/// 交付索引
/// </summary>
[DisplayName("交付索引")]
public string DeliveryIndex { get; set; }
/// <summary>
/// CustId
/// </summary>
[DisplayName("客户")]
public string CustId { get; set; }
/// <summary>
/// 发货仓库
/// </summary>
[DisplayName("发货仓库")]
public string DeliveryHose { get; set; }
[DisplayName("来源库位")]
public string FromLocCode { get; set; }
/// <summary>
/// 来源仓库
/// </summary>
[DisplayName("来源仓库")]
public string FromHose { get; set; }
/// <summary>
/// 来源ERP库存
/// </summary>
[DisplayName("来源ERP库存")]
public string FromErpLocCode { get; set; }
/// <summary>
/// 目标库位
/// </summary>
[DisplayName("目标库位")]
public string ToLocCode { get; set; }
/// <summary>
/// 目标Erp库位
/// </summary>
[DisplayName("目标Erp库位")]
public string ToErpLocCode { get; set; }
/// <summary>
/// 目标仓库
/// </summary>
[DisplayName("目标仓库")]
public string ToHose { get; set; }
/// <summary>
/// 备注
/// </summary>
[DisplayName("备注")]
public string Remark { get; set; }
public PUB_SE_DETAIL(Guid guid, string keyCode, int version, string lU, string pN, decimal qty, string extend1, string extend2, string extend3, EnumBusinessType businessType, DateTime beginDate, DateTime shippingDate, string wmsBillNum)
{
Id=guid;

4984
code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/20230731014604_20230731-1.Designer.cs

File diff suppressed because it is too large

216
code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/20230731014604_20230731-1.cs

@ -0,0 +1,216 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Win.Sfs.SettleAccount.Migrations
{
public partial class _202307311 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<Guid>(
name: "CreatorId",
table: "Set_VmiLog",
type: "uniqueidentifier",
nullable: true);
migrationBuilder.AddColumn<DateTime>(
name: "LastModificationTime",
table: "Set_VmiLog",
type: "datetime2",
nullable: true);
migrationBuilder.AddColumn<Guid>(
name: "LastModifierId",
table: "Set_VmiLog",
type: "uniqueidentifier",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "Batch",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<DateTime>(
name: "BillTime",
table: "Set_PUB_SE_DETAIL",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
migrationBuilder.AddColumn<string>(
name: "CustId",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "DeliveryHose",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "DeliveryIndex",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "DnBillNum",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<DateTime>(
name: "DnBillTime",
table: "Set_PUB_SE_DETAIL",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
migrationBuilder.AddColumn<string>(
name: "DnOper",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "FromErpLocCode",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "FromHose",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "FromLocCode",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "Oper",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "PartCode",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "Remark",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ToErpLocCode",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ToHose",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ToLocCode",
table: "Set_PUB_SE_DETAIL",
type: "nvarchar(max)",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "CreatorId",
table: "Set_VmiLog");
migrationBuilder.DropColumn(
name: "LastModificationTime",
table: "Set_VmiLog");
migrationBuilder.DropColumn(
name: "LastModifierId",
table: "Set_VmiLog");
migrationBuilder.DropColumn(
name: "Batch",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "BillTime",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "CustId",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "DeliveryHose",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "DeliveryIndex",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "DnBillNum",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "DnBillTime",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "DnOper",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "FromErpLocCode",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "FromHose",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "FromLocCode",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "Oper",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "PartCode",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "Remark",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "ToErpLocCode",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "ToHose",
table: "Set_PUB_SE_DETAIL");
migrationBuilder.DropColumn(
name: "ToLocCode",
table: "Set_PUB_SE_DETAIL");
}
}
}

66
code/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Migrations/SettleAccountDbContextModelSnapshot.cs

@ -2977,9 +2977,15 @@ namespace Win.Sfs.SettleAccount.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("Batch")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("BeginDate")
.HasColumnType("datetime2");
b.Property<DateTime>("BillTime")
.HasColumnType("datetime2");
b.Property<int>("BusinessType")
.HasMaxLength(50)
.HasColumnType("int");
@ -2998,6 +3004,9 @@ namespace Win.Sfs.SettleAccount.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("CustId")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
@ -3006,6 +3015,21 @@ namespace Win.Sfs.SettleAccount.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("DeliveryHose")
.HasColumnType("nvarchar(max)");
b.Property<string>("DeliveryIndex")
.HasColumnType("nvarchar(max)");
b.Property<string>("DnBillNum")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("DnBillTime")
.HasColumnType("datetime2");
b.Property<string>("DnOper")
.HasColumnType("nvarchar(max)");
b.Property<string>("Extend1")
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
@ -3022,6 +3046,15 @@ namespace Win.Sfs.SettleAccount.Migrations
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("FromErpLocCode")
.HasColumnType("nvarchar(max)");
b.Property<string>("FromHose")
.HasColumnType("nvarchar(max)");
b.Property<string>("FromLocCode")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
@ -3044,16 +3077,34 @@ namespace Win.Sfs.SettleAccount.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Oper")
.HasColumnType("nvarchar(max)");
b.Property<string>("PN")
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("PartCode")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Qty")
.HasColumnType("decimal(18,2)");
b.Property<string>("Remark")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("ShippingDate")
.HasColumnType("datetime2");
b.Property<string>("ToErpLocCode")
.HasColumnType("nvarchar(max)");
b.Property<string>("ToHose")
.HasColumnType("nvarchar(max)");
b.Property<string>("ToLocCode")
.HasColumnType("nvarchar(max)");
b.Property<int>("Version")
.HasColumnType("int");
@ -3931,7 +3982,12 @@ namespace Win.Sfs.SettleAccount.Migrations
.HasColumnType("datetime2");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2");
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("Desc")
.HasColumnType("nvarchar(max)");
@ -3963,6 +4019,14 @@ namespace Win.Sfs.SettleAccount.Migrations
b.Property<string>("LU")
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("MatchNumber")
.HasColumnType("nvarchar(max)");

Loading…
Cancel
Save