diff --git a/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs b/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs index 86c329304..0cfdd9257 100644 --- a/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs +++ b/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs @@ -39,6 +39,10 @@ public class IssueNoteController : AbpController { p.ToLot = string.Empty; p.ToPackingCode = string.Empty; + if(p.PositionCode.Contains('W')) + { + p.RecommendType = EnumRecommendType.PositionCode; + } }); await _issueNoteAppService.CreateAsync(input).ConfigureAwait(false); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaDTO.cs new file mode 100644 index 000000000..f1de16b9c --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaDTO.cs @@ -0,0 +1,59 @@ +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +using System; +using System.Collections.Generic; + +[Display(Name = "器具基本信息")] + +public class EquipmentAreaDTO : SfsBaseDataDTOBase, IHasCode +{ + + + + + + /// + /// 器具编号 + /// + [Display(Name = "器具编号")] + public string Code { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public string Type { get; set; } = string.Empty; + /// + /// 型号 + /// + [Display(Name = "型号")] + public string Model { get; set; } = string.Empty; + /// + /// 库位编号 + /// + [Display(Name = "库位编号")] + public string LocCode { get; set; } = string.Empty; + /// + /// 状态 + /// + [Display(Name = "状态")] + public int State { get; set; } = 0; + + + /// + /// 位置编号 + /// + [Display(Name = "位置编号")] + public string AreaCode { get; set; } + + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaForDongyangExportDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaForDongyangExportDTO.cs new file mode 100644 index 000000000..baae6ceca --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentAreaForDongyangExportDTO.cs @@ -0,0 +1,49 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "物料信息")] +public class EquipmentAreaForDongyangExportDTO +{ + /// + /// 器具编号 + /// + [Display(Name = "器具编号")] + public string Code { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public string Type { get; set; } = string.Empty; + /// + /// 型号 + /// + [Display(Name = "型号")] + public string Model { get; set; } = string.Empty; + /// + /// 库位编号 + /// + [Display(Name = "库位编号")] + public string LocCode { get; set; } = string.Empty; + /// + /// 状态 + /// + [Display(Name = "状态")] + public int State { get; set; } = 0; + + + /// + /// 位置编号 + /// + [Display(Name = "位置编号")] + public string AreaCode { get; set; } + + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentDTO.cs index b24b1e152..58c7c3c04 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentDTO.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/DTOs/EquipmentDTO.cs @@ -36,11 +36,7 @@ public class EquipmentDTO : SfsBaseDataDTOBase, IHasCode /// [Display(Name = "状态")] public int State { get; set; } = 0; - /// - /// 备注 - /// - [Display(Name = "备注")] - public string Remark { get; set; } = string.Empty; + /// diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/EquipmentAreaPermissions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/EquipmentAreaPermissions.cs new file mode 100644 index 000000000..04fa48623 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/EquipmentAreaPermissions.cs @@ -0,0 +1,21 @@ +using Volo.Abp.Authorization.Permissions; +using Win_in.Sfs.Basedata.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public static class EquipmentAreaPermissions +{ + + public const string Default = BasedataPermissions.GroupName + "." + nameof(Equipment); + public const string Create = Default + "." + BasedataPermissions.CreateStr; + public const string Update = Default + "." + BasedataPermissions.UpdateStr; + public const string Delete = Default + "." + BasedataPermissions.DeleteStr; + + public static void AddEquipmentPermission(this PermissionGroupDefinition permissionGroup) + { + var EquipmentPermission = permissionGroup.AddPermission(Default, BasedataPermissionDefinitionProvider.L(nameof(Equipment))); + EquipmentPermission.AddChild(Create, BasedataPermissionDefinitionProvider.L(BasedataPermissions.CreateStr)); + EquipmentPermission.AddChild(Update, BasedataPermissionDefinitionProvider.L(BasedataPermissions.UpdateStr)); + EquipmentPermission.AddChild(Delete, BasedataPermissionDefinitionProvider.L(BasedataPermissions.DeleteStr)); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/IEquipmentAreaAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/IEquipmentAreaAppService.cs new file mode 100644 index 000000000..8067e9014 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/IEquipmentAreaAppService.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public interface IEquipmentAreaAppService + : ISfsBaseDataAppServiceBase + , ISfsGetByCodeAppService + , ISfsCheckAppService + , ISfsUpsertAppService +{ + //Task CheckItemIsAvailable(string itemCode); + //[HttpGet("check-item-is-available-no-select-sql")] + //void CheckItemIsAvailable(EquipmentDTO EquipmentDTO); + + //Task> GetListByNameAsync(string name); + + //Task GetOrAddAsync(EquipmentEditInput input); + + //Task GetManageTypeAsync(string itemCode); + //Task> GetManageTypesAsync(List itemCodes); + + //Task UpsertAsyncByInterface(EquipmentEditInput input); + //Task UpsertStdPackQtyAsync(string itemCode, decimal stdpackqty); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaCheckInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaCheckInput.cs new file mode 100644 index 000000000..9b149c6e7 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaCheckInput.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public class EquipmentAreaCheckInput +{ + /// + /// 器具编号 + /// + [Display(Name = "器具编号")] + public string Code { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public string Type { get; set; } = string.Empty; + /// + /// 型号 + /// + [Display(Name = "型号")] + public string Model { get; set; } = string.Empty; + /// + /// 库位编号 + /// + [Display(Name = "库位编号")] + public string LocCode { get; set; } = string.Empty; + /// + /// 状态 + /// + [Display(Name = "状态")] + public int State { get; set; } = 0; + + + /// + /// 位置编号 + /// + [Display(Name = "位置编号")] + public string AreaCode { get; set; } + + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaEditInput.cs new file mode 100644 index 000000000..be0f614ca --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaEditInput.cs @@ -0,0 +1,225 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public class EquipmentAreaEditInput : SfsBaseDataCreateOrUpdateInputBase +{ + /// + /// 器具编号 + /// + [Display(Name = "器具编号")] + public string Code { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public string Type { get; set; } = string.Empty; + /// + /// 型号 + /// + [Display(Name = "型号")] + public string Model { get; set; } = string.Empty; + /// + /// 库位编号 + /// + [Display(Name = "库位编号")] + public string LocCode { get; set; } = string.Empty; + /// + /// 状态 + /// + [Display(Name = "状态")] + public int State { get; set; } = 0; + + + /// + /// 位置编号 + /// + [Display(Name = "位置编号")] + public string AreaCode { get; set; } + + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } + + + + //#region Base + ///// + ///// 名称 + ///// + //[Display(Name = "名称")] + //[Required(ErrorMessage = "{0}是必填项")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Name { get; set; } + + ///// + ///// 描述1 + ///// + //[Display(Name = "描述1")] + //[StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Desc1 { get; set; } + + ///// + ///// 描述2 + ///// + //[Display(Name = "描述2")] + //[StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Desc2 { get; set; } + + ///// + ///// 状态 + ///// + //[Display(Name = "状态")] + //[Required(ErrorMessage = "{0}是必填项")] + //public EnumItemStatus Status { get; set; } + + ///// + ///// 制造件 + ///// + //[Display(Name = "制造件")] + //[Required(ErrorMessage = "{0}是必填项")] + //public bool CanMake { get; set; } + + ///// + ///// 采购件 + ///// + //[Display(Name = "采购件")] + //[Required(ErrorMessage = "{0}是必填项")] + //public bool CanBuy { get; set; } + ///// + ///// 外包件 + ///// + //[Display(Name = "外包件")] + //public bool CanOutsourcing { get; set; } + ///// + ///// 回收件 + ///// + //[Display(Name = "回收件")] + //public bool IsRecycled { get; set; } + + ///// + ///// 类型 + ///// + //[Display(Name = "类型")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Type { get; set; } + + ///// + ///// 种类 + ///// + //[Display(Name = "种类")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Category { get; set; } + + ///// + ///// 分组 + ///// + //[Display(Name = "分组")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Group { get; set; } + + ///// + ///// 颜色 + ///// + //[Display(Name = "颜色")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Color { get; set; } + + ///// + ///// 配置 + ///// + //[Display(Name = "配置")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Configuration { get; set; } + + ///// + ///// 虚零件 + ///// + //[Display(Name = "虚零件(Is phantom)")] + //public virtual bool IsPhantom { get; set; } + + ///// + ///// 基本计量单位 + ///// + //[Display(Name = "基本计量单位")] + //[Required(ErrorMessage = "{0}是必填项")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string BasicUom { get; set; } + + ///// + ///// 标包数 + ///// + //[Display(Name = "标包数")] + //[Required(ErrorMessage = "{0}是必填项")] + //public decimal StdPackQty { get; set; } + + ///// + ///// ABC类 + ///// + //[Display(Name = "ABC类")] + //[Required(ErrorMessage = "{0}是必填项", AllowEmptyStrings = true)] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string AbcClass { get; set; } + + ///// + ///// 项目 + ///// + //[Display(Name = "项目")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Project { get; set; } + + ///// + ///// 版本 + ///// + //[Display(Name = "版本")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Version { get; set; } + + ///// + ///// 工程变革 + ///// + //[Display(Name = "工程变革")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Eco { get; set; } + + ///// + ///// 有效期 + ///// + //[Display(Name = "有效期")] + //public int Validity { get; set; } + ///// + ///// 有效期单位 + ///// + //[Display(Name = "有效期单位")] + //public EnumValidityUnit ValidityUnit { get; set; } + + ///// + ///// 管理类型 + ///// + //[Display(Name = "管理类型")] + //public EnumItemManageType ManageType { get; set; } + + ///// + ///// 打印标签用的一个等级 + ///// + //[Display(Name = "Elevel")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Elevel { get; set; } + //#endregion + + //#region Create + ///// + ///// 代码 + ///// + //[Display(Name = "代码")] + //[Required(ErrorMessage = "{0}是必填项")] + //[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + //public string Code { get; set; } + //#endregion +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaImportInput.cs new file mode 100644 index 000000000..b306348dd --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentAreaImportInput.cs @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "器具位置")] +public class EquipmentAreaImportInput : SfsBaseDataImportInputBase +{ + /// + /// 器具编号 + /// + [Display(Name = "器具编号")] + public string Code { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public string Type { get; set; } = string.Empty; + /// + /// 型号 + /// + [Display(Name = "型号")] + public string Model { get; set; } = string.Empty; + /// + /// 库位编号 + /// + [Display(Name = "库位编号")] + public string LocCode { get; set; } = string.Empty; + /// + /// 状态 + /// + [Display(Name = "状态")] + public int State { get; set; } = 0; + + + /// + /// 位置编号 + /// + [Display(Name = "位置编号")] + public string AreaCode { get; set; } + + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentEditInput.cs index 4822c9a39..aedd223cd 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentEditInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Equipments/Inputs/EquipmentEditInput.cs @@ -33,11 +33,7 @@ public class EquipmentEditInput : SfsBaseDataCreateOrUpdateInputBase /// [Display(Name = "状态")] public int State { get; set; } = 0; - /// - /// 备注 - /// - [Display(Name = "备注")] - public string Remark { get; set; } = string.Empty; + /// /// 创建人 /// diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDTO.cs new file mode 100644 index 000000000..ac0cb8661 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDTO.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "Kitting箱")] +public class KittingDTO : SfsBaseDataDTOBase, IHasCode, IHasName +{ + [Display(Name ="编号")] + public string Code { get; set; } + [Display(Name = "名称")] + public string Name { get; set; } + + [Display(Name = "明细")] + public virtual ICollection Details { set; get; }= new List(); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDetailDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDetailDTO.cs new file mode 100644 index 000000000..cfa860a62 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/DTOs/KittingDetailDTO.cs @@ -0,0 +1,49 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; +using Volo.Abp.MultiTenancy; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "Kitting箱明细")] +public class KittingDetailDTO: AuditedEntityDto, IMultiTenant, IRemark +{ + /// + /// 主表ID + /// + [Display(Name = "主表ID")] + public Guid MasterId { get; set; } + /// + /// 物料编码 + /// + [Display(Name = "物料编码")] + public string PartCode { set; get; } + /// + /// 描述1 + /// + [Display(Name = "描述1")] + public string Desc1 { set; get; } + /// + /// 描述2 + /// + [Display(Name = "描述2")] + public string Desc2 { set; get; } + /// + /// 包装数量 + /// + [Display(Name = "包装数量")] + public decimal Qty { set; get; } + + /// + /// 配置 + /// + [Display(Name = "配置")] + public string Conf { set; get; } + + public Guid? TenantId { set; get; } + + public string Remark { get; set; } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/IKttingAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/IKttingAppService.cs new file mode 100644 index 000000000..ff56f5fab --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/IKttingAppService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Win_in.Sfs.Shared.Application.Contracts; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public interface IKittingAppService: ISfsBaseDataAppServiceBase, ISfsGetByCodeAppService +{ + Task UpdateAsync(KittingEditInput input); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingDetailInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingDetailInput.cs new file mode 100644 index 000000000..1b9e2a17b --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingDetailInput.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.MultiTenancy; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Kittings.Inputs; +public class KittingDetailInput: EntityDto, IMultiTenant, IRemark +{ + /// + /// 主表ID + /// + [Display(Name = "主表ID")] + public Guid MasterId { get; set; } + /// + /// 物料编码 + /// + [Display(Name = "物料编码")] + public string PartCode { set; get; } + /// + /// 描述1 + /// + [Display(Name = "描述1")] + public string Desc1 { set; get; } + /// + /// 描述2 + /// + [Display(Name = "描述2")] + public string Desc2 { set; get; } + /// + /// 包装数量 + /// + [Display(Name = "包装数量")] + public decimal Qty { set; get; } + /// + /// 配置 + /// + [Display(Name = "配置")] + public string Conf { set; get; } + [Display(Name = "租户ID")] + public Guid? TenantId { set; get; + } + [Display(Name = "备注")] + public string Remark { get; set; } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingEditInput.cs new file mode 100644 index 000000000..422404a21 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingEditInput.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Basedata.Kittings.Inputs; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public class KittingEditInput : SfsBaseDataCreateOrUpdateInputBase +{ + + public string Code { get; set; } + public string Name { get; set; } + + + public virtual ICollection Details { get; set; }=new List(); + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingImportInput.cs new file mode 100644 index 000000000..e47e7d778 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/Inputs/KittingImportInput.cs @@ -0,0 +1,107 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "Kitting箱")] +public class KittingImportInput : SfsBaseDataImportInputBase +{ + + public string Code { get; set; } + public string Name { get; set; } + + +} + +//[Serializable] +//public class CustomerDTO : SfsBaseDataDTOBase +//{ +// /// +// ///�ͻ����� +// /// +// [Display(Name = "�ͻ�����")] +// [Required(ErrorMessage = "{0}�DZ�����")] +// [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}�������{1}���ַ�")] +// public string Code { get; set; } + +// /// +// /// �ͻ����� +// /// +// [Display(Name = "�ͻ�����")] +// [Required(ErrorMessage = "{0}�DZ�����")] +// [StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}�������{1}���ַ�")] +// public string Name { get; set; } + +// /// +// /// �ͻ����� +// /// +// [Display(Name = "�ͻ�����")] +// [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}�������{1}���ַ�")] +// public string Description { get; set; } + +// /// +// /// ��ϵ��ַ +// /// +// [Display(Name = "��ϵ��ַ")] +// [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}�������{1}���ַ�")] +// public string Address { get; set; } + +// /// +// /// ��ϵ�� +// /// + +// [Display(Name = "��ϵ��")] +// [StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}�������{1}���ַ�")] +// public string Contact { get; set; } + +// /// +// /// ��ϵ�绰 +// /// +// [Display(Name = "��ϵ�绰")] +// public string ContactPhone { get; set; } + +// /// +// /// ��ϵ�ʼ� +// /// +// [Display(Name = "��ϵ�ʼ�")] + +// public string ContactEmail { get; set; } + +// /// +// /// ��ϵ���� +// /// +// [Display(Name = "��ϵ����")] +// public string ContactFax { get; set; } + +// /// +// /// ˰�� +// /// +// [Display(Name = "˰��")] +// public Nullable TaxRate { get; set; } + +// /// +// /// ����ID +// /// +// [Display(Name = "����Id")] +// public Guid CurrencyId { get; set; } + +// /// +// /// ����ID +// /// +// [Display(Name = "��������")] +// public string CurrencyName { get; set; } + +// /// +// /// �ͻ����� +// /// +// [Display(Name = "�ͻ�����")] +// public Nullable CustomerType { get; set; } + +// public bool Enabled { get; set; } + +// //public ICollection CustomerItems { set; get; } +//} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/KittingPermissions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/KittingPermissions.cs new file mode 100644 index 000000000..d2b46bfdd --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Kittings/KittingPermissions.cs @@ -0,0 +1,21 @@ +using Volo.Abp.Authorization.Permissions; +using Win_in.Sfs.Basedata.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public static class KittingPermissions +{ + + public const string Default = BasedataPermissions.GroupName + "." + nameof(Kitting); + public const string Create = Default + "." + BasedataPermissions.CreateStr; + public const string Update = Default + "." + BasedataPermissions.UpdateStr; + public const string Delete = Default + "." + BasedataPermissions.DeleteStr; + + public static void AddKittingPermission(this PermissionGroupDefinition permissionGroup) + { + var customerPermission = permissionGroup.AddPermission(Default, BasedataPermissionDefinitionProvider.L(nameof(Kitting))); + customerPermission.AddChild(Create, BasedataPermissionDefinitionProvider.L(BasedataPermissions.CreateStr)); + customerPermission.AddChild(Update, BasedataPermissionDefinitionProvider.L(BasedataPermissions.UpdateStr)); + customerPermission.AddChild(Delete, BasedataPermissionDefinitionProvider.L(BasedataPermissions.DeleteStr)); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/DTOs/PositionCodeDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/DTOs/PositionCodeDTO.cs index 569e709e7..cce3aaeff 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/DTOs/PositionCodeDTO.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/DTOs/PositionCodeDTO.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application.Contracts; @@ -32,6 +33,12 @@ public class PositionCodeDTO : SfsBaseDataDTOBase, IHasCode [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] public string PartDesc { get; set; } /// + /// 基本计量单位 + /// + [Display(Name = "基本计量单位")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string BasicUom { get; set; } + /// /// 库位 /// [Display(Name = "库位")] @@ -48,4 +55,9 @@ public class PositionCodeDTO : SfsBaseDataDTOBase, IHasCode /// [Display(Name = "标包数量")] public decimal StdPackQty { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public EnumRecommendType Type { get; set; } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs index 24bc8733f..e629da700 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application.Contracts; @@ -24,6 +25,11 @@ public class PositionCodeEditInput : SfsBaseDataCreateOrUpdateInputBase [Display(Name = "物料描述")] public string PartDesc { get; set; } /// + /// 基本计量单位 + /// + [Display(Name = "基本计量单位")] + public string BasicUom { get; set; } + /// /// 库位 /// [Display(Name = "库位")] @@ -38,8 +44,11 @@ public class PositionCodeEditInput : SfsBaseDataCreateOrUpdateInputBase /// [Display(Name = "标包数量")] public decimal StdPackQty { get; set; } - - + /// + /// 类型 + /// + [Display(Name = "类型")] + public EnumRecommendType Type { get; set; } #endregion diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs index 60df0022f..9136deffe 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application.Contracts; @@ -32,6 +33,12 @@ public class PositionCodeImportInput : SfsBaseDataImportInputBase [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] public string PartDesc { get; set; } /// + /// 基本计量单位 + /// + [Display(Name = "基本计量单位")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string BasicUom { get; set; } + /// /// 库位 /// [Display(Name = "库位")] @@ -49,6 +56,10 @@ public class PositionCodeImportInput : SfsBaseDataImportInputBase [Display(Name = "标包数量")] [Required(ErrorMessage = "{0}是必填项")] public decimal StdPackQty { get; set; } + /// + /// 类型 + /// + [Display(Name = "类型")] + public EnumRecommendType Type { get; set; } - } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj index 0fe7d3a1e..84d9de372 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj @@ -1,4 +1,4 @@ - + diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs index 07acc53a3..47c444e43 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs @@ -50,5 +50,7 @@ public partial class BasedataApplicationAutoMapperProfile : Profile WorkGroupAutoMapperProfile(); WorkShopAutoMapperProfile(); EquipmentAutoMapperProfile(); + EquipmentAreaAutoMapperProfile(); + KittingAutoMapperProfile(); } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAppService.cs new file mode 100644 index 000000000..4774d50fe --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAppService.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Validation; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application; + +[Authorize] +[Route($"{BasedataConsts.RootPath}EquipmentArea")] +public class EquipmentAreaAppService + : SfsBaseDataWithCodeAppServiceBase + , IEquipmentAreaAppService +{ + private readonly IEquipmentAreaManager _manager; + private new readonly IEquipmentAreaRepository _repository; + private new readonly IEquipmentRepository _eRepository; + + public EquipmentAreaAppService( + IEquipmentAreaRepository repository, + IEquipmentRepository eRepository, + IDistributedCache cache, + IEquipmentAreaManager manager) + : base(repository, cache) + { + _repository = repository; + _eRepository = eRepository; + _manager = manager; + base.CreatePolicyName = EquipmentPermissions.Create; + base.UpdatePolicyName = EquipmentPermissions.Update; + base.DeletePolicyName = EquipmentPermissions.Delete; + } + + [HttpPost("check")] + //[Authorize(ErpLocationPermissions.Default)] + + public virtual async Task CheckAsync(string code, EquipmentAreaCheckInput input) + { + //var result = new AbpValidationResult(); + //if (Repository.GetDbSet().Where(p => p.Code == code).Any()) + //{ + // result.Errors.Add(new ValidationResult($"存在编码为{code}的器具!")); + //} + //if (result.Errors.Count > 0) + //{ + // throw new AbpValidationException(result.Errors); + //} + await Task.CompletedTask.ConfigureAwait(false); + } + + + + [HttpPost("upsert")] + + public virtual async Task UpsertAsync(EquipmentAreaEditInput input) + { + var entity = ObjectMapper.Map(input); + await _repository.UpsertAsync(entity).ConfigureAwait(false); + } + protected override async Task ValidateImportModelAsync(EquipmentAreaImportInput importInput, List validationRresult) + { + + await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false); + //await base.CheckEquipmentAsync(importInput.Code, validationRresult).ConfigureAwait(false); + } + + + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAutoMapperProfile.cs new file mode 100644 index 000000000..34507c831 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Equipments/EquipmentAreaAutoMapperProfile.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using Volo.Abp.AutoMapper; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; + +namespace Win_in.Sfs.Basedata.Application; + +public partial class BasedataApplicationAutoMapperProfile : Profile +{ + private void EquipmentAreaAutoMapperProfile() + { + CreateMap() + + .ReverseMap(); + + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.TenantId) + .Ignore(x => x.Remark) + .Ignore(x => x.ExtraProperties) + .Ignore(x => x.ConcurrencyStamp) + ; + + //CreateMap() + + //CreateMap() + // .Ignore(x => x.ItemCategory) + // .Ignore(x => x.Color); + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.ConcurrencyStamp).Ignore(x => x.Id); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAppService.cs new file mode 100644 index 000000000..570ff326f --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAppService.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using NUglify.Helpers; +using Volo.Abp; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Entities; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Basedata.Kittings.Inputs; +using Win_in.Sfs.Shared; + + +namespace Win_in.Sfs.Basedata.Application; + +[Authorize] +[Route($"{BasedataConsts.RootPath}kitting")] + +public class KittingAppService : SfsBaseDataWithCodeAppServiceBase, IKittingAppService +{ + private new readonly IKittingRepository _repository; + + + private readonly IKittingManager _manager; + + public KittingAppService(IKittingRepository repository, IDistributedCache cache, IKittingManager manager) : base(repository,cache) + { + _repository = repository; + _manager = manager; + //base.CreatePolicyName = KittingPermissions.Create; + //base.UpdatePolicyName = KittingPermissions.Update; + //base.DeletePolicyName = KittingPermissions.Delete; + } + [HttpPost] + [Route("")] + public override async Task CreateAsync(KittingEditInput input) + { + + var detailquery=await _repository.WithDetailsAsync().ConfigureAwait(false); + var first = detailquery.FirstOrDefault(p => p.Code == input.Code); + var codes = input.Details.Select(p => p.PartCode); + if (first != null) + { + + throw new UserFriendlyException($"已存在编码:{input.Code}的Kitting箱"); + + + //var query = from itm in input.Details + // join itm1 in first.Details on itm.PartCode equals itm1.PartCode + // into temp1 + // from tm1 in temp1.DefaultIfEmpty() + // where tm1 == null + // select itm; + //var details = ObjectMapper.Map, List>(query.ToList()); + //foreach (var itm in details) + //{ + // itm.SetId(GuidGenerator.Create()); + // itm.MasterId = first.Id; + // first.AddDetails(itm); + //} + //var entity= await _repository.UpdateAsync(first).ConfigureAwait(false); + + //return ObjectMapper.Map(entity); + } + else + { + var entity = ObjectMapper.Map(input); + entity.SetId(Guid.NewGuid()); + entity.Details.ForEach(item => + { + item.MasterId = entity.Id; + }); + entity = await _repository.InsertAsync(entity).ConfigureAwait(false); + return ObjectMapper.Map(entity); + + } + + //first.Details.Where(p => codes.Contains(p.PartCode)); + //var entity = ObjectMapper.Map(input); + //entity.SetId(Guid.NewGuid()); + //entity.Details.ForEach(item => + //{ + // item.MasterId = entity.Id; + //}); + //entity = await _repository.InsertAsync(entity).ConfigureAwait(false); + //return ObjectMapper.Map(entity); + } + + [HttpPut] + [Route("{id}")] + public override Task UpdateAsync(Guid id, KittingEditInput input) + { + var detailquery = _repository.WithDetails(); + var first = detailquery.FirstOrDefault(p => p.Id == id); + if (first.Code == input.Code) + { + throw new UserFriendlyException($"已存在编码:{input.Code}的Kitting箱"); + } + + var query = from itm in input.Details + join itm1 in first.Details on itm.PartCode equals itm1.PartCode + select itm; + List errors = new List(); + foreach (var itm in query.ToList()) + { + errors.Add(itm.PartCode); + } + if(errors.Count > 0) + { + throw new UserFriendlyException($"零件号${string.Join(",", errors)}已存在"); + + } + + + return base.UpdateAsync(id, input); + } + + [HttpPost("update")] + public virtual async Task UpdateAsync(KittingEditInput input) + { + var entity = ObjectMapper.Map(input); + //var dic=await _repository.GetAsync(r => r.Code == entity.Code); + // if (dic != null) + // { + // await _repository.DeleteAsync(dic); + // } + // await _repository.InsertAsync(entity); + await _repository.UpdateAsync(entity).ConfigureAwait(false); + } + + protected override async Task GetFromRepositoryAsync(string code) + { + var displayName = typeof(KittingDTO).GetNameOfDisplay(); + + var query = await _repository.WithDetailsAsync().ConfigureAwait(false); + + var entity = await query.Where(p => p.Code == code).FirstOrDefaultAsync().ConfigureAwait(false); + + return ObjectMapper.Map(entity); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAutoMapperProfile.cs new file mode 100644 index 000000000..2c675cc43 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Kittings/KittingAutoMapperProfile.cs @@ -0,0 +1,89 @@ +using AutoMapper; +using Volo.Abp.AutoMapper; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Kittings.Inputs; + +namespace Win_in.Sfs.Basedata.Application; + +public partial class BasedataApplicationAutoMapperProfile : Profile +{ + private void KittingAutoMapperProfile() + { + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + + + // CreateMap() + // .IgnoreAuditedObjectProperties() + // .Ignore(x => x.Items) + // .Ignore(x => x.TenantId) + // .Ignore(x => x.ExtraProperties) + // .Ignore(x => x.Remark) + // .Ignore(x => x.ConcurrencyStamp) + // .Ignore(x => x.Id); + + //CreateMap() + // .IgnoreAuditedObjectProperties() + + // .Ignore(x => x.MasterId) + // .Ignore(x => x.Enabled) + // .Ignore(x => x.TenantId) + // .Ignore(x => x.Remark) + // .Ignore(x => x.Id); + + CreateMap() + .IgnoreAuditedObjectProperties() + // .ForMember(x => x.MasterId, y => y.MapFrom(t => t.MasterId)) + ; + + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.ConcurrencyStamp) + .Ignore(x => x.Id); + } + + + //CreateMap() + // ; + + // CreateMap() + // ; + + // CreateMap() + // .IgnoreAuditedObjectProperties() + // .Ignore(x => x.Items) + // .Ignore(x => x.TenantId) + // .Ignore(x => x.ExtraProperties) + // .Ignore(x => x.Remark) + // .Ignore(x => x.ConcurrencyStamp) + // .Ignore(x => x.Id); + + //CreateMap() + // .IgnoreAuditedObjectProperties() + // .ForMember(x => x.Code, y => y.MapFrom(t => t.Item_Code)) + // .ForMember(x => x.Name, y => y.MapFrom(t => t.Item_Name)) + // .ForMember(x => x.Description, y => y.MapFrom(t => t.Item_Description)) + // .ForMember(x => x.Value, y => y.MapFrom(t => t.Item_Value)) + // .Ignore(x => x.MasterId) + // .Ignore(x => x.Enabled) + // .Ignore(x => x.TenantId) + // .Ignore(x => x.Remark) + // .Ignore(x => x.Id); + + //CreateMap() + // .IgnoreAuditedObjectProperties() + // ; + + //CreateMap() + // .IgnoreAuditedObjectProperties() + // .Ignore(x => x.ConcurrencyStamp) + //.Ignore(x => x.Id); + + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs index f80a4ef1a..8f6eccad5 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs @@ -7,6 +7,7 @@ using Volo.Abp.Uow; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Domain; using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application; @@ -32,7 +33,7 @@ public class PositionCodeAppService [UnitOfWork] public override async Task CreateAsync(PositionCodeEditInput input) { - var existEntity = await GetByCodeAsync("W"+input.Code).ConfigureAwait(false); + var existEntity = await GetByCodeAsync(input.Code).ConfigureAwait(false); if (existEntity != null) { throw new UserFriendlyException($"{input.Code} 已存在"); @@ -42,12 +43,26 @@ public class PositionCodeAppService Check.NotNull(itemBasic, "物品代码", $"物品 {input.PartCode} 不存在"); input.PartName = itemBasic.Name; input.PartDesc = itemBasic.Desc1; + input.BasicUom = itemBasic.BasicUom; var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); Check.NotNull(location, "库位代码", $"库位 {input.LocationCode} 不存在"); input.LocationName = location.Name; - input.Code = "W" + input.Code; + if(input.Code.Contains('W')) + { + input.Type = EnumRecommendType.PositionCode; + } + else if(input.Code.Contains('K')) + { + input.Type = EnumRecommendType.KittingCode; + } + else + { + input.Type = EnumRecommendType.WareCode; + } + + return await base.CreateAsync(input).ConfigureAwait(false); } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentArea.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentArea.cs new file mode 100644 index 000000000..9824ea62f --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentArea.cs @@ -0,0 +1,166 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Domain; + +/// +/// 器具基本信息 +/// +public class EquipmentArea : SfsBaseDataAggregateRootBase, IHasCode +{ + + + /// + /// 器具编号 + /// + public string Code { get; set; } + /// + /// 类型 + /// + public string Type { get; set; } + /// + /// 型号 + /// + public string Model { get; set; } + + /// + /// 库位编号 + /// + public string LocCode { get; set; } + + /// + /// 位置编号 + /// + public string AreaCode { get; set; } + + /// + /// 数量 + /// + public decimal Qty { get; set; } + /// + /// 状态 + /// + public int State { get; set; } + ///// + ///// 创建人 + ///// + //public string Creator { get; set; } + ///// + ///// 创建时间 + ///// + //public DateTime CreatTime { get; set; } + + + + + + + + + ///// + ///// 代码 + ///// + //[IgnoreUpdate] + //public string Code { get; set; } + ///// + ///// 名称 + ///// + //public string Name { get; set; } + ///// + ///// 描述 + ///// + //public string Desc1 { get; set; } + ///// + ///// 描述2 + ///// + //public string Desc2 { get; set; } + ///// + ///// 状态 + ///// + //public EnumItemStatus Status { get; set; } + ///// + ///// 制造件 + ///// + //public bool CanMake { get; set; } + ///// + ///// 采购件 + ///// + //[IgnoreUpdate] + //public bool CanBuy { get; set; } + ///// + ///// 外包件 + ///// + //public bool CanOutsourcing { get; set; } + ///// + ///// 回收件 + ///// + //public bool IsRecycled { get; set; } + + //[Display(Name = "类型")] + //public string Type { get; set; } + + //[Display(Name = "种类")] + //public string Category { get; set; } + + //[Display(Name = "分组")] + //public string Group { get; set; } + + //[Display(Name = "颜色")] + //public string Color { get; set; } + + //[Display(Name = "配置")] + //public string Configuration { get; set; } + ///// + ///// 基本计量单位 + ///// + //public string BasicUom { get; set; } + + ///// + ///// 标包数 + ///// + //public decimal StdPackQty { get; set; } + + ///// + ///// ABC类,默认为C + ///// + //public string AbcClass { get; set; } + ///// + ///// 项目 + ///// + //public string Project { get; set; } + ///// + ///// 版本 + ///// + //public string Version { get; set; } + ///// + ///// 工程变革 + ///// + //public string Eco { get; set; } + ///// + ///// 有效期 + ///// + //public int Validity { get; set; } + ///// + ///// 有效期单位 + ///// + //public EnumValidityUnit ValidityUnit { get; set; } + + ///// + ///// 管理类型 + ///// + //public EnumItemManageType ManageType { get; set; } + + ///// + ///// 打印标签用的一个等级 + ///// + //public string Elevel { get; set; } + + ///// + ///// 虚零件 + ///// + //public virtual bool IsPhantom { get; set; } + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentAreaManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentAreaManager.cs new file mode 100644 index 000000000..132e7c577 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/EquipmentAreaManager.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace Win_in.Sfs.Basedata.Domain; + +public class EquipmentAreaManager : DomainService, IEquipmentAreaManager +{ + private readonly IEquipmentAreaRepository _repository; + + public EquipmentAreaManager(IEquipmentAreaRepository repository) + { + _repository = repository; + } + + /// + /// 执行导入 + /// + public virtual async Task ImportDataAsync(List mergeEntities, List deleteEntities = null) + { + if (deleteEntities != null && deleteEntities.Count > 0) + { + await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false); + } + + await _repository.BulkMergeAsync(mergeEntities).ConfigureAwait(false); + } +} + diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaManager.cs new file mode 100644 index 000000000..f4e8156f2 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaManager.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Domain.Services; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IEquipmentAreaManager : IDomainService, IBulkImportService +{ +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaRepository.cs new file mode 100644 index 000000000..2d872dcf1 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Equipments/IEquipmentAreaRepository.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IEquipmentAreaRepository : ISfsBaseDataRepositoryBase, ISfsBulkRepositoryBase +{ + public Task UpsertAsync(EquipmentArea entity); + + public Task InsertAutoSaveAsync(EquipmentArea entity); + + public Task UpsertAsyncByInterface(EquipmentArea entity); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingManager.cs new file mode 100644 index 000000000..fa76f6b0b --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingManager.cs @@ -0,0 +1,20 @@ + +using Volo.Abp.Domain.Services; + +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IKittingManager : IDomainService, IBulkImportService +{ + //Task AddByContainerAsync(Guid traceId, string containerCode); + //// Task> AddMergeAsync(List inventories); + //Task> AddByPackingAsync(Guid traceId, List putawayInventories); + + ///// + ///// 按箱采购收货上架 根据收货时的ERP储位 物品 进行分组上架 只推荐空库位 + ///// + ///// + ///// + //Task CreateByErpCodeAndEmptyCapacityAsync(PutawayJob putawayJob); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingRepository.cs new file mode 100644 index 000000000..d86331d6c --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/IKittingRepository.cs @@ -0,0 +1,9 @@ + +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IKittingRepository : ISfsBaseDataRepositoryBase, ISfsBulkRepositoryBase +{ + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/Kitting.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/Kitting.cs new file mode 100644 index 000000000..acd90d147 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/Kitting.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using NetTopologySuite.Index.HPRtree; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared; + + +namespace Win_in.Sfs.Basedata.Domain; + +/// +/// Kitting箱 +/// +[Serializable] +[Display(Name = "Kitting箱")] +public class Kitting : SfsBaseDataAggregateRootBase, IHasCode +{ + public string Code { get ; set ; } + public string Name { get ; set ; } + public virtual ICollection Details { get; set; } = new List(); + public void SetId(Guid id) + { + this.Id = id; + } + + public void AddDetails(KittingDetail item) + { + Details.Add(item); + } + + + + + ///// + ///// 设置任务明细的实际库位和实际数量 + ///// + ///// + ///// + ///// + ///// + //public virtual async Task SetDetail(Guid id, string partCode, string desc1, string desc2, decimal qty, string conf) + //{ + // var detail = GetDetail(id); + // detail.PartCode = partCode; + // detail.Desc1 = desc1; + // detail.Desc2 = desc2; + // detail.Qty = qty; + // detail.Conf = conf; + + // await Task.CompletedTask.ConfigureAwait(false); + //} +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingDetail.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingDetail.cs new file mode 100644 index 000000000..b1af95693 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingDetail.cs @@ -0,0 +1,47 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public class KittingDetail : AuditedEntity, IMultiTenant, IRemark + +{ + public Guid MasterId { get; set; } + /// + /// 物料编码 + /// + public string PartCode { set; get; } + /// + /// 描述1 + /// + public string Desc1 { set; get; } + /// + /// 描述2 + /// + public string Desc2 { set; get; } + /// + /// 包装数量 + /// + public decimal Qty { set; get; } + + /// + /// 配置 + /// + public string Conf { set; get; } + + public Guid? TenantId { set; get; } + + public string Remark { get; set; } + + + public void SetId(Guid guid) + { + Id= guid; + } + + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingManager.cs new file mode 100644 index 000000000..0be4b22b2 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Kittings/KittingManager.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Volo.Abp; +using Volo.Abp.Users; +using Volo.Abp.Validation; + +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; + + +namespace Win_in.Sfs.Basedata.Domain; + +public class KittingManager : IKittingManager +{ + + + private readonly IKittingRepository _repository; + + public KittingManager(IKittingRepository repository, IWarehouseRepository warehourseRepository, ILocationRepository locationRepository) + { + _repository = repository; + } + + /// + /// 执行导入 + /// + public virtual async Task ImportDataAsync(List mergeEntities, List deleteEntities = null) + { + if (deleteEntities != null && deleteEntities.Count > 0) + { + await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false); + } + + await _repository.BulkMergeAsync(mergeEntities).ConfigureAwait(false); + + var insertDetails = new List(); + + foreach (var item in mergeEntities) + { + insertDetails.AddRange(item.Details); + } + + await _repository.BulkInsertAsync(insertDetails).ConfigureAwait(false); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs index 8ec924bc8..751e5561f 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Domain; @@ -31,6 +32,11 @@ public class PositionCode : SfsBaseDataAggregateRootBase, IHasCode [Display(Name = "物料描述")] public string PartDesc { get; set; } /// + /// 基本计量单位 + /// + [Display(Name = "基本计量单位")] + public string BasicUom { get; set; } + /// /// 库位 /// [Display(Name = "库位")] @@ -39,12 +45,16 @@ public class PositionCode : SfsBaseDataAggregateRootBase, IHasCode /// 库位名称 /// [Display(Name = "库位名称")] - public string LocationName { get; set; } + public string LocationName { get; set; } /// /// 标包数量 /// [Display(Name = "标包数量")] public decimal StdPackQty { get; set; } - + /// + /// 类型 + /// + [Display(Name = "类型")] + public EnumRecommendType Type { get; set; } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs index f35d0caed..5f1efe44d 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs @@ -67,6 +67,8 @@ public static class BasedataDbContextModelCreatingExtensions //设置decimal的默认小数位数 builder.ConfigurePrecisionOfDecimal(); builder.ConfigurePositionCode(options); + builder.ConfigureEquipmentArea(options); + builder.ConfigureKitting(options); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs index 99c329146..1fe9d93ff 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs @@ -69,6 +69,8 @@ public class BasedataEntityFrameworkCoreModule : AbpModule context.Services.AddTransient(); context.Services.AddTransient(); context.Services.AddTransient(); + context.Services.AddTransient(); + context.Services.AddTransient(); ConfigureEntity(); } @@ -80,6 +82,11 @@ public class BasedataEntityFrameworkCoreModule : AbpModule { orderOptions.DefaultWithDetailsFunc = query => query.Include(o => o.Items); }); + options.Entity(orderOptions => + { + orderOptions.DefaultWithDetailsFunc = query => query.Include(o => o.Details); + }); + }); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..cda151bd4 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaDbContextModelCreatingExtensions.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.EntityFrameworkCore; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public static class EquipmentAreaDbContextModelCreatingExtensions +{ + public static void ConfigureEquipmentArea(this ModelBuilder builder, BasedataModelBuilderConfigurationOptions options) + { + builder.Entity(b => + { + //Configure table & schema name + b.ToTable(options.TablePrefix + nameof(EquipmentArea), options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + //Configure Sfs base properties + b.ConfigureSfsBase(); + + //Properties + b.Property(q => q.Code).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength).IsRequired(true); + b.Property(q => q.Model).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.LocCode).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.Type).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.AreaCode).HasMaxLength(SfsPropertyConst.CodeLength); + + + b.HasIndex(q => new { q.Code }); + b.HasIndex(q => new { q.AreaCode }); + }); + } +} + + +/// +/// 器具编号 +/// diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaEfCoreRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaEfCoreRepository.cs new file mode 100644 index 000000000..99b6cbd46 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Equipments/EquipmentAreaEfCoreRepository.cs @@ -0,0 +1,56 @@ +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public class EquipmentAreaEfCoreRepository : SfsBaseDataEfCoreRepositoryBase, IEquipmentAreaRepository, ISfsBulkRepositoryBase +{ + public EquipmentAreaEfCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + public virtual async Task UpsertAsyncByInterface(EquipmentArea entity) + { + var dbSet = await GetDbSetAsync().ConfigureAwait(false); + var exist = await dbSet.FirstOrDefaultAsync(p => p.Code == entity.Code && p.AreaCode==entity.AreaCode).ConfigureAwait(false); + if (exist == null) + { + var insRet = await InsertAsync(entity).ConfigureAwait(false); + } + else + { + exist.State = entity.State; + exist.Model = entity.Model; + exist.Type = entity.Type; + exist.LastModificationTime = DateTimeOffset.Now.DateTime; + + } + } + public virtual async Task UpsertAsync(EquipmentArea entity) + { + var dbSet = await GetDbSetAsync().ConfigureAwait(false); + var exist = await dbSet.FirstOrDefaultAsync(p => p.Code == entity.Code && p.AreaCode==entity.AreaCode).ConfigureAwait(false); + if (exist == null) + { + var insRet = await InsertAsync(entity).ConfigureAwait(false); + } + else + { + exist.State = entity.State; + exist.Model = entity.Model; + exist.Type = entity.Type; + exist.LastModificationTime = DateTimeOffset.Now.DateTime; + + } + + + } + + public virtual async Task InsertAutoSaveAsync(EquipmentArea entity) + { + _ = await InsertAsync(entity, true, GetCancellationToken()).ConfigureAwait(false); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..ec56fd4f3 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingDbContextModelCreatingExtensions.cs @@ -0,0 +1,76 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.EntityFrameworkCore; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public static class KittingDbContextModelCreatingExtensions +{ + public static void ConfigureKitting(this ModelBuilder builder, BasedataModelBuilderConfigurationOptions options) + { + builder.Entity(b => + { + //Configure table & schema name + b.ToTable(options.TablePrefix + nameof(Kitting), options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + //Configure Sfs base properties + b.ConfigureSfsBase(); + b.Property(p=>p.Name).HasMaxLength(SfsPropertyConst.DescLength); + //Properties + b.Property(q => q.Code).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + //Relations + b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterId).IsRequired(); + + + + + + //Indexes + b.HasIndex(q => new { q.Code }).IsUnique(); + }); + builder.Entity(b => + { + + //Configure table & schema name + b.ToTable(options.TablePrefix + nameof(KittingDetail), options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + //Configure Sfs base properties + b.ConfigureSfsBase(); + + b.Property(p => p.Desc1).HasMaxLength(SfsPropertyConst.DescLength); + //Properties + b.Property(q => q.Desc2).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + //Relations + b.Property(q => q.MasterId).IsRequired(); + //Indexes + + }); + } + //public static void ConfigureCustomer(this ModelBuilder builder, BasedataModelBuilderConfigurationOptions options) + //{ + // builder.Entity(b => + // { + // //Configure table & schema name + // b.ToTable(options.TablePrefix + nameof(Customer), options.Schema); + // //Configure ABP properties + // b.ConfigureByConvention(); + // //Configure Sfs base properties + // b.ConfigureSfsBase(); + + // //Properties + // b.Property(q => q.Code).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + // b.Property(q => q.Name).HasMaxLength(SfsPropertyConst.NameLength); + // b.Property(q => q.Description).HasMaxLength(SfsPropertyConst.DescLength); + + // //Relations + // //None + + // //Indexes + // b.HasIndex(q => new { q.Code }).IsUnique(); + // }); + //} +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingEfCoreRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingEfCoreRepository.cs new file mode 100644 index 000000000..3a2da3b64 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/Kittings/KittingEfCoreRepository.cs @@ -0,0 +1,78 @@ + +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public class KittingEfCoreRepository : SfsBaseDataEfCoreRepositoryBase, IKittingRepository, ISfsBulkRepositoryBase +{ + public KittingEfCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public virtual async Task UpsertAsync(Kitting entity) + { + var dbSet = await GetDbSetAsync().ConfigureAwait(false); + var exist = await dbSet.FirstOrDefaultAsync(p => p.Code == entity.Code).ConfigureAwait(false); + if (exist == null) + { + var insRet = await InsertAsync(entity).ConfigureAwait(false); + } + else + { + + + + //exist.Code = entity.Code; + exist.Name = entity.Name; + //exist.Address = entity.Address; + //exist.Country = entity.Country; + //exist.City = entity.City; + //exist.Phone = entity.Phone; + //exist.Fax = entity.Fax; + //exist.PostID = entity.PostID; + //exist.Contacts = entity.Contacts; + //exist.Currency = entity.Currency; + //exist.IsActive = entity.IsActive; + //exist.Type = entity.Type; + exist.TenantId = entity.TenantId; + exist.Remark = entity.Remark; + + } + // var context = await GetDbContextAsync(); + // await context.SingleMergeAsync(entity, options => + // { + // //业务主键,可以是联合主键 + // options.ColumnPrimaryKeyExpression = c => new + // { + // c.Company, + // c.Code + // }; + // //需要在更新时忽略的属性 + // options.IgnoreOnMergeUpdateExpression = c => new + // { + // c.Id, + // }; + // }); + } + + + public virtual async Task UpsertAsyncByInterface(Kitting entity) + { + //var dbSet = await GetDbSetAsync().ConfigureAwait(false); + //var exist = await dbSet.FirstOrDefaultAsync(p => p.Code == entity.Code).ConfigureAwait(false); + //if (exist == null) + //{ + // var insRet = await InsertAsync(entity).ConfigureAwait(false); + //} + //else + //{ + // exist.Name = entity.Name; + // exist.ShortName = entity.ShortName; + // exist.LastModificationTime = DateTime.Now; + //} + } +} diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs new file mode 100644 index 000000000..f56c9c2ab --- /dev/null +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; + +namespace Win_in.Sfs.Shared.Domain.Shared; + +/// +/// 推荐类型 +/// +public enum EnumRecommendType +{ + /// + /// 位置码 + /// + [Display(Name = "位置码")] + PositionCode = 1, + + /// + /// 器具码 + /// + [Display(Name = "器具码")] + WareCode = 2, + + /// + /// Kitting箱码 + /// + [Display(Name = "Kitting箱码")] + KittingCode = 3, +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/Inputs/IssueJobDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/Inputs/IssueJobDetailInput.cs index e21c6f385..b059524c9 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/Inputs/IssueJobDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/Inputs/IssueJobDetailInput.cs @@ -121,4 +121,14 @@ public class IssueJobDetailInput : SfsJobRecommendFromDetailInputBase, IHasToLoc /// [Display(Name = "每次配送数量")] public decimal DeliveryQty { get; set; } + + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/Inputs/IssueNoteDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/Inputs/IssueNoteDetailInput.cs index b85bdb0a2..0d8769392 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/Inputs/IssueNoteDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/Inputs/IssueNoteDetailInput.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application.Contracts; @@ -39,4 +40,14 @@ public class IssueNoteDetailInput : SfsStoreRecommendFromDetailWithFromToInputBa [Display(Name = "在途库库位")] public string OnTheWayLocationCode { get; set; } + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs new file mode 100644 index 000000000..2d249d85e --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Win_in.Sfs.Wms.Store.Notes.ProductRecycleNotes.DTOs; +public class ProductRecycleNoteDetailExtendDto +{ + + [Display(Name ="报废类型")] + public string Type { get; set; } + [Display(Name = "物料代码")] + public string ItemCode { get; set; } + [Display(Name = "报废库位")] + + public string LocCode { get; set; } + [Display(Name = "数量")] + public Decimal Qty { get; set; } + + [Display(Name = "报废原因")] + public string Reason { get; set; } + + + +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/MaterialRequests/Inputs/MaterialRequestDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/MaterialRequests/Inputs/MaterialRequestDetailInput.cs index df430f726..058c47f49 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/MaterialRequests/Inputs/MaterialRequestDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/MaterialRequests/Inputs/MaterialRequestDetailInput.cs @@ -71,4 +71,15 @@ public class MaterialRequestDetailInput : SfsStoreDetailWithQtyInputBase [Display(Name = "明细状态")] public EnumStatus Status { get; set; } + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs index db384ee8f..4e3ec69d7 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using Volo.Abp.Data; using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Wms.Store.Notes.ProductRecycleNotes.DTOs; /// /// 成品回收记录 @@ -91,6 +92,60 @@ public class ProductRecycleNoteAppService : } } + + /// + /// 导出报废 + /// + [HttpPost("export-scrap")] + public virtual async Task ExportScrapAsync(SfsExportRequestInput requestInput) + { + try + { + var pagedResult = await GetPagedListByFilterAsync( + new SfsStoreRequestInputBase() { Condition = requestInput.Condition }, + true).ConfigureAwait(false); + + var items = pagedResult.Items.ToList(); + + await SetNoteAndBackFlushDetailsAsync(pagedResult.Items.ToList()).ConfigureAwait(false); + + var exports = BuildProductRecycleNoteAndBackFlushDetailExport(items); + List exportlist=new List(); + foreach (var itm in exports) + { + exportlist.Add(new ProductRecycleNoteDetailExtendDto() + { + + ItemCode = itm.ItemCode, + LocCode = itm.LocationCode, + Reason = string.Empty, + Qty = itm.Qty, + Type = "客户退拆" + + + + }); + } + + + + return ExportImportService.Export(exports); + } + catch (Exception ex) + { + Logger.LogException(ex); + throw new Exception(ex.Message); + } + } + + + + + + + + + protected virtual async Task SetNoteAndBackFlushDetailsAsync(List dtos) { await Task.CompletedTask.ConfigureAwait(false); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs index e29d5ee57..209abd419 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs @@ -214,6 +214,10 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase public decimal DeliveryQty { get; set; } + + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/IssueNoteDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/IssueNoteDetail.cs index 4ba4f018b..bd3fad75b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/IssueNoteDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/IssueNoteDetail.cs @@ -1,4 +1,5 @@ using System; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Domain; @@ -29,4 +30,14 @@ public class IssueNoteDetail : SfsStoreRecommendFromDetailWithFromToEntityBase /// 在途库库位 /// public string OnTheWayLocationCode { get; set; } + + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs index 1c59a4fda..19420cba8 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs @@ -90,4 +90,15 @@ public class MaterialRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLoca /// [NotMapped] public decimal NotFinishQty => Qty - ReceivedQty; + + /// + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/IssueJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/IssueJobDbContextModelCreatingExtensions.cs index 99e7a6c1f..f13b3c4ac 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/IssueJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/IssueJobDbContextModelCreatingExtensions.cs @@ -56,6 +56,7 @@ public static class IssueJobDbContextModelCreatingExtensions b.Property(q => q.TruncType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); b.Property(q => q.PlannedSplitRule).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); b.Property(q => q.OnTheWayLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); //Relations //None diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/IssueNoteDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/IssueNoteDbContextModelCreatingExtensions.cs index a29f693e5..3cbe63637 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/IssueNoteDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/IssueNoteDbContextModelCreatingExtensions.cs @@ -50,6 +50,7 @@ public static class IssueNoteDbContextModelCreatingExtensions b.Property(q => q.OnTheWayLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.FromStatus).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); b.Property(q => q.ToStatus).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); + b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); //Relations diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/MaterialRequests/MaterialRequestDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/MaterialRequests/MaterialRequestDbContextModelCreatingExtensions.cs index 27f04bab8..cdfbf4737 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/MaterialRequests/MaterialRequestDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/MaterialRequests/MaterialRequestDbContextModelCreatingExtensions.cs @@ -54,6 +54,7 @@ public static class MaterialRequestDbContextModelCreatingExtensions b.Property(q => q.IssuedQty).HasPrecision(18, 6); b.Property(q => q.ReceivedQty).HasPrecision(18, 6); b.Property(q => q.Status).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); + b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion(); //Relations diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/MaterialRequestAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/MaterialRequestAutoMapperProfile.cs index 85bb07126..63046f1e2 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/MaterialRequestAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/MaterialRequestAutoMapperProfile.cs @@ -123,9 +123,11 @@ public partial class StoreEventAutoMapperProfile : Profile .Ignore(x => x.PlannedSplitRule) .Ignore(x => x.DeliveryQty) .Ignore(x => x.RequestLocationCode) - .Ignore(x => x.ToLocationCode) + .Ignore(x => x.ToLocationCode) .Ignore(x => x.ProdLine) .Ignore(x => x.WorkStation) + .Ignore(x => x.PositionCode) + .Ignore(x => x.RecommendType) .IgnoreIHasRecommendAndHandledFrom(); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs index 830445329..4f9c8d67f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs @@ -244,6 +244,8 @@ public class MaterialRequestEventHandler detail.RequestLocationCode = materialRequestDetail.ToLocationCode; detail.WorkStation = materialRequestDetail.WorkStation; detail.ExpiredTime = materialRequestDetail.ExpiredTime; + detail.PositionCode = materialRequestDetail.PositionCode; + detail.RecommendType = materialRequestDetail.RecommendType; detail.RecommendPackingCode = balance.PackingCode; detail.RecommendContainerCode = balance.ContainerCode;