Browse Source

添加导入接口,

dev_DY_CC
赵新宇 7 months ago
parent
commit
492d318a71
  1. 50
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs
  2. 352
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs
  3. 55
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs
  4. 140
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  5. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs
  6. 37
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs
  7. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs
  8. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/UnplannedIssueJobs/UnplannedIssueJobDbContextModelCreatingExtensions.cs

50
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 string OANumber { get; set; }
} }
public class UnplannedIssueRequestImportDto
{
/// <summary>
/// 料号
/// </summary>
[Display(Name = "料号")]
[Required(ErrorMessage = "{0}是必填项")]
public string ItemCode { get; set; }
[Display(Name = "数量")]
[Required(ErrorMessage = "{0}是必填项")]
public decimal Qty { get; set; }
/// <summary>
/// 调出库位
/// </summary>
[Display(Name = "调出库位")]
[Required(ErrorMessage = "{0}是必填项")]
public string LocationErpCode { get; set; }
/// <summary>
/// 专案
/// </summary>
[Display(Name = "专案")]
[Required(ErrorMessage = "{0}是必填项")]
public string CaseCode { get; set; }
/// <summary>
/// 项目分类
/// </summary>
[Display(Name = "项目分类")]
[Required(ErrorMessage = "{0}是必填项")]
public string ProjCapacityCode { get; set; }
/// <summary>
/// 次交易码
/// </summary>
[Display(Name = "次交易码")]
[Required(ErrorMessage = "{0}是必填项")]
public string OnceBusiCode { get; set; }
/// <summary>
/// 说明
/// </summary>
[Display(Name = "说明")]
public string Explain { get; set; }
}

