Browse Source

更新版本

dev_DY_CC
赵新宇 7 months ago
parent
commit
f3d05af16d
  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. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs
  8. 124
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs
  9. 17
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  10. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs
  11. 32
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/UnplannedIssueJobs/UnplannedIssueJobDbContextModelCreatingExtensions.cs
  12. 30
      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);
}

12
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;
@ -59,6 +60,17 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput
public class UnplannedIssueRequestImportDto
{
/// <summary>
/// 部门代码
/// </summary>
[Display(Name = "部门代码")]
public string DeptCode { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[Display(Name = "部门名称")]
public string DeptName { get; set; }
/// <summary>
/// 料号

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

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
@ -7,6 +8,7 @@ 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;
@ -65,17 +67,47 @@ public class UnplannedIssueJobAppService
/// </summary>
/// <returns></returns>
[HttpPost("create-by-recommend")]
public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto)
public async Task CreateByRecommendAsync(UnplannedIssueRequest requestDto)
{
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>();
var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false);
await _repository.InsertManyAsync(jobs.ToList()).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);
}
public 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;
}
@ -83,13 +115,16 @@ public class UnplannedIssueJobAppService
private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List<BalanceDTO> useBalancesOut)
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.ErpLocationCode)).ConfigureAwait(false);//获取存放库位
var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位
var input = new RecommendBalanceRequestInput
{
ItemCode = requestDtoDetail.ItemCode,
@ -98,6 +133,8 @@ public class UnplannedIssueJobAppService
Locations = locationCodes.Select(p => p.Code).ToList(),
IsPackingCode = false
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存
usableList = usableList
.OrderBy(p => p.Lot)
@ -110,35 +147,60 @@ public class UnplannedIssueJobAppService
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);
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;
@ -146,11 +208,15 @@ public class UnplannedIssueJobAppService
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.ReasonCode = requestDtoDetail.ReasonCode;
jobDetail.ItemCode = requestDtoDetail.ItemCode;
jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
@ -165,11 +231,14 @@ public class UnplannedIssueJobAppService
jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
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.ReasonCode = requestDtoDetail.ReasonCode;
jobfacDetail.ItemCode = requestDtoDetail.ItemCode;
jobfacDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
jobfacDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
@ -182,6 +251,8 @@ public class UnplannedIssueJobAppService
jobfacDetail.RecommendProduceDate = balanceDto.ProduceDate;
jobfacDetail.RecommendQty = balanceDto.Qty;
jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
//jobDetail.recommendRecommendToLocationArea = balanceDto.LocationArea;
//jobDetail.RecommendToLocationCode = balanceDto.LocationCode;
//jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode;
@ -190,8 +261,11 @@ public class UnplannedIssueJobAppService
job.Details.Add(jobDetail);
job.FacDetails.Add(jobfacDetail);
}
//job.SetProperty("details", System.Text.Json.JsonSerializer.Serialize(job.Details));

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

@ -93,7 +93,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false);
var inputFileBytes = ms.GetAllBytes();
var importList = _excelService.Import<UnplannedIssueRequestImportDto>(inputFileBytes).ToList();
await CreateByDYOAsync(importList).ConfigureAwait(false);
await CreateByDYOAsync(importList, EnumUnplannedIssueType.IMPORT).ConfigureAwait(false);
//if (errors.Count > 0)
@ -123,16 +123,23 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
public async Task<UnplannedIssueRequestDTO> CreateByAsync(List<UnplannedIssueRequestImportDto> p_list)
{
return await CreateByDYOAsync(p_list, true).ConfigureAwait(false);
return await CreateByDYOAsync(p_list, EnumUnplannedIssueType.OA, true).ConfigureAwait(false);
}
protected async Task<UnplannedIssueRequestDTO> CreateByDYOAsync(List<UnplannedIssueRequestImportDto> p_list, bool isAutoSubmit=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;
@ -142,8 +149,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
List<UnplannedIssueRequestDetail> detailList = new List<UnplannedIssueRequestDetail>();
foreach (var itm in p_list)
{
var detail = new UnplannedIssueRequestDetail();
var detail = new UnplannedIssueRequestDetail();
detail.ItemCode = itm.ItemCode;
detail.Qty = itm.Qty;
detail.LocationErpCode = itm.LocationErpCode;
@ -151,7 +157,6 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
detail.WarehouseCode ="Random";
detail.LocationGroup ="Random";
detail.LocationArea = "Random";
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
detailList.Add(detail);
}

3
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;
@ -59,7 +60,7 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
/// </summary>
[IgnoreUpdate]
public List<UnplannedIssueJobFacDetail> FacDetails { get; set; } = new List<UnplannedIssueJobFacDetail>();

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

@ -48,24 +48,24 @@ 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
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
//Relations
//None
// //Indexes
// //b.HasIndex(q => new { q.PackingCode }).IsUnique();
//});
//Indexes
//b.HasIndex(q => new { q.PackingCode }).IsUnique();
});

30
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,19 +186,26 @@ 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>();
foreach (var inputDetail in entity.Details)
{
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