diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index aa15dfb0..d5fefd82 100644 Binary files a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 and b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 differ diff --git a/src/WMS.Web.Api/Controllers/OutStockTaskController.cs b/src/WMS.Web.Api/Controllers/OutStockTaskController.cs index 15e35a27..7963336c 100644 --- a/src/WMS.Web.Api/Controllers/OutStockTaskController.cs +++ b/src/WMS.Web.Api/Controllers/OutStockTaskController.cs @@ -131,7 +131,11 @@ namespace WMS.Web.Api.Controllers if (loginInfo == null || loginInfo.UserInfo == null) return ResultList.ReFailure(ResultCodes.Token_Invalid_Error); + List str = new List(); + str.Add(billNo); + var res2 = await _repositories.GetListBySourceBillNo(str); var res = await _repositories.GetOutStockTaskListByNo(billNo); + if (res == null || res.Count() == 0) return ResultList.ReFailure(ResultCodes.OutStockTaskNoData); return ResultList.ReSuccess(res); } diff --git a/src/WMS.Web.Api/Controllers/TestController.cs b/src/WMS.Web.Api/Controllers/TestController.cs index 0fdd219e..940c1993 100644 --- a/src/WMS.Web.Api/Controllers/TestController.cs +++ b/src/WMS.Web.Api/Controllers/TestController.cs @@ -44,6 +44,10 @@ namespace WMS.Web.Api.Controllers [Route("hj")] public async Task TestHJ() { + //var t=await _outStockTaskRepositories.Get(1); + // t.Details[0].Remark = "sdf"; + // t.Details[0].ErpDetails[0].SaleBillNo = "sdfsfsbbbb"; + // var s = await _outStockTaskRepositories.Edit(t); // await _boxService.Sync(); //var res = await this._erpService.BillQueryForDeliveryNoticeOutStock(null,DateTime.Now.AddDays(-300)); //var result= await this._erpService.BillQueryForPurchaseInStock(); diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index 8b264b74..b068aeea 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -3191,6 +3191,16 @@ 单据编号 + + + 仓库编码 + + + + + 仓库名 + + 详情 @@ -3581,6 +3591,11 @@ 出库数量 + + + 箱Id + + 序列号集 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 33586b06..f5967f1d 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -964,6 +964,11 @@ 同步成功或者失败 null 就是未同步 + + + 同步失败的源订单号 + + 同步时间 @@ -985,7 +990,7 @@ - + 同步金蝶 @@ -1011,16 +1016,6 @@ 单据头Id - - - 销售订单号 - - - - - 来源单号 - - 物料Id @@ -1046,6 +1041,46 @@ 出库数量 + + + 对应erp明细 同一个物料 存在于不同的来源单中(合并后出现多条) + + + + + 对应金蝶的明细 + + + + + 主键 订单编号 + + + + + 任务单明细Id + + + + + 对应金蝶单据明细id(销售出库同步金蝶下推使用) + + + + + 来源单号 + + + + + 销售订单号 + + + + + 出库数量 + + erp出库任务单 @@ -1103,7 +1138,7 @@ - 出库 反写 任务单 + 出库 反写 任务单(返回 这个物料下面的来源单号出了多少数量) @@ -1142,21 +1177,6 @@ 单据头Id - - - 对应金蝶单据明细id(销售出库同步金蝶下推使用) - - - - - 来源单号(合并后有多个) - - - - - 销售订单号 - - 物料Id @@ -1197,6 +1217,51 @@ 出库结束时间 + + + 对应erp明细 同一个物料 存在于不同的来源单中(合并后出现多条) + + + + + 对应金蝶的明细 + + + + + 主键 订单编号 + + + + + 任务单明细Id + + + + + 对应金蝶单据明细id(销售出库同步金蝶下推使用) + + + + + 来源单号 + + + + + 销售订单号 + + + + + 应出库数量 + + + + + 已出库数量 + + 序列号操作记录表 @@ -1872,7 +1937,7 @@ - 列表-根据明细中的来源单号 + 列表-根据明细中的来源单号精确匹配 diff --git a/src/WMS.Web.Core/Dto/OutStock/SaveOutStockRequest.cs b/src/WMS.Web.Core/Dto/OutStock/SaveOutStockRequest.cs index 7a2535ba..7b410eb7 100644 --- a/src/WMS.Web.Core/Dto/OutStock/SaveOutStockRequest.cs +++ b/src/WMS.Web.Core/Dto/OutStock/SaveOutStockRequest.cs @@ -31,6 +31,11 @@ namespace WMS.Web.Core.Dto.OutStock [Required(ErrorMessage = "出库数量不能为空")] public decimal Qty { get; set; } /// + /// 箱Id + /// + [Required(ErrorMessage = "箱不能为空")] + public int BoxId { get; set; } + /// /// 序列号集 /// public List SerialNumbers { get; set; } = new List(); diff --git a/src/WMS.Web.Core/Dto/OutStockTask/GetOutStockTaskByNoResponse.cs b/src/WMS.Web.Core/Dto/OutStockTask/GetOutStockTaskByNoResponse.cs index ad9e095e..2e1f765d 100644 --- a/src/WMS.Web.Core/Dto/OutStockTask/GetOutStockTaskByNoResponse.cs +++ b/src/WMS.Web.Core/Dto/OutStockTask/GetOutStockTaskByNoResponse.cs @@ -18,6 +18,14 @@ namespace WMS.Web.Core.Dto.OutStockTask /// public string BillNo { get; set; } /// + /// 仓库编码 + /// + public string StockCode { get; set; } + /// + /// 仓库名 + /// + public string StockName { get; set; } + /// /// 详情 /// public List details { get; set; } = new List(); diff --git a/src/WMS.Web.Domain/Entitys/OutStock.cs b/src/WMS.Web.Domain/Entitys/OutStock.cs index 95d0e28e..0a760543 100644 --- a/src/WMS.Web.Domain/Entitys/OutStock.cs +++ b/src/WMS.Web.Domain/Entitys/OutStock.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; using System.Text; using WMS.Web.Core; using WMS.Web.Domain.Values; @@ -66,6 +67,11 @@ namespace WMS.Web.Domain.Entitys [Column("SuccessSync")] public bool? SuccessSync { get; set; } /// + /// 同步失败的源订单号 + /// + [Column("SuccessSyncFail")] + public List SuccessSyncFail { get; set; }=new List(); + /// /// 同步时间 /// [Column("SyncTime")] @@ -96,8 +102,10 @@ namespace WMS.Web.Domain.Entitys /// 同步金蝶 /// /// - public void Sync(bool isSuccess, int operateId,string remark) + public void Sync(List sourcBilNos, bool isSuccess, int operateId, string remark) { + SuccessSyncFail.AddRange(sourcBilNos); + SuccessSyncFail.Distinct(); this.SuccessSync = isSuccess; this.Remark = remark; this.OperateId = operateId; diff --git a/src/WMS.Web.Domain/Entitys/OutStockDetails.cs b/src/WMS.Web.Domain/Entitys/OutStockDetails.cs index 4c642628..fb14fb41 100644 --- a/src/WMS.Web.Domain/Entitys/OutStockDetails.cs +++ b/src/WMS.Web.Domain/Entitys/OutStockDetails.cs @@ -25,17 +25,6 @@ namespace WMS.Web.Domain.Entitys /// [Column("Fid")] public int Fid { get; set; } - - /// - /// 销售订单号 - /// - [Column("SaleBillNo")] - public List SaleBillNos { get; set; } - /// - /// 来源单号 - /// - [Column("SourceBillNo")] - public List SourceBillNos { get; set; } /// /// 物料Id /// @@ -61,5 +50,10 @@ namespace WMS.Web.Domain.Entitys /// [Column("Qty")] public decimal Qty { get; set; } + + /// + /// 对应erp明细 同一个物料 存在于不同的来源单中(合并后出现多条) + /// + public List ErpDetails { get; set; } = new List(); } } diff --git a/src/WMS.Web.Domain/Entitys/OutStockErpDetails.cs b/src/WMS.Web.Domain/Entitys/OutStockErpDetails.cs new file mode 100644 index 00000000..7f393e94 --- /dev/null +++ b/src/WMS.Web.Domain/Entitys/OutStockErpDetails.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; +using WMS.Web.Core; + +namespace WMS.Web.Domain.Entitys +{ + /// + /// 对应金蝶的明细 + /// + [Serializable] + [Table("t_wms_outstock_erp_details")] + public class OutStockErpDetails : EntityBase + { + public OutStockErpDetails() { } + /// + /// 主键 订单编号 + /// + [Column("Id")] + public override int Id { get; set; } + /// + /// 任务单明细Id + /// + [Column("DetailId")] + public int DetailId { get; set; } + /// + /// 对应金蝶单据明细id(销售出库同步金蝶下推使用) + /// + [Column("Erp_DetailId")] + public int Erp_DetailId { get; set; } + /// + /// 来源单号 + /// + [Column("SourceBillNo")] + public string SourceBillNo { get; set; } + /// + /// 销售订单号 + /// + [Column("SaleBillNo")] + public string SaleBillNo { get; set; } + /// + /// 出库数量 + /// + [Column("Qty")] + public decimal Qty { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Entitys/OutStockTask.cs b/src/WMS.Web.Domain/Entitys/OutStockTask.cs index 9ce17525..7a22ac07 100644 --- a/src/WMS.Web.Domain/Entitys/OutStockTask.cs +++ b/src/WMS.Web.Domain/Entitys/OutStockTask.cs @@ -76,22 +76,41 @@ namespace WMS.Web.Domain.Entitys this.CreateTime = createTime; } /// - /// 出库 反写 任务单 + /// 出库 反写 任务单(返回 这个物料下面的来源单号出了多少数量) /// /// /// /// - public Result OutStock(int materialId, decimal qty) + public Result> OutStock(int materialId, decimal qty) { if (this.Status == OutStockStatus.Already) - return Result.ReFailure(ResultCodes.OutStockTaskAlready); + return Result>.ReFailure(ResultCodes.OutStockTaskAlready); if (this.Status == OutStockStatus.Repeal) - return Result.ReFailure(ResultCodes.OutStockTaskRepeal); + return Result>.ReFailure(ResultCodes.OutStockTaskRepeal); var detail = this.Details.FirstOrDefault(f => f.MaterialId == materialId); - if (detail == null) return Result.ReFailure(ResultCodes.OrderNoData); + if (detail == null) return Result>.ReFailure(ResultCodes.OrderNoData); if ((detail.AccruedQty - detail.RealityQty) < qty) - return Result.ReFailure(ResultCodes.OutStockQtyError); + return Result>.ReFailure(ResultCodes.OutStockQtyError); + List<(string sourceBillNo, decimal qty)> resList = new List<(string sourceBillNo, decimal qty)>(); + var mQty = qty; + foreach (var d in detail.ErpDetails) + { + if ((d.AccruedQty - d.RealityQty) >= mQty) + { + d.RealityQty += qty; + resList.Add((d.SourceBillNo, mQty)); + break;//本次出库数量已经分配完毕 调出循环 + } + else + { + //代表这一个来源单号对应的物料 能全部出掉,并且还有剩余 进行下一个来源单的出货 + var cQty = d.AccruedQty - d.RealityQty;//本次出货数量 + mQty -= cQty; + d.RealityQty = d.AccruedQty; + resList.Add((d.SourceBillNo, cQty)); + } + } if (detail.RealityQty <= 0) detail.OutStockBeginTime = DateTime.Now; @@ -106,7 +125,7 @@ namespace WMS.Web.Domain.Entitys else this.Status = OutStockStatus.Part; - return Result.ReSuccess(); + return Result>.ReSuccess(resList); } /// /// 生成单据号 @@ -168,8 +187,13 @@ namespace WMS.Web.Domain.Entitys if (detail_new != null) { detail_new.AccruedQty += d.AccruedQty;//应出数量累加 - detail_new.SaleBillNos.AddRange(d.SaleBillNos); - detail_new.SourceBillNos.AddRange(d.SourceBillNos); + foreach (var erpd in d.ErpDetails) + { + var cd = erpd.Clone(); + cd.Id = 0; cd.DetailId = 0; + detail_new.ErpDetails.Add(cd); + } + } else details_new.Add(d); diff --git a/src/WMS.Web.Domain/Entitys/OutStockTaskDetails.cs b/src/WMS.Web.Domain/Entitys/OutStockTaskDetails.cs index b64b5328..c03c628b 100644 --- a/src/WMS.Web.Domain/Entitys/OutStockTaskDetails.cs +++ b/src/WMS.Web.Domain/Entitys/OutStockTaskDetails.cs @@ -28,22 +28,6 @@ namespace WMS.Web.Domain.Entitys [Column("Fid")] public int Fid { get; set; } /// - /// 对应金蝶单据明细id(销售出库同步金蝶下推使用) - /// - [Column("Erp_DetailId")] - public int Erp_DetailId { get; set; } - /// - /// 来源单号(合并后有多个) - /// - [Column("SourceBillNo")] - public List SourceBillNos { get; set; } - - /// - /// 销售订单号 - /// - [Column("SaleBillNo")] - public List SaleBillNos { get; set; } - /// /// 物料Id /// [Column("MaterialId")] @@ -83,7 +67,10 @@ namespace WMS.Web.Domain.Entitys /// [Column("OutStockEndTime")] public DateTime? OutStockEndTime { get; set; } - + /// + /// 对应erp明细 同一个物料 存在于不同的来源单中(合并后出现多条) + /// + public List ErpDetails { get; set; } = new List(); } } diff --git a/src/WMS.Web.Domain/Entitys/OutStockTaskErpDetails.cs b/src/WMS.Web.Domain/Entitys/OutStockTaskErpDetails.cs new file mode 100644 index 00000000..88f425cf --- /dev/null +++ b/src/WMS.Web.Domain/Entitys/OutStockTaskErpDetails.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; +using WMS.Web.Core; + +namespace WMS.Web.Domain.Entitys +{ + /// + /// 对应金蝶的明细 + /// + [Serializable] + [Table("t_erp_outstock_task_erp_details")] + public class OutStockTaskErpDetails : EntityBase + { + public OutStockTaskErpDetails() { } + /// + /// 主键 订单编号 + /// + [Column("Id")] + public override int Id { get; set; } + /// + /// 任务单明细Id + /// + [Column("DetailId")] + public int DetailId { get; set; } + /// + /// 对应金蝶单据明细id(销售出库同步金蝶下推使用) + /// + [Column("Erp_DetailId")] + public int Erp_DetailId { get; set; } + /// + /// 来源单号 + /// + [Column("SourceBillNo")] + public string SourceBillNo { get; set; } + /// + /// 销售订单号 + /// + [Column("SaleBillNo")] + public string SaleBillNo { get; set; } + /// + /// 应出库数量 + /// + [Column("AccruedQty")] + public decimal AccruedQty { get; set; } + /// + /// 已出库数量 + /// + [Column("RealityQty")] + public decimal RealityQty { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IOutStockTaskRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IOutStockTaskRepositories.cs index f5e57db1..0c29481b 100644 --- a/src/WMS.Web.Domain/Infrastructure/IOutStockTaskRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IOutStockTaskRepositories.cs @@ -23,7 +23,7 @@ namespace WMS.Web.Domain.Infrastructure /// 查询实体集合 Task> GetEntityList(List ids); /// - /// 列表-根据明细中的来源单号 + /// 列表-根据明细中的来源单号精确匹配 /// /// /// diff --git a/src/WMS.Web.Domain/Mappers/OutStockMapper.cs b/src/WMS.Web.Domain/Mappers/OutStockMapper.cs index 6781d43d..3e9a7f08 100644 --- a/src/WMS.Web.Domain/Mappers/OutStockMapper.cs +++ b/src/WMS.Web.Domain/Mappers/OutStockMapper.cs @@ -13,20 +13,32 @@ namespace WMS.Web.Domain.Mappers { public OutStockMapper() { + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); CreateMap() .ForMember(x => x.Id, ops => ops.Ignore()) .ForMember(x => x.Fid, ops => ops.Ignore()) .ForMember(x => x.Qty, ops => ops.Ignore()); + CreateMap() + .ForMember(x => x.Id, ops => ops.Ignore()) + .ForMember(x => x.DetailId, ops => ops.Ignore()) + .ForMember(x => x.Qty, ops => ops.Ignore()); CreateMap(); CreateMap(); - CreateMap() - .ForPath(x => x.SourceBillNos, ops => ops.MapFrom(x =>new List() { x.SourceBillNo })) - .ForPath(x => x.SaleBillNos, ops => ops.MapFrom(x => new List() { x.SaleBillNo })); + CreateMap(); + CreateMap(); } } } diff --git a/src/WMS.Web.Domain/Services/BoxService.cs b/src/WMS.Web.Domain/Services/BoxService.cs index 53ffcc13..69febf42 100644 --- a/src/WMS.Web.Domain/Services/BoxService.cs +++ b/src/WMS.Web.Domain/Services/BoxService.cs @@ -76,6 +76,7 @@ namespace WMS.Web.Domain.Services foreach (var sn in ops_box.Details.SelectMany(s => s.SerialNumbers)) { var detail = ops_box.Details.FirstOrDefault(f => f.SerialNumbers.Select(s=>s.SerialNumber).Equals(sn.SerialNumber)); + if (detail == null) continue; var opsSerial = list.FirstOrDefault(f => f.OpsBoxId == b.OpsBoxId).Details .SelectMany(s => s.SerialNumbers) .FirstOrDefault(s => s.SerialNumber.Equals(sn.SerialNumber)); diff --git a/src/WMS.Web.Domain/Services/OutStockService.cs b/src/WMS.Web.Domain/Services/OutStockService.cs index f58a1c0a..25b68801 100644 --- a/src/WMS.Web.Domain/Services/OutStockService.cs +++ b/src/WMS.Web.Domain/Services/OutStockService.cs @@ -54,30 +54,40 @@ namespace WMS.Web.Domain.Services public async Task Save(SaveOutStockRequest dto, LoginInDto loginInfo) { var outStockTask = await _outStockTaskRepositories.Get(dto.TaskId); - if(outStockTask.Status== OutStockStatus.Already) + if (outStockTask.Status == OutStockStatus.Already) return Result.ReFailure(ResultCodes.OutStockTaskAlready); if (outStockTask.Status == OutStockStatus.Repeal) return Result.ReFailure(ResultCodes.OutStockTaskRepeal); //上传的物料在任务单里没有找到不能出库 - var ex = dto.Details.Select(s=>s.MaterialId).Except(outStockTask.Details.Select(s=>s.MaterialId)).ToList(); + var ex = dto.Details.Select(s => s.MaterialId).Except(outStockTask.Details.Select(s => s.MaterialId)).ToList(); if (ex.Count() > 0) return Result.ReFailure(ResultCodes.OutStockMaterialError); - + var mIds = dto.Details.GroupBy(g => g.MaterialId).Select(s => s.Key).ToList(); OutStock entity = new OutStock(); entity.Create(loginInfo.UserInfo.StaffId, outStockTask); - foreach (var d in dto.Details) + foreach (var mid in mIds) { //任务单明细 - var tDetail = outStockTask.Details.FirstOrDefault(f => f.MaterialId == d.MaterialId); + var tDetail = outStockTask.Details.FirstOrDefault(f => f.MaterialId == mid); + var dtoDetails = dto.Details.Where(w => w.MaterialId == mid); + var qty = dtoDetails.Sum(s => s.Qty); + if (tDetail == null) continue; - var res = outStockTask.OutStock(d.MaterialId, d.Qty); + var res = outStockTask.OutStock(mid, qty); if (!res.IsSuccess) return res; var outd = _mapper.Map(tDetail); - - outd.Qty = d.Qty; - outd.SerialNumbers = d.SerialNumbers; + //循环添加erp同步明细 + foreach (var c in res.Data) + { + var tErpDetail = tDetail.ErpDetails.FirstOrDefault(f => f.SourceBillNo.Equals(c.sourceBillNo)); + var oErpDetail = _mapper.Map(tErpDetail); + oErpDetail.Qty = c.qty; + outd.ErpDetails.Add(oErpDetail); + } + outd.Qty = qty; + outd.SerialNumbers.AddRange(dtoDetails.SelectMany(s => s.SerialNumbers)); entity.Details.Add(outd); } @@ -114,7 +124,7 @@ namespace WMS.Web.Domain.Services { //下推金蝶 var res = await _erpService.Push(new Core.Dto.Erp.ErpPushDto() { }); - entity.Sync(res.IsSuccess, loginInfo.UserInfo.StaffId, res.Message); + entity.Sync(new List(), res.IsSuccess, loginInfo.UserInfo.StaffId, res.Message); } var isSuccess = await _outStockRepositories.EditEntityList(list, true); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); diff --git a/src/WMS.Web.Domain/Services/OutStockTaskService.cs b/src/WMS.Web.Domain/Services/OutStockTaskService.cs index 66c9aa6a..57eb2c08 100644 --- a/src/WMS.Web.Domain/Services/OutStockTaskService.cs +++ b/src/WMS.Web.Domain/Services/OutStockTaskService.cs @@ -103,18 +103,41 @@ namespace WMS.Web.Domain.Services if (data_list.Count != 0) { //2.1提取出wms任务单明细信息 - foreach (var e in erp_list) + foreach (var outStockTask in data_list) { - //代表单据已经存在 那么就对单据进行修改 - var data = data_list.FirstOrDefault(f => f.Details.SelectMany(s => s.SourceBillNos).Contains(e.SourceBillNo)); - var detail = data.Details.FirstOrDefault(w => w.MaterialId == e.MaterialId); - //存在就修改,没有就添加 - if (detail != null) - detail.AccruedQty = e.AccruedQty; - else - data.Details.Add(_mapper.Map(e)); + var sourcNos = outStockTask.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo).ToList(); + var erps = erp_list.Where(w => sourcNos.Contains(w.SourceBillNo)).ToList(); + foreach (var erp in erps) + { + var detail = outStockTask.Details.FirstOrDefault(w => w.MaterialId == erp.MaterialId); + if (detail == null) + { + //添加一条物料明细 + detail = _mapper.Map(erp); + var erpDetail = _mapper.Map(erp); + detail.ErpDetails.Add(erpDetail); + outStockTask.Details.Add(detail); + } + else + { + //找到物料明细下面对应的来源单明细 然后修改 + var erpDetail = detail.ErpDetails.FirstOrDefault(f => f.SourceBillNo.Equals(erp.SourceBillNo)); + if (erpDetail == null) + { + erpDetail = _mapper.Map(erp); + detail.ErpDetails.Add(erpDetail); + outStockTask.Details.Add(detail); + } + else + { + erpDetail.AccruedQty = erp.AccruedQty; + detail.AccruedQty = detail.ErpDetails.Sum(s => s.AccruedQty); + } + } + //操作完后剔除 + erp_removeList.Add(erp); + } - erp_removeList.Add(e); } //2.2.提交修改 var isSuccess = await _outStockTaskRepositories.EditEntityList(data_list, isTransaction); @@ -139,7 +162,13 @@ namespace WMS.Web.Domain.Services //找到当前对应来源单据编号的集合数据 var current_erp_details = erp_list.Where(x => x.SourceBillNo == item).ToList(); //给到dto的实体明细中 - entity.Details = _mapper.Map>(current_erp_details); + foreach (var erp in current_erp_details) + { + var detail = _mapper.Map(erp); + var erpDetail = _mapper.Map(erp); + detail.ErpDetails.Add(erpDetail); + entity.Details.Add(detail); + } add_entitys.Add(entity); } //3.1提交新增 @@ -281,15 +310,15 @@ namespace WMS.Web.Domain.Services foreach (var entity in taskList) { if (entity.Type == OutStockType.Sal) - DeliveryNotice_Nos.AddRange(entity.Details.SelectMany(s => s.SourceBillNos)); + DeliveryNotice_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s=>s.SourceBillNo)); else if (entity.Type == OutStockType.Stkdirecttransfers) - TransferDirect_Nos.AddRange(entity.Details.SelectMany(s => s.SourceBillNos)); + TransferDirect_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo)); else if (entity.Type == OutStockType.StktransferInst) - TransferOut_Nos.AddRange(entity.Details.SelectMany(s => s.SourceBillNos)); + TransferOut_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo)); else if (entity.Type == OutStockType.Assembled) - AssembledApp_Nos.AddRange(entity.Details.SelectMany(s => s.SourceBillNos)); + AssembledApp_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo)); else if (entity.Type == OutStockType.Miscellaneous) - MisDeliveryOut_Nos.AddRange(entity.Details.SelectMany(s => s.SourceBillNos)); + MisDeliveryOut_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo)); } if (DeliveryNotice_Nos.Count() > 0) diff --git a/src/WMS.Web.Domain/Services/SerialNumberService.cs b/src/WMS.Web.Domain/Services/SerialNumberService.cs index 5b903615..3b2f6f5d 100644 --- a/src/WMS.Web.Domain/Services/SerialNumberService.cs +++ b/src/WMS.Web.Domain/Services/SerialNumberService.cs @@ -204,14 +204,14 @@ namespace WMS.Web.Domain.Services OperateTime = DateTime.Now, OperateType = OutStockTypeConvert(outStock.Type), OperateUser = userName, - Remark = "来源单号:" + string.Join(",", outstockDetail.SourceBillNos) + "\r\n" + "出库单号:" + outStock.BillNo + Remark = "来源单号:" + string.Join(",", outstockDetail.ErpDetails.Select(s=>s.SourceBillNo)) + "\r\n" + "出库单号:" + outStock.BillNo }; if (outStock.Type == OutStockType.Sal) { var detail = outStock.Details.FirstOrDefault(f => f.MaterialId == entity.MaterialId); var res_c = await _erpService.BillQueryForCustomer(); var customer = res_c.Data.FirstOrDefault(f => f.Id == outStock.ReceiptCustomerId); - op.Remark += "\r\n" + "销售订单号:" + string.Join(",", detail.SaleBillNos); + op.Remark += "\r\n" + "销售订单号:" + string.Join(",", detail.ErpDetails.Select(s => s.SaleBillNo)); op.Remark += "\r\n" + "客户:" + customer?.Name; } sList.Add(op); diff --git a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs index b2905922..95328a6d 100644 --- a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs +++ b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs @@ -81,6 +81,10 @@ namespace WMS.Web.Repositories.Configuration ent.ToTable("t_wms_outstock"); ent.HasKey(x => x.Id); + ent.Property(f => f.SuccessSyncFail).HasConversion( + v => JsonConvert.SerializeObject(v), + v => JsonConvert.DeserializeObject>(v)); + ent.HasMany(p => p.Details) .WithOne() .HasForeignKey(p => p.Fid) @@ -95,13 +99,16 @@ namespace WMS.Web.Repositories.Configuration v => JsonConvert.SerializeObject(v), v => JsonConvert.DeserializeObject>(v)); - ent.Property(f => f.SourceBillNos).HasConversion( - v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject>(v)); + ent.HasMany(p => p.ErpDetails) + .WithOne() + .HasForeignKey(p => p.DetailId) + .OnDelete(DeleteBehavior.Cascade); + }); - ent.Property(f => f.SaleBillNos).HasConversion( - v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject>(v)); + builder.Entity(ent => + { + ent.ToTable("t_wms_outstock_erp_details"); + ent.HasKey(x => x.Id); }); #endregion @@ -121,13 +128,16 @@ namespace WMS.Web.Repositories.Configuration ent.ToTable("t_erp_outstock_task_details"); ent.HasKey(x => x.Id); - ent.Property(f => f.SourceBillNos).HasConversion( - v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject>(v)); + ent.HasMany(p => p.ErpDetails) + .WithOne() + .HasForeignKey(p => p.DetailId) + .OnDelete(DeleteBehavior.Cascade); + }); - ent.Property(f => f.SaleBillNos).HasConversion( - v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject>(v)); + builder.Entity(ent => + { + ent.ToTable("t_erp_outstock_task_erp_details"); + ent.HasKey(x => x.Id); }); #endregion @@ -285,7 +295,9 @@ namespace WMS.Web.Repositories.Configuration public DbSet OutStockTask { get; set; } public DbSet TakeStock { get; set; } public DbSet OutStockDetails { get; set; } + public DbSet OutStockErpDetails { get; set; } public DbSet OutStockTaskDetails { get; set; } + public DbSet OutStockTaskErpDetails { get; set; } public DbSet TakeStockDetails { get; set; } public DbSet Instock { get; set; } public DbSet InStockDetails { get; set; } diff --git a/src/WMS.Web.Repositories/OutStockRepositories.cs b/src/WMS.Web.Repositories/OutStockRepositories.cs index a2ebf5d5..1c9f301b 100644 --- a/src/WMS.Web.Repositories/OutStockRepositories.cs +++ b/src/WMS.Web.Repositories/OutStockRepositories.cs @@ -82,10 +82,6 @@ namespace WMS.Web.Repositories /// public async Task<(List list, int total)> GetListAsync(OutStockQueryRequest dto) { - List detailIds = new List(); - if (!string.IsNullOrEmpty(dto.SourceBillNo)) - detailIds = await _context.OutStockTaskDetails.FromSqlRaw($"SELECT Id FROM t_wms_outstock_details WHERE SourceBillNo like '%{dto.SourceBillNo}%'").Select(s => s.Id).ToListAsync(); - List ids = new List(); if (!string.IsNullOrEmpty(dto.Creator)) { @@ -118,7 +114,7 @@ namespace WMS.Web.Repositories #endregion - var query = _context.OutStockDetails + var query = _context.OutStockDetails.Include(x => x.ErpDetails) .GroupJoin(_context.OutStock, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders }) .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) .OrderByDescending(o => o.order.Id) @@ -138,8 +134,8 @@ namespace WMS.Web.Repositories query = query.Where(w => mIds.Contains(w.detail.MaterialId)); if (ids.Count() > 0) query = query.Where(w => ids.Contains(w.order.CreatorId)); - if (detailIds.Count()!=0) - query = query.Where(w => detailIds.Contains(w.detail.Id)); + if (!string.IsNullOrEmpty(dto.SourceBillNo)) + query = query.Where(w => w.detail.ErpDetails.Where(wd => EF.Functions.Like(wd.SourceBillNo, "%" + dto.SourceBillNo + "%")).Select(s => s.DetailId).Contains(w.detail.Id)); if (dto.Type != null) query = query.Where(w => w.order.Type == (OutStockType)dto.Type); if (dto.SuccessSync != null) @@ -164,8 +160,8 @@ namespace WMS.Web.Repositories CreateTime = s.order.CreateTime.DateToStringSeconds(), SuccessSync = s.order.SuccessSync, Stock = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, s.detail.StockCode), - SourceBillNo =string.Join(",",s.detail.SourceBillNos), - SaleBillNo = string.Join(",", s.detail.SaleBillNos), + SourceBillNo = string.Join(",", s.detail.ErpDetails.Select(s => s.SourceBillNo)), + SaleBillNo = string.Join(",", s.detail.ErpDetails.Select(s => s.SaleBillNo)), DeliveryOrg = _erpBasicDataExtendService.GetOrgName(orgs, s.order.DeliveryOrgId), ReceiptCustomer = s.order.Type == OutStockType.Sal ? _erpBasicDataExtendService.GetCustomerName(customers, s.order.ReceiptCustomerId) @@ -196,12 +192,12 @@ namespace WMS.Web.Repositories List list = entitys.Select(s => s.Id).ToList(); var res = await _context.OutStock - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .Where(f => list.Contains(f.Id)).ToListAsync(); _mapper.ToMapList(entitys, res); _mapper.ToMapList(entitys.SelectMany(s => s.Details).ToList(), res.SelectMany(s => s.Details).ToList()); - + _mapper.ToMapList(entitys.SelectMany(s => s.Details).SelectMany(s => s.ErpDetails).ToList(), res.SelectMany(s => s.Details).SelectMany(s => s.ErpDetails).ToList()); await _context.SaveChangesAsync(); if (_transaction != null) _transaction.Commit(); @@ -223,7 +219,7 @@ namespace WMS.Web.Repositories public async Task> GetEntityList(List ids) { var res = await _context.OutStock - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .Where(f => ids.Contains(f.Id)) .ToListAsync(); @@ -244,12 +240,13 @@ namespace WMS.Web.Repositories try { var res = await _context.OutStock - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .FirstOrDefaultAsync(f => f.Id == entity.Id); if (res == null) return null; _mapper.Map(entity, res); _mapper.ToMapList(entity.Details, res.Details); + _mapper.ToMapList(entity.Details.SelectMany(s => s.ErpDetails).ToList(), res.Details.SelectMany(s => s.ErpDetails).ToList()); await _context.SaveChangesAsync(); if (_transaction != null) @@ -272,7 +269,7 @@ namespace WMS.Web.Repositories public async Task GetByTaskId(int taskId) { var res = await _context.OutStock - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .FirstOrDefaultAsync(f => taskId == f.TaskId); return res.Clone(); diff --git a/src/WMS.Web.Repositories/OutStockTaskRepositories.cs b/src/WMS.Web.Repositories/OutStockTaskRepositories.cs index b852ceea..c63ee134 100644 --- a/src/WMS.Web.Repositories/OutStockTaskRepositories.cs +++ b/src/WMS.Web.Repositories/OutStockTaskRepositories.cs @@ -125,12 +125,12 @@ namespace WMS.Web.Repositories List list = entitys.Select(s => s.Id).ToList(); var res = await _context.OutStockTask - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .Where(f => list.Contains(f.Id)).ToListAsync(); _mapper.ToMapList(entitys, res); _mapper.ToMapList(entitys.SelectMany(s => s.Details).ToList(), res.SelectMany(s => s.Details).ToList()); - + _mapper.ToMapList(entitys.SelectMany(s => s.Details).SelectMany(s => s.ErpDetails).ToList(), res.SelectMany(s => s.Details).SelectMany(s => s.ErpDetails).ToList()); await _context.SaveChangesAsync(); if (_transaction != null) _transaction.Commit(); @@ -152,7 +152,7 @@ namespace WMS.Web.Repositories public async Task Get(int id) { var res = await _context.OutStockTask - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(x=>x.ErpDetails) .FirstOrDefaultAsync(f => id == f.Id); return res.Clone(); @@ -188,12 +188,13 @@ namespace WMS.Web.Repositories try { var res = await _context.OutStockTask - .Include(s => s.Details) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) .FirstOrDefaultAsync(f => f.Id == entity.Id); if (res == null) return null; _mapper.Map(entity, res); _mapper.ToMapList(entity.Details, res.Details); + _mapper.ToMapList(entity.Details.SelectMany(s => s.ErpDetails).ToList(), res.Details.SelectMany(s => s.ErpDetails).ToList()); await _context.SaveChangesAsync(); if (_transaction != null) @@ -216,17 +217,13 @@ namespace WMS.Web.Repositories /// public async Task<(List list, int total)> GetListAsync(OutStockTaskQueryRequest dto) { - List ids = new List(); - if (!string.IsNullOrEmpty(dto.SourceBillNo)) - ids = await _context.OutStockTaskDetails.FromSqlRaw($"SELECT Id FROM t_erp_outstock_task_details WHERE SourceBillNo like '%{dto.SourceBillNo}%'").Select(s => s.Id).ToListAsync(); - - #region erp基础资料 List mIds = new List(); var materials_result = await _erpService.BillQueryForMaterial(); if (!materials_result.IsSuccess) return (new List(), 0); var materials = materials_result.Data.ToList(); + //var materials =new List(); //物料集合;模糊查询后的物料集合 if (!string.IsNullOrEmpty(dto.MaterialNumber)) { @@ -247,7 +244,7 @@ namespace WMS.Web.Repositories #endregion - var query = _context.OutStockTaskDetails + var query = _context.OutStockTaskDetails.Include(x => x.ErpDetails) .GroupJoin(_context.OutStockTask, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders }) .SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order }) .OrderByDescending(o => o.order.Id) @@ -267,8 +264,8 @@ namespace WMS.Web.Repositories query = query.Where(w => mIds.Contains(w.detail.MaterialId)); if (dto.Ids.Count() > 0) query = query.Where(w => dto.Ids.Contains(w.detail.Id)); - if (ids.Count() != 0) - query = query.Where(w => ids.Contains(w.detail.Id)); + if (!string.IsNullOrEmpty(dto.SourceBillNo)) + query = query.Where(w => w.detail.ErpDetails.Where(wd => EF.Functions.Like(wd.SourceBillNo, "%" + dto.SourceBillNo + "%")).Select(s => s.DetailId).Contains(w.detail.Id)); if (dto.Type != null) query = query.Where(w => w.order.Type == (OutStockType)dto.Type); if (dto.Status != null) @@ -295,8 +292,8 @@ namespace WMS.Web.Repositories OutStockBeginTime = s.detail.OutStockBeginTime.DateToStringSeconds(), OutStockEndTime = s.detail.OutStockEndTime.DateToStringSeconds(), Stock = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, s.detail.StockCode), - SourceBillNo = string.Join(",", s.detail.SourceBillNos), - SaleBillNo = string.Join(",", s.detail.SaleBillNos), + SourceBillNo = string.Join(",", s.detail.ErpDetails.Select(s => s.SourceBillNo)), + SaleBillNo = string.Join(",", s.detail.ErpDetails.Select(s => s.SaleBillNo)), DeliveryOrg = _erpBasicDataExtendService.GetOrgName(orgs, s.order.DeliveryOrgId), ReceiptCustomer = s.order.Type == OutStockType.Sal ? _erpBasicDataExtendService.GetCustomerName(customers, s.order.ReceiptCustomerId) @@ -321,17 +318,22 @@ namespace WMS.Web.Repositories if (!materials_result.IsSuccess) return new List(); var materials = materials_result.Data.ToList(); - List ids = new List(); - ids = await _context.OutStockTaskDetails.FromSqlRaw($"SELECT Fid FROM t_erp_outstock_task_details WHERE SourceBillNo like '%{billNo}%'").Select(s => s.Id).ToListAsync(); - var list = await _context.OutStockTask.Include(x => x.Details) + + var list = await _context.OutStockTask.Include(x => x.Details).ThenInclude(s => s.ErpDetails) .Where(f => (EF.Functions.Like(f.BillNo, "%" + billNo + "%") || - ids.Contains(f.Id)) && + f.Details.SelectMany(s => s.ErpDetails).Where(w => EF.Functions.Like(w.SourceBillNo, "%" + billNo + "%")).Any()) && (f.Status == OutStockStatus.Part || f.Status == OutStockStatus.Wait)) .OrderByDescending(o => o.Id) .ToListAsync(); var response = _mapper.Map>(list); + foreach (var r in response) + { + var entity = list.FirstOrDefault(f => f.Id == r.Id); + r.StockCode = entity.Details.First().StockCode; + r.StockName = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, r.StockCode); + } //获取物料信息 显示物料三件套 foreach (var r in response.SelectMany(s => s.details)) { @@ -354,13 +356,15 @@ namespace WMS.Web.Repositories return new GetOutStockTaskByNoResponse(); var materials = materials_result.Data.ToList(); - var entity = await _context.OutStockTask.Include(x => x.Details) + var entity = await _context.OutStockTask.Include(x => x.Details).ThenInclude(s => s.ErpDetails) .FirstOrDefaultAsync(f => f.BillNo.Equals(billNo) && (f.Status == OutStockStatus.Part || f.Status == OutStockStatus.Wait)); if (entity == null) return new GetOutStockTaskByNoResponse(); var response = _mapper.Map(entity); + response.StockCode = entity.Details.First().StockCode; + response.StockName = _singleDataService.GetSingleData(SingleAction.Stocks, _loginRepositories.CompanyId, response.StockCode); //获取物料信息 显示物料三件套 foreach (var r in response.details) { @@ -372,26 +376,15 @@ namespace WMS.Web.Repositories } /// - /// 单号搜索 + /// 单号精确匹配 /// /// /// public async Task> GetListBySourceBillNo(List sourcebillNos) { - List ids = new List(); - string str=$"SELECT Fid FROM t_erp_outstock_task_details WHERE "; - for (int i=0;i s.Id).ToListAsync(); - var entitys = await _context.OutStockTask - .Include(s => s.Details) - .Where(w => ids.Contains(w.Id)) + .Include(s => s.Details).ThenInclude(s => s.ErpDetails) + .Where(w => w.Details.SelectMany(s => s.ErpDetails).Where(wd => sourcebillNos.Contains(wd.SourceBillNo)).Any()) .OrderByDescending(o => o.Id) .ToListAsync(); @@ -436,12 +429,9 @@ namespace WMS.Web.Repositories public async Task> GetOutStockTaskNosByNo(string billNo) { - List ids = new List(); - ids = await _context.OutStockTaskDetails.FromSqlRaw($"SELECT Fid FROM t_erp_outstock_task_details WHERE SourceBillNo like '%{billNo}%'").Select(s => s.Id).ToListAsync(); - - return await _context.OutStockTask.Include(x => x.Details) + return await _context.OutStockTask.Include(x => x.Details).ThenInclude(s => s.ErpDetails) .Where(f => (EF.Functions.Like(f.BillNo, "%" + billNo + "%") || - ids.Contains(f.Id)) && + f.Details.SelectMany(s => s.ErpDetails).Where(w => EF.Functions.Like(w.SourceBillNo, "%" + billNo + "%")).Any()) && (f.Status == OutStockStatus.Part || f.Status == OutStockStatus.Wait)) .OrderByDescending(o => o.Id) .Select(s => s.BillNo) @@ -458,11 +448,16 @@ namespace WMS.Web.Repositories { return await GetListAsync(dto); } - + /// + /// 根据订单号精确搜索 + /// + /// + /// public async Task> GetListByBillNo(List billNos) { var entitys = await _context.OutStockTask .Include(s => s.Details) + .ThenInclude(s => s.ErpDetails) .Where(w => billNos.Contains(w.BillNo)) .OrderByDescending(o => o.Id) .ToListAsync();