Browse Source

Merge branch 'dev_DY_CC' of http://dev.ccwin-in.com:3000/BoXu.Zheng/WZC2 into dev_DY_CC

dev_DY_CC
郑勃旭 7 months ago
parent
commit
d1c1ceb9b8
  1. BIN
      .vs/WMS/v17/.wsuo
  2. 39
      .vs/WMS/v17/DocumentLayout.json
  3. 7
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedIssueType.cs
  4. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDTO.cs
  5. 36
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDetailDTO.cs
  6. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs
  7. 62
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs
  8. 424
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs
  9. 28
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs
  10. 161
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  11. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs
  12. 37
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobDetail.cs
  13. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs
  14. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/UnplannedIssueJobs/UnplannedIssueJobDbContextModelCreatingExtensions.cs
  15. 28
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedIssueRequestEventHandler.cs

BIN
.vs/WMS/v17/.wsuo

Binary file not shown.

39
.vs/WMS/v17/DocumentLayout.json

@ -0,0 +1,39 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\89237\\source\\repos\\WMS\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": -1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
},
{
"$type": "Bookmark",
"Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
},
{
"$type": "Bookmark",
"Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
},
{
"$type": "Bookmark",
"Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
},
{
"$type": "Bookmark",
"Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
}
]
}
]
}
]
}

7
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedIssueType.cs

@ -12,4 +12,11 @@ public enum EnumUnplannedIssueType
Raw = 1,//原料 非生产领料
[Display(Name = "线边 非生产领料")]
Wip =2,//线边 非生产领料
[Display(Name = "OA 非生产领料")]
OA = 3,//原料 非生产领料
[Display(Name = "导入 非生产领料")]
IMPORT = 4,//原料 非生产领料
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDTO.cs

@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -48,4 +50,11 @@ public class UnplannedIssueJobDTO : SfsJobDTOBase<UnplannedIssueJobDetailDTO>
[StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string OANumber { get; set; }
/// <summary>
/// 实际明细
/// </summary>
[Display(Name = "实际明细")]
public List<UnplannedIssueJobFacDetailDTO> FacDetails;
}

36
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDetailDTO.cs

@ -35,3 +35,39 @@ public class UnplannedIssueJobDetailDTO : SfsJobRecommendFromDetailDTOBase
[Display(Name = "说明")]
public string Explain { get; set; }
}
public class UnplannedIssueJobFacDetailDTO : SfsJobRecommendFromDetailDTOBase
{
/// <summary>
/// 原因代码
/// </summary>
[Display(Name = "原因代码")]
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>
[Display(Name = "说明")]
public string Explain { get; set; }
}

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -6,4 +7,7 @@ public interface IUnplannedIssueJobAppService
: ISfsJobAppServiceBase<UnplannedIssueJobDTO, SfsJobRequestInputBase, UnplannedIssueJobCheckInput, UnplannedIssueJobEditInput>
{
Task CancelByRequestNumberAsync(string number);
Task CreateByRecommendAsync(UnplannedIssueRequest requestDto);
}