352
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 System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Irony;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; 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.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -15,13 +28,21 @@ public class UnplannedIssueJobAppService
IUnplannedIssueJobAppService IUnplannedIssueJobAppService
{ {
private readonly IUnplannedIssueJobManager _unplannedIssueJobManager; private readonly IUnplannedIssueJobManager _unplannedIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService;
public UnplannedIssueJobAppService( public UnplannedIssueJobAppService(
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService
) : base(repository, unplannedIssueJobManager) ) : base(repository, unplannedIssueJobManager)
{ {
_unplannedIssueJobManager = unplannedIssueJobManager; _unplannedIssueJobManager = unplannedIssueJobManager;
} _locationAppService = locationAppService;
_balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService;
}
/// <summary> /// <summary>
/// 根据申请单号作废任务 /// 根据申请单号作废任务
@ -38,133 +59,200 @@ public class UnplannedIssueJobAppService
} }
} }
///// <summary>
///// 根据储位推荐 /// <summary>
///// </summary> /// 根据储位推荐
///// <returns></returns> /// </summary>
//[HttpPost("create-by-recommend")] /// <returns></returns>
//public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) [HttpPost("create-by-recommend")]
//{ public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto)
// List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>(); {
// var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>();
// await _repository.InsertManyAsync(jobs).ConfigureAwait(false); var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false);
// var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false); await _repository.InsertManyAsync(jobs.ToList()).ConfigureAwait(false);
// await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false);
//} await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false);
}
//private async Task<List<UnplannedReceiptJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List<BalanceDTO> useBalancesOut)
//{
// List<UnplannedReceiptJob> jobs = new EditableList<UnplannedReceiptJob>();
// 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, private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List<BalanceDTO> useBalancesOut)
// Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, {
// Locations = locationCodes.Select(p => p.Code).ToList(), List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>();
// IsPackingCode = false
// }; foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细
// var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); {
// usableList = usableList var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false);//获取存放库位
// .OrderBy(p => p.Lot) var input = new RecommendBalanceRequestInput
// .ThenBy(p => p.PutInTime) {
// .ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料 ItemCode = requestDtoDetail.ItemCode,
// .ThenBy(p => p.LocationCode) Qty = requestDtoDetail.Qty,
// .ThenBy(p => p.PackingCode) Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
// .ToList(); Locations = locationCodes.Select(p => p.Code).ToList(),
IsPackingCode = false
// decimal qty = 0; };
// //实际要用库存 var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存
// List<BalanceDTO> useBalances = new List<BalanceDTO>(); usableList = usableList
// foreach (var balanceDto in usableList) .OrderBy(p => p.Lot)
// { .ThenBy(p => p.PutInTime)
// if (qty >= requestDtoDetail.Qty) .ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料
// { .ThenBy(p => p.LocationCode)
// break; .ThenBy(p => p.PackingCode)
// } .ToList();
// if (qty + balanceDto.Qty > requestDtoDetail.Qty) decimal qty = 0;
// { //实际要用库存
// qty += requestDtoDetail.Qty - balanceDto.Qty; List<BalanceDTO> useBalances = new List<BalanceDTO>();
// } foreach (var balanceDto in usableList)
// else {
// { if (qty >= requestDtoDetail.Qty)
// qty += balanceDto.Qty; {
// } break;
}
// useBalances.Add(balanceDto); if (qty + balanceDto.Qty > requestDtoDetail.Qty)
// useBalancesOut.Add(balanceDto); {
// } qty += requestDtoDetail.Qty - balanceDto.Qty;
}
// foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) else
// { {
// var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); qty += balanceDto.Qty;
// var job = new UnplannedReceiptJob(); }
// job.UnplannedReceiptRequestNumber = requestDto.Number; useBalances.Add(balanceDto);
// job.JobType = EnumJobType.UnplannedReceiptJob; useBalancesOut.Add(balanceDto);
// job.JobStatus = EnumJobStatus.Open; }
// job.IsAutoComplete = false;
// job.OANumber = requestDto.OANumber; foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode))
// job.Details = new List<UnplannedReceiptJobDetail>(); {
// job.WarehouseCode = balanceDtoGroup.First().WarehouseCode; var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
var job = new UnplannedIssueJob();
// foreach (var balanceDto in balanceDtoGroup)
// { job.UnplannedIssueRequestNumber= requestDto.Number;
// var jobDetail = new UnplannedReceiptJobDetail(); job.JobType = EnumJobType.UnplannedIssueJob;
// jobDetail.CaseCode = requestDtoDetail.CaseCode; job.JobStatus = EnumJobStatus.Open;
// jobDetail.Explain = requestDtoDetail.Explain; job.IsAutoComplete = false;
// jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; job.OANumber = requestDto.OANumber;
// jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; job.Details = new List<UnplannedIssueJobDetail>();
// jobDetail.ReasonCode = requestDtoDetail.ReasonCode; job.FacDetails = new List<UnplannedIssueJobFacDetail>();
// jobDetail.ItemCode = requestDtoDetail.ItemCode; job.WarehouseCode = balanceDtoGroup.First().WarehouseCode;
// jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
// jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; foreach (var balanceDto in balanceDtoGroup)
// jobDetail.ItemName = requestDtoDetail.ItemName; {
// jobDetail.RecommendArriveDate = balanceDto.ArriveDate; var jobDetail = new UnplannedIssueJobDetail();
// jobDetail.RecommendContainerCode = string.Empty; jobDetail.CaseCode = requestDtoDetail.CaseCode;
// jobDetail.RecommendExpireDate = balanceDto.ExpireDate; jobDetail.Explain = requestDtoDetail.Explain;
// jobDetail.RecommendLot = balanceDto.Lot; jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode;
// jobDetail.RecommendPackingCode = balanceDto.PackingCode; jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode;
// jobDetail.RecommendProduceDate = balanceDto.ProduceDate; jobDetail.ReasonCode = requestDtoDetail.ReasonCode;
// jobDetail.RecommendQty = balanceDto.Qty; jobDetail.ItemCode = requestDtoDetail.ItemCode;
// jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
// jobDetail.RecommendToLocationArea = balanceDto.LocationArea; jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
// jobDetail.RecommendToLocationCode = balanceDto.LocationCode; jobDetail.ItemName = requestDtoDetail.ItemName;
// jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode; jobDetail.RecommendArriveDate = balanceDto.ArriveDate;
// jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup; jobDetail.RecommendContainerCode = string.Empty;
// jobDetail.RecommendToWarehouseCode = balanceDto.WarehouseCode; jobDetail.RecommendExpireDate = balanceDto.ExpireDate;
jobDetail.RecommendLot = balanceDto.Lot;
// job.Details.Add(jobDetail); jobDetail.RecommendPackingCode = balanceDto.PackingCode;
// } jobDetail.RecommendProduceDate = balanceDto.ProduceDate;
jobDetail.RecommendQty = balanceDto.Qty;
// if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的 jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
// {
// await SendDimensionalStorehouseAsync().ConfigureAwait(false); var jobfacDetail = new UnplannedIssueJobFacDetail();
// job.JobStatus = EnumJobStatus.Wait; jobfacDetail.CaseCode = requestDtoDetail.CaseCode;
// } jobfacDetail.Explain = requestDtoDetail.Explain;
jobfacDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode;
// jobs.Add(job); jobfacDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode;
// } jobfacDetail.ReasonCode = requestDtoDetail.ReasonCode;
// } jobfacDetail.ItemCode = requestDtoDetail.ItemCode;
jobfacDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
// return jobs; jobfacDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
//} jobfacDetail.ItemName = requestDtoDetail.ItemName;
jobfacDetail.RecommendArriveDate = balanceDto.ArriveDate;
//private async Task<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos) jobfacDetail.RecommendContainerCode = string.Empty;
//{ jobfacDetail.RecommendExpireDate = balanceDto.ExpireDate;
// return ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos); jobfacDetail.RecommendLot = balanceDto.Lot;
//} jobfacDetail.RecommendPackingCode = balanceDto.PackingCode;
jobfacDetail.RecommendProduceDate = balanceDto.ProduceDate;
///// <summary> jobfacDetail.RecommendQty = balanceDto.Qty;
///// 给立体库发送 jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
///// </summary> //jobDetail.recommendRecommendToLocationArea = balanceDto.LocationArea;
///// <returns></returns> //jobDetail.RecommendToLocationCode = balanceDto.LocationCode;
//public async Task SendDimensionalStorehouseAsync() //jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode;
//{ //jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup;
// throw new System.NotImplementedException(); //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<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos)
{
return ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos);
}
/// <summary>
/// 给立体库发送
/// </summary>
/// <returns></returns>
public async Task SendDimensionalStorehouseAsync()
{
throw new System.NotImplementedException();
}
/// <summary>
/// 创建补料记录实体
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task<UnplannedIssueNoteEditInput> BuildUnplannedIssueNoteAsync(UnplannedIssueJob unplannedIssueJobDto)
{
//var createInput =
// ObjectMapper.Map<UnplannedIssueJob, UnplannedIssueNoteEditInput>(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<UnplannedIssueNoteDetailInput>();
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;
}
} }

