diff --git a/src/WMS.Web.Api/Controllers/TestController.cs b/src/WMS.Web.Api/Controllers/TestController.cs index 940c1993..094b39dc 100644 --- a/src/WMS.Web.Api/Controllers/TestController.cs +++ b/src/WMS.Web.Api/Controllers/TestController.cs @@ -44,18 +44,19 @@ 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); + //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 res = await this._erpService.BillQueryForAssembledAppOutStock_Dassembly(null,DateTime.Now.AddDays(-300)); //var result= await this._erpService.BillQueryForPurchaseInStock(); //var result = await this._erpService.BillQueryForOrg(); - var result = await this._erpService.BillQueryForMaterial(); - if (!result.IsSuccess) - return ""; - return JsonConvert.SerializeObject(result.Data); + //var result = await this._erpService.BillQueryForMaterial(); + //if (!result.IsSuccess) + // return ""; + //return JsonConvert.SerializeObject(result.Data); + return ""; } [HttpGet] diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index a6e35cf2..28bad134 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -961,12 +961,12 @@ - 同步成功或者失败 null 就是未同步 + 同步成功或者失败 默认是失败状态 - 同步失败的源订单号 + 同步失败的源订单号(默认就包含所有来源单号) @@ -986,13 +986,19 @@ - 创建 + 创建(需要在明细都生成后最后调用) - + - 同步金蝶 + 同步金蝶(成功) + + + + + + 同步金蝶(失败) @@ -3394,6 +3400,13 @@ + + + 下推 + + + + 出库任务 diff --git a/src/WMS.Web.Domain/Entitys/OutStock.cs b/src/WMS.Web.Domain/Entitys/OutStock.cs index 0a760543..445afe7b 100644 --- a/src/WMS.Web.Domain/Entitys/OutStock.cs +++ b/src/WMS.Web.Domain/Entitys/OutStock.cs @@ -62,12 +62,12 @@ namespace WMS.Web.Domain.Entitys [Column("CreateTime")] public DateTime CreateTime { get; set; } = DateTime.Now; /// - /// 同步成功或者失败 null 就是未同步 + /// 同步成功或者失败 默认是失败状态 /// [Column("SuccessSync")] - public bool? SuccessSync { get; set; } + public bool SuccessSync { get; set; } = false; /// - /// 同步失败的源订单号 + /// 同步失败的源订单号(默认就包含所有来源单号) /// [Column("SuccessSyncFail")] public List SuccessSyncFail { get; set; }=new List(); @@ -86,7 +86,7 @@ namespace WMS.Web.Domain.Entitys /// public List Details = new List(); /// - /// 创建 + /// 创建(需要在明细都生成后最后调用) /// /// public void Create(int creatorId, OutStockTask task) @@ -97,16 +97,28 @@ namespace WMS.Web.Domain.Entitys this.ReceiptCustomerId = task.ReceiptCustomerId; this.CreatorId = creatorId; this.CreateTime = DateTime.Now; + this.SuccessSync = false; + this.SuccessSyncFail = this.Details.SelectMany(s => s.ErpDetails).GroupBy(g => g.SourceBillNo).Select(s=>s.Key).ToList(); } /// - /// 同步金蝶 + /// 同步金蝶(成功) /// /// - public void Sync(List sourcBilNos, bool isSuccess, int operateId, string remark) + public void SyncSuccess(string sourcNos, int operateId) { - SuccessSyncFail.AddRange(sourcBilNos); - SuccessSyncFail.Distinct(); - this.SuccessSync = isSuccess; + this.SuccessSyncFail.Remove(sourcNos); + this.SuccessSync = true; + this.Remark = ""; + this.OperateId = operateId; + this.SyncTime = DateTime.Now; + } + /// + /// 同步金蝶(失败) + /// + /// + public void SyncFail(string remark,int operateId) + { + this.SuccessSync = false; this.Remark = remark; this.OperateId = operateId; this.SyncTime = DateTime.Now; diff --git a/src/WMS.Web.Domain/Mappers/AppMapper.cs b/src/WMS.Web.Domain/Mappers/AppMapper.cs index 5c0cb91e..eb327270 100644 --- a/src/WMS.Web.Domain/Mappers/AppMapper.cs +++ b/src/WMS.Web.Domain/Mappers/AppMapper.cs @@ -2,9 +2,12 @@ using System; using System.Collections.Generic; using System.Text; +using WMS.Web.Core.Dto; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Dto.Login.Temp; using WMS.Web.Core.Dto.Login.Temp.v3; +using WMS.Web.Core.Help; +using WMS.Web.Domain.Entitys; namespace WMS.Web.Domain.Mappers { @@ -61,7 +64,11 @@ namespace WMS.Web.Domain.Mappers .ForMember(x => x.Roles, opt => opt.Ignore()).ReverseMap(); - + CreateMap() + .ForMember(x => x.Date, ops => ops.MapFrom(x => x.Date.DateToStringSeconds())) + //.ForMember(x => x.StatusKey, ops => ops.MapFrom(x => (int)x.Status)) + // .ForMember(x => x.Status, ops => ops.MapFrom(x => x.Status.GetRemark())) + .ForMember(x => x.Type, ops => ops.MapFrom(x => (int)x.Type)); } } } diff --git a/src/WMS.Web.Domain/QuartzJob/OutStockOrderQuartzJob.cs b/src/WMS.Web.Domain/QuartzJob/OutStockOrderQuartzJob.cs index bd5b0317..93ad5c1f 100644 --- a/src/WMS.Web.Domain/QuartzJob/OutStockOrderQuartzJob.cs +++ b/src/WMS.Web.Domain/QuartzJob/OutStockOrderQuartzJob.cs @@ -46,17 +46,17 @@ namespace WMS.Web.Domain.QuartzJob { //2.记录:开始时间 var begindatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - _logger.LogInformation($"出库单-同步金蝶入库单数据:执行开始时间->{begindatetime}"); + _logger.LogInformation($"出库单-同步金蝶出库单数据:执行开始时间->{begindatetime}"); //3.同步数据 var result = await _outStockTaskService.Sync(null); //5.记录:结束时间 var enddatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - _logger.LogInformation($"出库单-同步金蝶入库单数据:执行结束时间->{begindatetime}"); + _logger.LogInformation($"出库单-同步金蝶出库单数据:执行结束时间->{begindatetime}"); } catch (Exception ex) { - _logger.LogInformation($"同步金蝶入库单数据:定时任务执行失败->{ex.Message}"); + _logger.LogInformation($"同步金蝶出库单数据:定时任务执行失败->{ex.Message}"); } } diff --git a/src/WMS.Web.Domain/Services/BoxService.cs b/src/WMS.Web.Domain/Services/BoxService.cs index 69febf42..000fe806 100644 --- a/src/WMS.Web.Domain/Services/BoxService.cs +++ b/src/WMS.Web.Domain/Services/BoxService.cs @@ -56,7 +56,8 @@ namespace WMS.Web.Domain.Services { //数据库里已经存在箱信息 移除 var box = list.FirstOrDefault(f => f.BoxBillNo.Equals(s)); - list.Remove(box); + if (box != null) + list.Remove(box); } var boxs = _mapper.Map>(list); @@ -75,13 +76,14 @@ namespace WMS.Web.Domain.Services var ops_box = list.FirstOrDefault(f => f.OpsBoxId == b.OpsBoxId); 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 detail = ops_box.Details.FirstOrDefault(f => f.SerialNumbers.Select(s => s.SerialNumber).Contains(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)); //序列号 - SerialNumbers s = new SerialNumbers(sn.SerialNumber, detail.MaterialId,b.Id,b.OpsBoxId, opsSerial.BarCereateUser,opsSerial.BarCreateTime); + SerialNumbers s = new SerialNumbers(sn.SerialNumber, detail.MaterialId, b.Id, b.OpsBoxId, opsSerial.BarCereateUser, opsSerial.BarCreateTime); sList.Add(s); //序列号记录(序列号生成) SerialNumberOperate so = new SerialNumberOperate(sn.SerialNumber, SerialNumberOperateType.Generate, detail.MaterialId, opsSerial.BarCereateUser, "", b.SupplierId, b.OrgId, null, opsSerial.BarCreateTime); diff --git a/src/WMS.Web.Domain/Services/ChangeMoveBoxService.cs b/src/WMS.Web.Domain/Services/ChangeMoveBoxService.cs index 08b58e1e..dc898bf0 100644 --- a/src/WMS.Web.Domain/Services/ChangeMoveBoxService.cs +++ b/src/WMS.Web.Domain/Services/ChangeMoveBoxService.cs @@ -48,6 +48,8 @@ namespace WMS.Web.Domain.Services /// public async Task ChangeBoxSave(SaveChangeBoxRecordRequest dto, LoginInDto loginInfo, bool isTransaction = false) { + //1.有原箱时 需要判断 物料对应的序列号是否存在 + List boxList = new List(); //原箱有可能没有 var srcBox = await _boxRepositories.Get(dto.SrcBoxId); @@ -70,6 +72,8 @@ namespace WMS.Web.Domain.Services if (destBox != null) boxList.Add(destBox); + //2.修改库存时需要区别 有原箱和没有原箱的情况 + //var entity = _mapper.Map(dto);\ List list = new List(); foreach (var d in dto.Details) @@ -111,6 +115,8 @@ namespace WMS.Web.Domain.Services /// public async Task MoveBoxSave(List dto, bool IsUp, LoginInDto loginInfo) { + //1.下架时 需要验证箱是否在库存里 + List entityList = new List(); foreach (var d in dto) { @@ -118,8 +124,8 @@ namespace WMS.Web.Domain.Services entity.Create(IsUp == true ? MoveBoxType.Up : MoveBoxType.Down, d.BoxId, d.SubStockId, loginInfo.UserInfo.StaffId); entityList.Add(entity); } - //需要填写规格型号 - //需要修改库存 + + //2.需要修改库存 IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; diff --git a/src/WMS.Web.Domain/Services/OutStockService.cs b/src/WMS.Web.Domain/Services/OutStockService.cs index 25b68801..b7ddaf78 100644 --- a/src/WMS.Web.Domain/Services/OutStockService.cs +++ b/src/WMS.Web.Domain/Services/OutStockService.cs @@ -6,15 +6,18 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto; +using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Dto.OutStock; using WMS.Web.Core.Dto.TakeStock; +using WMS.Web.Core.Help; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Values; +using WMS.Web.Domain.Values.Erp; namespace WMS.Web.Domain.Services { @@ -62,10 +65,10 @@ namespace WMS.Web.Domain.Services 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); + //1.需要验证物料对应箱和序列号是否存在库存 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 mid in mIds) { //任务单明细 @@ -90,6 +93,8 @@ namespace WMS.Web.Domain.Services outd.SerialNumbers.AddRange(dtoDetails.SelectMany(s => s.SerialNumbers)); entity.Details.Add(outd); } + entity.Create(loginInfo.UserInfo.StaffId, outStockTask); + //需要填写序列号 //需要修改库存 @@ -122,13 +127,43 @@ namespace WMS.Web.Domain.Services var list = await _outStockRepositories.GetEntityList(dto.Ids); foreach (var entity in list) { - //下推金蝶 - var res = await _erpService.Push(new Core.Dto.Erp.ErpPushDto() { }); - entity.Sync(new List(), res.IsSuccess, loginInfo.UserInfo.StaffId, res.Message); + if (entity.SuccessSync) continue; + List failList = entity.SuccessSyncFail.Clone();//同步失败的来源单号 + //找到单据里需要同步的单据 + var sourcNos = entity.Details.SelectMany(s => s.ErpDetails).GroupBy(s => s.SourceBillNo).Select(s => s.Key); + foreach (var s in failList) + { + var erp_details = entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.Erp_DetailId).ToList(); + var erpDto = new ErpPushDto() { + FormId = FormIdParam.SAL_DELIVERYNOTICE.ToString(), + Numbers = new List() { s }, + Type="", + DetailsId = string.Join(",", erp_details) + }; + //下推金蝶 + var res = await this.Push(erpDto); + if (res.IsSuccess) + entity.SyncSuccess(s, loginInfo.UserInfo.StaffId); + else + entity.SyncFail(res.Message, loginInfo.UserInfo.StaffId); + } + entity.SuccessSync = entity.SuccessSyncFail.Count() > 0 ? false : true; + //最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱 + var isSuccess = await _outStockRepositories.Edit(entity, true); + if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError); } - var isSuccess = await _outStockRepositories.EditEntityList(list, true); - if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); + + return Result.ReSuccess(); + } + /// + /// 下推 + /// + /// + /// + private async Task Push(ErpPushDto dto) + { + var res = await _erpService.Push(dto); return Result.ReSuccess(); } } diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 45621b60..246f371b 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -1623,7 +1623,7 @@ namespace WMS.Web.Domain.Services.Public //4.仓库:wms系统的仓库值---现在这个没有加,因为还单点没有和金蝶同步 FBillTypeID param.FilterString = "FDocumentStatus='C' and FAffairType='Dassembly' and FBillTypeID='3441ac133848446f824d0ab760c8b3c7'"; //string srt = JsonConvert.SerializeObject(stocks_codes); - param.FilterString += " and FSrcStockID in (" + stocks_codes + ")"; + param.FilterString += " and FStockID in (" + stocks_codes + ")"; //根据原订单号查询 if (sourceBillNos != null && sourceBillNos.Count() > 0) @@ -1779,7 +1779,7 @@ namespace WMS.Web.Domain.Services.Public //4.仓库:wms系统的仓库值---现在这个没有加,因为还单点没有和金蝶同步 FBillTypeID param.FilterString = "FDocumentStatus='C' and FAffairType='Assembly' and FBillTypeID='3441ac133848446f824d0ab760c8b3c7'"; //string srt = JsonConvert.SerializeObject(stocks_codes); - param.FilterString += " and FSrcStockID in (" + stocks_codes + ")"; + param.FilterString += " and FStockIDSETY in (" + stocks_codes + ")"; //根据原订单号查询 if (sourceBillNos != null && sourceBillNos.Count() > 0)