62
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -55,3 +56,64 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput
public string OANumber { get; set; }
}
public class UnplannedIssueRequestImportDto
{
/// <summary>
/// 部门代码
/// </summary>
[Display(Name = "部门代码")]
public string DeptCode { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[Display(Name = "部门名称")]
public string DeptName { get; set; }
/// <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; }
}

424
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs

@ -1,6 +1,21 @@
using System;
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;
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 +30,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;
}
/// <summary>
/// 根据申请单号作废任务
@ -38,133 +61,270 @@ public class UnplannedIssueJobAppService
}
}
///// <summary>
///// 根据储位推荐
///// </summary>
///// <returns></returns>
//[HttpPost("create-by-recommend")]
//public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto)
//{
// List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>();
// 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<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,
// Statuses = new EditableList<EnumInventoryStatus> { 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<BalanceDTO> useBalances = new List<BalanceDTO>();
// 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<UnplannedReceiptJobDetail>();
// 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<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>
/// <returns></returns>
[HttpPost("create-by-recommend")]
public async Task CreateByRecommendAsync(UnplannedIssueRequest requestDto)
{
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>();
var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false);
await _unplannedIssueJobManager.AddManyAsync(jobs).ConfigureAwait(false);
//await _repository.InsertManyAsync(jobs.ToList()).ConfigureAwait(false);
var first = jobs.FirstOrDefault();
var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false);
foreach (var itm in outEditInputs)
{
itm.JobNumber = first.Number;
}
await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false);
}
private List<BalanceDTO> DeductInventory(List<BalanceDTO> inventory, decimal quantityToDeduct)
{
List<BalanceDTO> balanceDTOs = new List<BalanceDTO>();
decimal totalDeducted = 0;
foreach (var item in inventory)
{
decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted);
item.Qty -= availableToDeduct;
totalDeducted += availableToDeduct;
BalanceDTO dto = new BalanceDTO();
dto.InjectFrom(item);
dto.Qty = availableToDeduct;
balanceDTOs.Add(dto);
// 如果已经扣减达到所需数量,退出循环
if (totalDeducted >= quantityToDeduct)
{
break;
}
}
// 返回实际扣减的库存数量
return balanceDTOs;
}
private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedIssueRequest requestDto, List<BalanceDTO> useBalancesOut)
{
List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>();
foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细
{
var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位
var input = new RecommendBalanceRequestInput
{
ItemCode = requestDtoDetail.ItemCode,
Qty = requestDtoDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { 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<BalanceDTO> useBalances = new List<BalanceDTO>();
var returnlist=DeductInventory(usableList, requestDtoDetail.Qty);
useBalances.AddRange(returnlist);
useBalancesOut.AddRange(returnlist);
//foreach (var balanceDto in usableList)
//{
// decimal availableToDeduct = Math.Min(balanceDto.Qty, balanceDto.Qty - qty);
// balanceDto.Qty -= availableToDeduct;
// qty += availableToDeduct;
// if (qty >= balanceDto.Qty)
// break;
// if (qty >= requestDtoDetail.Qty)
// {
// break;
// }
// if (qty + balanceDto.Qty > requestDtoDetail.Qty)
// {
// qty += requestDtoDetail.Qty - balanceDto.Qty;
// }
// else
// {
// qty += balanceDto.Qty;
// }
// if (qty > 0)
// {
// useBalances.Add(balanceDto);
// useBalancesOut.Add(balanceDto);
// }
//}
if (returnlist.Count == 0)
{
throw new UserFriendlyException("库存余额不够!");
}
foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode))
{
var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
var job = new UnplannedIssueJob();
job.SetId(GuidGenerator.Create());
job.UnplannedIssueRequestNumber= requestDto.Number;
job.JobType = EnumJobType.UnplannedIssueJob;
job.JobStatus = EnumJobStatus.Open;
job.IsAutoComplete = false;
job.OANumber = requestDto.OANumber;
job.Number =await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true);
job.Details = new List<UnplannedIssueJobDetail>();
job.FacDetails = new List<UnplannedIssueJobFacDetail>();
job.WarehouseCode = balanceDtoGroup.First().WarehouseCode;
foreach (var balanceDto in balanceDtoGroup)
{
var jobDetail = new UnplannedIssueJobDetail();
jobDetail.Number = job.Number;
jobDetail.SetIdAndNumber(GuidGenerator,job.Id,job.Number);
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.StdPackQty = requestDtoDetail.StdPackQty;
jobDetail.RecommendPackingCode = balanceDto.PackingCode;
jobDetail.HandledPackingCode = balanceDto.PackingCode;
jobDetail.RecommendFromLocationArea = balanceDto.LocationArea;
jobDetail.RecommendFromLocationCode = balanceDto.LocationCode;
jobDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode;
jobDetail.RecommendFromLocationGroup = balanceDto.LocationGroup;
jobDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode;
jobDetail.HandledQty = balanceDto.Qty;
var jobfacDetail = new UnplannedIssueJobFacDetail();
jobfacDetail.Number = job.Number;
jobfacDetail.SetIdAndNumber(GuidGenerator, job.Id, job.Number);
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;
jobfacDetail.StdPackQty = requestDtoDetail.StdPackQty;
jobfacDetail.RecommendPackingCode = balanceDto.PackingCode;
jobfacDetail.HandledPackingCode = balanceDto.PackingCode;
jobfacDetail.RecommendFromLocationArea = balanceDto.LocationArea;
jobfacDetail.RecommendFromLocationCode = balanceDto.LocationCode;
jobfacDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode;
jobfacDetail.RecommendFromLocationGroup = balanceDto.LocationGroup;
jobfacDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode;
jobfacDetail.HandledQty = balanceDto.Qty;
job.Details.Add(jobDetail);
job.FacDetails.Add(jobfacDetail);
}
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>
private 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;
}
}

28
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;
}
/// <summary>
@ -59,4 +76,9 @@ public abstract class UnplannedIssueRequestAppService :
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto;
}
}