55
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 System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; 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.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; 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; namespace Win_in.Sfs.Wms.Store.Application;
[AllowAnonymous]
[Authorize] //[Authorize]
[Route($"{StoreConsts.RootPath}unplanned-issue-request")] [Route($"{StoreConsts.RootPath}unplanned-issue-request")]
public abstract class UnplannedIssueRequestAppService : public abstract class UnplannedIssueRequestAppService :
@ -18,13 +30,18 @@ public abstract class UnplannedIssueRequestAppService :
{ {
private readonly IUnplannedIssueRequestManager _unplannedIssueRequestManager; private readonly IUnplannedIssueRequestManager _unplannedIssueRequestManager;
protected readonly IExportImportService _excelService;
public UnplannedIssueRequestAppService( public UnplannedIssueRequestAppService(
IUnplannedIssueRequestRepository repository, IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager IUnplannedIssueRequestManager unplannedIssueRequestManager,
IExportImportService excelService
) : base(repository, unplannedIssueRequestManager) ) : base(repository, unplannedIssueRequestManager)
{ {
_unplannedIssueRequestManager = unplannedIssueRequestManager; _unplannedIssueRequestManager = unplannedIssueRequestManager;
_excelService = excelService;
} }
/// <summary> /// <summary>
@ -59,4 +76,36 @@ public abstract class UnplannedIssueRequestAppService :
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity); var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto; return dto;
} }
[HttpPost("import")]
[Consumes("multipart/form-data")]
public override async Task<IActionResult> 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<UnplannedIssueRequestEditInput>(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<KittingErrorDto> errors = new List<KittingErrorDto>();
//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 = "" });
}
} }

140
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs

@ -1,16 +1,24 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Omu.ValueInjecter;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Users; using Volo.Abp.Users;
using Win_in.Sfs.Auth.Application.Contracts; using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Basedata.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;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -28,13 +36,14 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAclService _transactionTypeAclService; private readonly ITransactionTypeAclService _transactionTypeAclService;
//private readonly IExportImportService _excelService;
public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository, public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager, IUnplannedIssueRequestManager unplannedIssueRequestManager,
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService,
ITransactionTypeAclService transactionTypeAclService ITransactionTypeAclService transactionTypeAclService
) : base(repository, unplannedIssueRequestManager) ) : base( repository, unplannedIssueRequestManager, excelService)
{ {
_unplannedIssueRequestManager = unplannedIssueRequestManager; _unplannedIssueRequestManager = unplannedIssueRequestManager;
_departmentApp = departmentApp; _departmentApp = departmentApp;
@ -62,19 +71,128 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
entity.AutoAgree = true; entity.AutoAgree = true;
entity.AutoHandle = true; entity.AutoHandle = true;
entity.DirectCreateNote = false; entity.DirectCreateNote = false;
//if (entity.UnplannedIssueType == EnumUnplannedIssueType.Wip)
//{
// entity.DirectCreateNote = true;
//}
//else
//{
//}
await _unplannedIssueRequestManager.CreateAsync(entity).ConfigureAwait(false); await _unplannedIssueRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity); var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto; return dto;
} }
/// <summary>
/// 自定义导入接口
/// </summary>
/// <param name="requestInput"></param>
/// <param name="file"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[HttpPost("import-dongyang")]
public async Task<IActionResult> 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<UnplannedIssueRequestImportDto>(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);
}
}
/// <summary>
/// OA接口
/// </summary>
/// <param name="p_list"></param>
/// <returns></returns>
[HttpPost("create-dongyang")]
public async Task<UnplannedIssueRequestDTO> CreateByAsync(List<UnplannedIssueRequestImportDto> p_list)
{
return await CreateByDYOAsync(p_list, true).ConfigureAwait(false);
}
protected async Task<UnplannedIssueRequestDTO> CreateByDYOAsync(List<UnplannedIssueRequestImportDto> 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<UnplannedIssueRequestDetail> detailList = new List<UnplannedIssueRequestDetail>();
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<UnplannedIssueRequest, UnplannedIssueRequestDTO>(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;
}
/// <summary> /// <summary>
/// 用来重写 导入数据时可以加工数据 /// 用来重写 导入数据时可以加工数据
/// </summary> /// </summary>

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs

@ -53,6 +53,17 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
[IgnoreUpdate] [IgnoreUpdate]
public override List<UnplannedIssueJobDetail> Details { get; set; } = new List<UnplannedIssueJobDetail>(); public override List<UnplannedIssueJobDetail> Details { get; set; } = new List<UnplannedIssueJobDetail>();
/// <summary>
/// 任务明细
/// </summary>
[IgnoreUpdate]
public List<UnplannedIssueJobFacDetail> FacDetails { get; set; } = new List<UnplannedIssueJobFacDetail>();
/// <summary> /// <summary>
/// 设置任务明细的实际库位和实际数量 /// 设置任务明细的实际库位和实际数量
/// </summary> /// </summary>

37
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(); public ExtraPropertyDictionary ExtraProperties { get; set; } = new ExtraPropertyDictionary();
/// <summary>
/// 说明
/// </summary>
[Display(Name = "说明")]
public string Explain { get; set; }
}
public class UnplannedIssueJobFacDetail : SfsJobRecommendFromDetailEntityBase, IHasExtraProperties
{
/// <summary>
/// 原因代码
/// </summary>
public string ReasonCode { get; set; }
/// <summary>
/// 专案
/// </summary>
[Display(Name = "专案")]
public string CaseCode { get; set; }
/// <summary>
/// 项目分类
/// </summary>
[Display(Name = "项目分类")]
public string ProjCapacityCode { get; set; }
/// <summary>
/// 次交易码
/// </summary>
[Display(Name = "次交易码")]
public string OnceBusiCode { get; set; }
/// <summary>
/// 扩展属性
/// </summary>
public ExtraPropertyDictionary ExtraProperties { get; set; } = new ExtraPropertyDictionary();
/// <summary> /// <summary>
/// 说明 /// 说明
/// </summary> /// </summary>

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs

@ -35,7 +35,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
entity.DeptName = input.DeptName; entity.DeptName = input.DeptName;
entity.CompleteUserName = input.CompleteUserName; entity.CompleteUserName = input.CompleteUserName;
entity.CompleteUserId = input.CompleteUserId; entity.CompleteUserId = input.CompleteUserId;
foreach (var detail in input.Details) foreach (var detail in input.FacDetails)
{ {
//发料子任务 赋值实际转移 //发料子任务 赋值实际转移
await entity.BuildDetail(detail.Id, detail.HandledFromLocationGroup, detail.HandledFromLocationArea,detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode, detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate, await entity.BuildDetail(detail.Id, detail.HandledFromLocationGroup, detail.HandledFromLocationArea,detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode, detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate,

21
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/UnplannedIssueJobs/UnplannedIssueJobDbContextModelCreatingExtensions.cs

@ -48,5 +48,26 @@ public static class UnplannedIssueJobDbContextModelCreatingExtensions
//Indexes //Indexes
//b.HasIndex(q => new { q.PackingCode }).IsUnique(); //b.HasIndex(q => new { q.PackingCode }).IsUnique();
}); });
//builder.Entity<UnplannedIssueJobFacDetail>(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();
//});
} }
} }

Loading…
Cancel
Save