diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs index b4b108ba5..d7b026c96 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs @@ -55,3 +55,53 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput public string OANumber { get; set; } } + + +public class UnplannedIssueRequestImportDto +{ + + /// + /// 料号 + /// + [Display(Name = "料号")] + [Required(ErrorMessage = "{0}是必填项")] + public string ItemCode { get; set; } + [Display(Name = "数量")] + [Required(ErrorMessage = "{0}是必填项")] + public decimal Qty { get; set; } + /// + /// 调出库位 + /// + [Display(Name = "调出库位")] + [Required(ErrorMessage = "{0}是必填项")] + public string LocationErpCode { get; set; } + /// + /// 专案 + /// + [Display(Name = "专案")] + [Required(ErrorMessage = "{0}是必填项")] + public string CaseCode { get; set; } + /// + /// 项目分类 + /// + [Display(Name = "项目分类")] + [Required(ErrorMessage = "{0}是必填项")] + public string ProjCapacityCode { get; set; } + + /// + /// 次交易码 + /// + [Display(Name = "次交易码")] + [Required(ErrorMessage = "{0}是必填项")] + public string OnceBusiCode { get; set; } + /// + /// 说明 + /// + [Display(Name = "说明")] + public string Explain { get; set; } +} + + + + + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs index 9eeb6fd15..f4f1f1a54 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs @@ -1,6 +1,19 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Threading.Tasks; +using Castle.Components.DictionaryAdapter; +using Irony; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Omu.ValueInjecter; +using Volo.Abp.Data; +using Volo.Abp.ObjectMapping; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; @@ -15,13 +28,21 @@ public class UnplannedIssueJobAppService IUnplannedIssueJobAppService { - private readonly IUnplannedIssueJobManager _unplannedIssueJobManager; + private readonly IUnplannedIssueJobManager _unplannedIssueJobManager; + private readonly ILocationAppService _locationAppService; + private readonly IBalanceAppService _balanceAppService; + private readonly IExpectOutAppService _expectOutAppService; + public UnplannedIssueJobAppService( - IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager + IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService ) : base(repository, unplannedIssueJobManager) { _unplannedIssueJobManager = unplannedIssueJobManager; -} + _locationAppService = locationAppService; + _balanceAppService = balanceAppService; + _expectOutAppService = expectOutAppService; + + } /// /// 根据申请单号作废任务 @@ -38,133 +59,200 @@ public class UnplannedIssueJobAppService } } - ///// - ///// 根据储位推荐 - ///// - ///// - //[HttpPost("create-by-recommend")] - //public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) - //{ - // List useBalancesOut = new EditableList(); - // var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); - // await _repository.InsertManyAsync(jobs).ConfigureAwait(false); - // var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false); - // await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); - //} - - //private async Task> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List useBalancesOut) - //{ - // List jobs = new EditableList(); - - // foreach (var requestDtoDetail in requestDto.Details) - // { - // var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false); - // var input = new RecommendBalanceRequestInput - // { - // ItemCode = requestDtoDetail.ItemCode, - // Qty = requestDtoDetail.Qty, - // Statuses = new EditableList { EnumInventoryStatus.OK }, - // Locations = locationCodes.Select(p => p.Code).ToList(), - // IsPackingCode = false - // }; - // var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); - // usableList = usableList - // .OrderBy(p => p.Lot) - // .ThenBy(p => p.PutInTime) - // .ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料 - // .ThenBy(p => p.LocationCode) - // .ThenBy(p => p.PackingCode) - // .ToList(); - - // decimal qty = 0; - // //实际要用库存 - // List useBalances = new List(); - // foreach (var balanceDto in usableList) - // { - // if (qty >= requestDtoDetail.Qty) - // { - // break; - // } - - // if (qty + balanceDto.Qty > requestDtoDetail.Qty) - // { - // qty += requestDtoDetail.Qty - balanceDto.Qty; - // } - // else - // { - // qty += balanceDto.Qty; - // } - - // useBalances.Add(balanceDto); - // useBalancesOut.Add(balanceDto); - // } - - // foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) - // { - // var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); - // var job = new UnplannedReceiptJob(); - - // job.UnplannedReceiptRequestNumber = requestDto.Number; - // job.JobType = EnumJobType.UnplannedReceiptJob; - // job.JobStatus = EnumJobStatus.Open; - // job.IsAutoComplete = false; - // job.OANumber = requestDto.OANumber; - // job.Details = new List(); - // job.WarehouseCode = balanceDtoGroup.First().WarehouseCode; - - // foreach (var balanceDto in balanceDtoGroup) - // { - // var jobDetail = new UnplannedReceiptJobDetail(); - // jobDetail.CaseCode = requestDtoDetail.CaseCode; - // jobDetail.Explain = requestDtoDetail.Explain; - // jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; - // jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; - // jobDetail.ReasonCode = requestDtoDetail.ReasonCode; - // jobDetail.ItemCode = requestDtoDetail.ItemCode; - // jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; - // jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; - // jobDetail.ItemName = requestDtoDetail.ItemName; - // jobDetail.RecommendArriveDate = balanceDto.ArriveDate; - // jobDetail.RecommendContainerCode = string.Empty; - // jobDetail.RecommendExpireDate = balanceDto.ExpireDate; - // jobDetail.RecommendLot = balanceDto.Lot; - // jobDetail.RecommendPackingCode = balanceDto.PackingCode; - // jobDetail.RecommendProduceDate = balanceDto.ProduceDate; - // jobDetail.RecommendQty = balanceDto.Qty; - // jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; - // jobDetail.RecommendToLocationArea = balanceDto.LocationArea; - // jobDetail.RecommendToLocationCode = balanceDto.LocationCode; - // jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode; - // jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup; - // jobDetail.RecommendToWarehouseCode = balanceDto.WarehouseCode; - - // job.Details.Add(jobDetail); - // } - - // if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的 - // { - // await SendDimensionalStorehouseAsync().ConfigureAwait(false); - // job.JobStatus = EnumJobStatus.Wait; - // } - - // jobs.Add(job); - // } - // } - - // return jobs; - //} - - //private async Task> BuildExpectOutAsync(List balanceDtos) - //{ - // return ObjectMapper.Map, List>(balanceDtos); - //} - - ///// - ///// 给立体库发送 - ///// - ///// - //public async Task SendDimensionalStorehouseAsync() - //{ - // throw new System.NotImplementedException(); - //} + + /// + /// 根据储位推荐 + /// + /// + [HttpPost("create-by-recommend")] + public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) + { + List useBalancesOut = new EditableList(); + var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); + await _repository.InsertManyAsync(jobs.ToList()).ConfigureAwait(false); + var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false); + await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); + } + + + + + + + + + + + private async Task> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List useBalancesOut) + { + List jobs = new EditableList(); + + foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细 + { + var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false);//获取存放库位 + var input = new RecommendBalanceRequestInput + { + ItemCode = requestDtoDetail.ItemCode, + Qty = requestDtoDetail.Qty, + Statuses = new EditableList { EnumInventoryStatus.OK }, + Locations = locationCodes.Select(p => p.Code).ToList(), + IsPackingCode = false + }; + var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存 + usableList = usableList + .OrderBy(p => p.Lot) + .ThenBy(p => p.PutInTime) + .ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料 + .ThenBy(p => p.LocationCode) + .ThenBy(p => p.PackingCode) + .ToList(); + + decimal qty = 0; + //实际要用库存 + List useBalances = new List(); + foreach (var balanceDto in usableList) + { + if (qty >= requestDtoDetail.Qty) + { + break; + } + if (qty + balanceDto.Qty > requestDtoDetail.Qty) + { + qty += requestDtoDetail.Qty - balanceDto.Qty; + } + else + { + qty += balanceDto.Qty; + } + + useBalances.Add(balanceDto); + useBalancesOut.Add(balanceDto); + } + + foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) + { + var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); + var job = new UnplannedIssueJob(); + + job.UnplannedIssueRequestNumber= requestDto.Number; + job.JobType = EnumJobType.UnplannedIssueJob; + job.JobStatus = EnumJobStatus.Open; + job.IsAutoComplete = false; + job.OANumber = requestDto.OANumber; + job.Details = new List(); + job.FacDetails = new List(); + job.WarehouseCode = balanceDtoGroup.First().WarehouseCode; + + foreach (var balanceDto in balanceDtoGroup) + { + var jobDetail = new UnplannedIssueJobDetail(); + jobDetail.CaseCode = requestDtoDetail.CaseCode; + jobDetail.Explain = requestDtoDetail.Explain; + jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; + jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; + jobDetail.ReasonCode = requestDtoDetail.ReasonCode; + jobDetail.ItemCode = requestDtoDetail.ItemCode; + jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; + jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; + jobDetail.ItemName = requestDtoDetail.ItemName; + jobDetail.RecommendArriveDate = balanceDto.ArriveDate; + jobDetail.RecommendContainerCode = string.Empty; + jobDetail.RecommendExpireDate = balanceDto.ExpireDate; + jobDetail.RecommendLot = balanceDto.Lot; + jobDetail.RecommendPackingCode = balanceDto.PackingCode; + jobDetail.RecommendProduceDate = balanceDto.ProduceDate; + jobDetail.RecommendQty = balanceDto.Qty; + jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; + + var jobfacDetail = new UnplannedIssueJobFacDetail(); + jobfacDetail.CaseCode = requestDtoDetail.CaseCode; + jobfacDetail.Explain = requestDtoDetail.Explain; + jobfacDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; + jobfacDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; + jobfacDetail.ReasonCode = requestDtoDetail.ReasonCode; + jobfacDetail.ItemCode = requestDtoDetail.ItemCode; + jobfacDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; + jobfacDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; + jobfacDetail.ItemName = requestDtoDetail.ItemName; + jobfacDetail.RecommendArriveDate = balanceDto.ArriveDate; + jobfacDetail.RecommendContainerCode = string.Empty; + jobfacDetail.RecommendExpireDate = balanceDto.ExpireDate; + jobfacDetail.RecommendLot = balanceDto.Lot; + jobfacDetail.RecommendPackingCode = balanceDto.PackingCode; + jobfacDetail.RecommendProduceDate = balanceDto.ProduceDate; + jobfacDetail.RecommendQty = balanceDto.Qty; + jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; + //jobDetail.recommendRecommendToLocationArea = balanceDto.LocationArea; + //jobDetail.RecommendToLocationCode = balanceDto.LocationCode; + //jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode; + //jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup; + //jobDetail.RecommendToWarehouseCode = balanceDto.WarehouseCode; + + job.Details.Add(jobDetail); + job.FacDetails.Add(jobfacDetail); + + } + + //job.SetProperty("details", System.Text.Json.JsonSerializer.Serialize(job.Details)); + + + if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的 + { + await SendDimensionalStorehouseAsync().ConfigureAwait(false); + job.JobStatus = EnumJobStatus.Wait; + } + + jobs.Add(job); + } + } + + return jobs; + } + + private async Task> BuildExpectOutAsync(List balanceDtos) + { + return ObjectMapper.Map, List>(balanceDtos); + } + + /// + /// 给立体库发送 + /// + /// + public async Task SendDimensionalStorehouseAsync() + { + throw new System.NotImplementedException(); + } + /// + /// 创建补料记录实体 + /// + /// + /// + private async Task BuildUnplannedIssueNoteAsync(UnplannedIssueJob unplannedIssueJobDto) + { + //var createInput = + // ObjectMapper.Map(unplannedIssueJobDto); + var issuenote = new UnplannedIssueNoteEditInput(); + + issuenote.DeptCode = unplannedIssueJobDto.DeptCode; + issuenote.DeptName = unplannedIssueJobDto.DeptName; + issuenote.BuildDate = unplannedIssueJobDto.BuildDate; + issuenote.UnplannedIssueRequestNumber = unplannedIssueJobDto.UnplannedIssueRequestNumber; + issuenote.JobNumber = unplannedIssueJobDto.Number; + issuenote.UnplannedIssueType = issuenote.UnplannedIssueType; + issuenote.OANumber = issuenote.OANumber; + issuenote.Details = new List(); + foreach (var detail in unplannedIssueJobDto.FacDetails) + { + var entity=new UnplannedIssueNoteDetailInput(); + entity.InjectFrom(detail); + entity.Qty = detail.HandledQty; + issuenote.Details.Add(entity); + } + await Task.CompletedTask.ConfigureAwait(false); + return issuenote; + } + + + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs index 563028731..a13eac32b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs @@ -1,14 +1,26 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Kittings.Inputs; +using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; +using Win_in.Sfs.Shared.Application.Contracts.ExportAndImport; +using System.Linq; namespace Win_in.Sfs.Wms.Store.Application; - -[Authorize] +[AllowAnonymous] +//[Authorize] [Route($"{StoreConsts.RootPath}unplanned-issue-request")] public abstract class UnplannedIssueRequestAppService : @@ -18,13 +30,18 @@ public abstract class UnplannedIssueRequestAppService : { private readonly IUnplannedIssueRequestManager _unplannedIssueRequestManager; + protected readonly IExportImportService _excelService; + + public UnplannedIssueRequestAppService( IUnplannedIssueRequestRepository repository, - IUnplannedIssueRequestManager unplannedIssueRequestManager + IUnplannedIssueRequestManager unplannedIssueRequestManager, + IExportImportService excelService ) : base(repository, unplannedIssueRequestManager) { _unplannedIssueRequestManager = unplannedIssueRequestManager; + _excelService = excelService; } /// @@ -59,4 +76,36 @@ public abstract class UnplannedIssueRequestAppService : var dto = ObjectMapper.Map(entity); return dto; } + + [HttpPost("import")] + [Consumes("multipart/form-data")] + + public override async Task ImportAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file) + { + //var query = _repository.WithDetails().AsNoTracking(); + using var ms = new MemoryStream(); + await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); + var inputFileBytes = ms.GetAllBytes(); + var importList = _excelService.Import(inputFileBytes); + + + + + + //var checklist = importList.GroupBy(p => new { p.Code, p.ItemCode }).Where(g => g.Count() > 1).Select(p => new { Code = p.Key.Code, PartCode = p.Key.ItemCode });//导入重复报错 //检测是否导入重复 + //List errors = new List(); + + //if (errors.Count > 0) + //{ + // var fileContent = _excelService.Export(errors); + // return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName = "错误信息" }; + //} + + //var fileContent1 = _excelService.Export(importList); + // return new TestResult(fileContent1.FileContents, ExportImportService.ContentType) { FileDownloadName = "Kitting导入文件" }; + return new JsonResult(new { Code = 200, FileDownloadName = "" }); + } + + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs index a0678442f..2d88eecfd 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs @@ -1,16 +1,24 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.IO; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using Omu.ValueInjecter; using Volo.Abp; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; using Volo.Abp.Users; using Win_in.Sfs.Auth.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Kittings.Inputs; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Application.Contracts.ExportAndImport; using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; @@ -28,13 +36,14 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA private readonly IBalanceAppService _balanceAppService; private readonly ILocationAppService _locationAppService; private readonly ITransactionTypeAclService _transactionTypeAclService; + //private readonly IExportImportService _excelService; public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository, IUnplannedIssueRequestManager unplannedIssueRequestManager, - IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, - ITransactionTypeAclService transactionTypeAclService - ) : base(repository, unplannedIssueRequestManager) + IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService, + ITransactionTypeAclService transactionTypeAclService + ) : base( repository, unplannedIssueRequestManager, excelService) { _unplannedIssueRequestManager = unplannedIssueRequestManager; _departmentApp = departmentApp; @@ -62,19 +71,128 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA entity.AutoAgree = true; entity.AutoHandle = true; entity.DirectCreateNote = false; - //if (entity.UnplannedIssueType == EnumUnplannedIssueType.Wip) - //{ - // entity.DirectCreateNote = true; - //} - //else - //{ - - //} await _unplannedIssueRequestManager.CreateAsync(entity).ConfigureAwait(false); var dto = ObjectMapper.Map(entity); return dto; } + /// + /// 自定义导入接口 + /// + /// + /// + /// + /// + [HttpPost("import-dongyang")] + public async Task ImportDYAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file) + { + + try + { + using var ms = new MemoryStream(); + await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); + var inputFileBytes = ms.GetAllBytes(); + var importList = _excelService.Import(inputFileBytes).ToList(); + await CreateByDYOAsync(importList).ConfigureAwait(false); + + + //if (errors.Count > 0) + //{ + // var fileContent = _excelService.Export(errors); + // return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName = "错误信息" }; + //} + + var fileContent1 = _excelService.Export(importList); + // return new TestResult(fileContent1.FileContents, ExportImportService.ContentType) { FileDownloadName = "Kitting导入文件" }; + return new JsonResult(new { Code = 200, FileDownloadName = fileContent1.FileDownloadName }); + } + catch (Exception e) + { + throw new UserFriendlyException(e.Message); + } + } + + + /// + /// OA接口 + /// + /// + /// + [HttpPost("create-dongyang")] + + public async Task CreateByAsync(List p_list) + { + + return await CreateByDYOAsync(p_list, true).ConfigureAwait(false); + } + + + + + protected async Task CreateByDYOAsync(List p_list, bool isAutoSubmit=false) + { + + UnplannedIssueRequest request = new UnplannedIssueRequest(); + request.SetId(GuidGenerator.Create()); + request.AutoCompleteJob = false; + request.AutoSubmit = isAutoSubmit; + request.AutoAgree = false; + request.AutoHandle = false; + request.DirectCreateNote = false; + List detailList = new List(); + foreach (var itm in p_list) + { + var detail = new UnplannedIssueRequestDetail(); + + detail.ItemCode = itm.ItemCode; + detail.Qty = itm.Qty; + detail.LocationErpCode = itm.LocationErpCode; + detail.LocationCode = "Random"; + detail.WarehouseCode ="Random"; + detail.LocationGroup ="Random"; + detail.LocationArea = "Random"; + + await SetDetailPropertiesAsync(detail).ConfigureAwait(false); + detailList.Add(detail); + } + + request.Details = detailList; + await _unplannedIssueRequestManager.CreateAsync(request).ConfigureAwait(false); + var dto = ObjectMapper.Map(request); + return dto; + + } + private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail) + { + var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); + CheckItemBasic(itemBasic, detail.ItemCode); + //await CheckOnceBusiCodeAsync(detail).ConfigureAwait(false); + if (itemBasic != null) + { + detail.ItemCode = itemBasic.Code; + detail.ItemName = itemBasic.Name; + detail.ItemDesc1 = itemBasic.Desc1; + detail.ItemDesc2 = itemBasic.Desc2; + detail.StdPackQty = itemBasic.StdPackQty; + detail.Uom = itemBasic.BasicUom; + } + + string packingcode = string.Empty; + + packingcode =string.IsNullOrEmpty(detail.PackingCode)?"99999999":detail.PackingCode; + + detail.PackingCode = packingcode; + + } + + + + + + + + + /// /// 用来重写 导入数据时可以加工数据 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs index 7090ef78a..eea6611b1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs @@ -53,6 +53,17 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase Details { get; set; } = new List(); + + /// + /// 任务明细 + /// + [IgnoreUpdate] + public List FacDetails { get; set; } = new List(); + + + + + /// /// 设置任务明细的实际库位和实际数量 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs index b582ac4af..2c8b04501 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs @@ -35,6 +35,43 @@ public class UnplannedIssueJobDetail : SfsJobRecommendFromDetailEntityBase, IHas public ExtraPropertyDictionary ExtraProperties { get; set; } = new ExtraPropertyDictionary(); + /// + /// 说明 + /// + [Display(Name = "说明")] + public string Explain { get; set; } +} +public class UnplannedIssueJobFacDetail : SfsJobRecommendFromDetailEntityBase, IHasExtraProperties +{ + /// + /// 原因代码 + /// + public string ReasonCode { get; set; } + + /// + /// 专案 + /// + [Display(Name = "专案")] + public string CaseCode { get; set; } + + /// + /// 项目分类 + /// + [Display(Name = "项目分类")] + public string ProjCapacityCode { get; set; } + + /// + /// 次交易码 + /// + [Display(Name = "次交易码")] + public string OnceBusiCode { get; set; } + + /// + /// 扩展属性 + /// + public ExtraPropertyDictionary ExtraProperties { get; set; } = new ExtraPropertyDictionary(); + + /// /// 说明 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs index 1f01d454f..b065dcbf9 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs @@ -35,7 +35,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase new { q.PackingCode }).IsUnique(); }); + //builder.Entity(b => + //{ + // //Configure table & schema name + // b.ToTable(StoreDbProperties.JobDbTablePrefix + nameof(UnplannedIssueJobFacDetail), options.Schema); + // //Configure ABP properties + // b.ConfigureByConvention(); + // //Configure Sfs base properties + // b.ConfigureSfsBase(); + // //Configure Job base properties + // b.ConfigureJobRecommendFromDetail(); + // //Properties + + // //Relations + // //None + + // //Indexes + // //b.HasIndex(q => new { q.PackingCode }).IsUnique(); + //}); + + + } }