161
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,149 @@ 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<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
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, EnumUnplannedIssueType.IMPORT).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, EnumUnplannedIssueType.OA, true).ConfigureAwait(false);
}
protected async Task<UnplannedIssueRequestDTO> CreateByDYOAsync(List<UnplannedIssueRequestImportDto> p_list, EnumUnplannedIssueType type, bool isAutoSubmit=false)
{
UnplannedIssueRequest request = new UnplannedIssueRequest();
if (p_list.Count == 0)
{
throw new UserFriendlyException("导入内容为空请填写!");
}
var first = p_list.FirstOrDefault();
request.UnplannedIssueType = type;
request.SetId(GuidGenerator.Create());
request.AutoCompleteJob = false;
request.AutoSubmit = isAutoSubmit;
request.AutoAgree = false;
request.AutoHandle = false;
request.DirectCreateNote = false;
request.DeptCode = first.DeptCode;
request.DeptName = first.DeptName;
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";
detail.CaseCode = first.CaseCode;
detail.ProjCapacityCode = first.ProjCapacityCode;
detail.OnceBusiCode = first.OnceBusiCode;
detail.Explain = first.Explain;
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>

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

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -53,6 +54,17 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
[IgnoreUpdate]
public override List<UnplannedIssueJobDetail> Details { get; set; } = new List<UnplannedIssueJobDetail>();
/// <summary>
/// 任务明细
/// </summary>
[IgnoreUpdate]
public List<UnplannedIssueJobFacDetail> FacDetails { get; set; } = new List<UnplannedIssueJobFacDetail>();
/// <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();
/// <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>

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.CompleteUserName = input.CompleteUserName;
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,

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

@ -26,6 +26,9 @@ public static class UnplannedIssueJobDbContextModelCreatingExtensions
b.Property(q => q.UnplannedIssueRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength);
//Relations
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired();
b.HasMany(q => q.FacDetails).WithOne().HasForeignKey(d => d.MasterID).IsRequired();
//Indexes
b.HasIndex(q => new { q.Number }).IsUnique();
});
@ -48,5 +51,26 @@ public static class UnplannedIssueJobDbContextModelCreatingExtensions
//Indexes
//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();
});
}
}

28
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedIssueRequestEventHandler.cs

@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
using Omu.ValueInjecter;
using Volo.Abp.Domain.Entities;
using Volo.Abp.EventBus;
using Volo.Abp.ObjectMapping;
@ -93,8 +95,21 @@ public class UnplannedIssueRequestEventHandler
}
else
{
var job = await BuildUnplannedIssueJobCreateInputAsync(entity).ConfigureAwait(false);
await _unplannedIssueJobApp.CreateAsync(job).ConfigureAwait(false);
if (entity.UnplannedIssueType == EnumUnplannedIssueType.OA || entity.UnplannedIssueType == EnumUnplannedIssueType.IMPORT)
{
//var job = await BuildUnplannedIssueJobCreateInputAsync(entity).ConfigureAwait(false);
var request= new UnplannedIssueRequest();
request.InjectFrom(entity);
await _unplannedIssueJobApp.CreateByRecommendAsync(request).ConfigureAwait(false);
}
else
{
var job = await BuildUnplannedIssueJobCreateInputAsync(entity).ConfigureAwait(false);
await _unplannedIssueJobApp.CreateAsync(job).ConfigureAwait(false);
}
}
}
public virtual async Task HandleEventAsync(SfsRefusedEntityEventData<UnplannedIssueRequest> eventData)
@ -171,10 +186,16 @@ public class UnplannedIssueRequestEventHandler
{
await Task.CompletedTask.ConfigureAwait(false);
var createInput = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueJobEditInput>(entity);
createInput.UnplannedIssueRequestNumber = entity.Number;
createInput.JobType = EnumJobType.UnplannedIssueJob;
createInput.JobStatus = EnumJobStatus.Open;
createInput.IsAutoComplete = entity.AutoCompleteJob;
createInput.Worker = string.IsNullOrEmpty(createInput.Worker)?"导入":createInput.Worker;
createInput.Details = new List<UnplannedIssueJobDetailInput>();
@ -183,7 +204,8 @@ public class UnplannedIssueRequestEventHandler
var detail = ObjectMapper.Map<UnplannedIssueRequestDetail, UnplannedIssueJobDetailInput>(inputDetail);
detail.ExtraProperties = inputDetail.ExtraProperties;
detail.HandledLot = string.IsNullOrEmpty(detail.HandledLot) ? "导入" : detail.HandledLot;
detail.RecommendLot = string.IsNullOrEmpty(detail.RecommendLot) ? "导入" : detail.RecommendLot;
createInput.Details.Add(detail);
}
createInput.WarehouseCode = createInput.Details[0].RecommendFromWarehouseCode;

Loading…
Cancel
Save