From a1489cf8ceacfaead817e3609f8ead61700000cf Mon Sep 17 00:00:00 2001 From: 18923810322 <1666941798@qq.com> Date: Fri, 4 Jul 2025 15:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml | 15 ++- .../IService/Public/IErpService.cs | 3 + src/WMS.Web.Domain/Services/InStockService.cs | 111 +++++++++++++++++- .../Services/Public/ErpService.cs | 66 +++++++++++ src/WMS.Web.Domain/Values/Erp/FormIdParam.cs | 6 +- .../InStockRepositories.cs | 2 +- 6 files changed, 196 insertions(+), 7 deletions(-) diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 6e62a9f3..559ac0f8 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -5692,6 +5692,14 @@ + + + 生产入库:同步金蝶 + + + + + 下推 @@ -7378,7 +7386,7 @@ - 生产入库单(来源于生产汇报单) + 生产汇报单 @@ -7386,6 +7394,11 @@ 领料出库单(来源于普通领料出库单) + + + 生产入库单(汇报) + + 文件导出状态 diff --git a/src/WMS.Web.Domain/IService/Public/IErpService.cs b/src/WMS.Web.Domain/IService/Public/IErpService.cs index 4e85c2ce..80bab256 100644 --- a/src/WMS.Web.Domain/IService/Public/IErpService.cs +++ b/src/WMS.Web.Domain/IService/Public/IErpService.cs @@ -34,6 +34,9 @@ namespace WMS.Web.Domain.IService.Public /// Task>> BillQueryForPurchaseInStockBy(string purchaseDetailId, List sourceBillNos); + Task>> BillQueryForProduceInStockBy(string purchaseDetailId, List sourceBillNos); + + /// /// erp:单据查询-采购入库单 /// diff --git a/src/WMS.Web.Domain/Services/InStockService.cs b/src/WMS.Web.Domain/Services/InStockService.cs index a824dde1..8bcebe15 100644 --- a/src/WMS.Web.Domain/Services/InStockService.cs +++ b/src/WMS.Web.Domain/Services/InStockService.cs @@ -104,10 +104,20 @@ namespace WMS.Web.Domain.Services { foreach (var entity in list) { - var res = await this.PurchaseInStock(entity, loginInfo); - if (!res.IsSuccess) - _logger.LogError($"入库单同步失败:{res.Message}"); - } + if (entity.Type.ToString() == "ProduceSotck")//走生产下推 + { + var res = await this.ProduceInStock(entity, loginInfo); + if (!res.IsSuccess) + _logger.LogError($"入库单同步失败:{res.Message}"); + + } + else + { + var res = await this.PurchaseInStock(entity, loginInfo); + if (!res.IsSuccess) + _logger.LogError($"入库单同步失败:{res.Message}"); + } + } }); return Task.FromResult(Result.ReSuccess()); } @@ -887,6 +897,9 @@ namespace WMS.Web.Domain.Services return Result.ReSuccess(response); } + + + /// /// 采购:同步金蝶 /// @@ -975,6 +988,96 @@ namespace WMS.Web.Domain.Services return Result.ReSuccess(); } + + /// + /// 生产入库:同步金蝶 + /// + /// + /// + /// + private async Task ProduceInStock(InStock entity, LoginInDto loginInfo) + { + _logger.LogInformation($"生产入库下推-同步:{JsonConvert.SerializeObject(entity)} 操作人:{loginInfo.UserInfo.StaffId}"); + var scope = _serviceScopeFactory.CreateScope(); + var sc_InStockRepositories = scope.ServiceProvider.GetRequiredService(); + + if (entity.Type != InstockType.ProduceSotck) return Result.ReSuccess(); + if (entity.SuccessSync == SyncStatus.Success) return Result.ReSuccess(); + var erpDetails_tags = entity.ErpDetails.Where(w => w.SuccessSync == SyncStatus.SyncIng).ToList(); + + //要下推的明细 + var erpDetails = new List(); + var sc_erpService = scope.ServiceProvider.GetRequiredService(); + var sc_inStockRepositories = scope.ServiceProvider.GetRequiredService(); + + //找到金蝶最新的生产汇报单 + var erp_purchase_result = await sc_erpService.BillQueryForProduceSotckin(entity.ErpDetails.GroupBy(x => x.SourceBillNo).Select(x => x.Key).ToList()); + if (!erp_purchase_result.IsSuccess) + return erp_purchase_result; + //然后刷选出对应金蝶明细和物料和wms的任务单的明细和物料是一致的就同步下推 + foreach (var item in erpDetails_tags) + { + var isHave = erp_purchase_result.Data.Where(x => x.ErpDetailId == item.ErpDetailId && x.MaterialNumber == item.MaterialNumber).Any(); + if (isHave) + erpDetails.Add(item); + } + + var sourceBillNos = entity.ErpDetails.GroupBy(x => x.SourceBillNo).Select(x => x.Key).ToList(); + var erp_InStockErpDetails = await sc_inStockRepositories.GetErpDetails(sourceBillNos); + + + foreach (var det in erpDetails) + { + var erpDto = new ErpPushDto() + { + // RuleId = "PUR_PurchaseOrder-STK_InStock",//转换规则内码 汇报单下推汇报入库单 + RuleId = "PRD_MORPT2INSTOCK",//转换规则内码 汇报单下推汇报入库单 + FormId = FormIdParam.PRD_MORPT.ToString(), + TargetFormId = FormIdParam.PRD_INSTOCK.ToString(), + DetailsId = det.ErpDetailId.ToString(), + IsDraftWhenSaveFail = true//是否需要暂存 + }; + + var erp_InStockBillNos = erp_InStockErpDetails.Where(x => x.SourceBillNo == det.SourceBillNo).Select(x => x.ErpSyncBillNo).ToList(); + List details = new List(); + var resPurchaseInStockDetails_result = await sc_erpService.BillQueryForProduceInStockBy(det.ErpDetailId.ToString(), erp_InStockBillNos); + if (resPurchaseInStockDetails_result.IsSuccess) + details = resPurchaseInStockDetails_result.Data; + + //金蝶已有的单;进行金蝶不同操作处理:保存,提交,审核 + ErpPurchaseInStockDetailsDto currentDet = null; + if (det.ErpInStockDetailId.HasValue) + currentDet = details.Where(x => x.DetailId == det.ErpInStockDetailId.Value.ToString()).FirstOrDefault(); + if (currentDet != null) + { + var res = await this.QueryFirst(currentDet, erpDto.TargetFormId, entity.BillNo, det, sc_erpService); + if (res.result.IsSuccess) + entity.SyncSuccess(det.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo); + else + entity.SyncFail(res.result.Message, det.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus); + //记录金蝶入库单明细ID + det.RecodErpInStockDetailId(res.instockDetailId); + } + else + { + //下推金蝶 + var res = await this.Push(erpDto, det, entity.BillNo, sc_erpService, sc_inStockRepositories); + if (res.result.IsSuccess) + entity.SyncSuccess(det.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo); + else + entity.SyncFail(res.result.Message, det.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus); + //记录金蝶入库单明细ID + det.RecodErpInStockDetailId(res.instockDetailId); + } + + + } + //最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱 + var isSuccess = await sc_InStockRepositories.Update(entity, true); + if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); + return Result.ReSuccess(); + } + /// /// 下推 /// diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index da2a0903..040a53f7 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -2971,6 +2971,72 @@ namespace WMS.Web.Domain.Services.Public } } + public async Task>> BillQueryForProduceInStockBy(string purchaseDetailId, List sourceBillNos) + { + try + { + //1.先登录金蝶-拿到token + var token_result = await this.Init(); + if (!token_result.IsSuccess) + return Result>.ReFailure(token_result); + + + //3.获取金蝶采购订单:拼接参数和条件 + var query = new ErpBillQueryDto(token_result.Data); + var param = new ErpBillQueryParamDto(FormIdParam.PRD_INSTOCK.ToString()); + param.FieldKeys = "FID,FInStockEntry_FEntryID,FRealQty,FMoBillNo,FBillNo,FDocumentStatus"; + param.Limit = 10000; + param.FilterString = $"FMoEntryId={purchaseDetailId}"; + + //根据原订单号查询 + if (sourceBillNos != null && sourceBillNos.Count() > 0) + { + param.FilterString = param.FilterString + " and FBillNo not in ("; + + var bill_str = ""; + int bill_index = 0; + //var srt_b = JsonConvert.SerializeObject(sourceBillNos); + foreach (var bill in sourceBillNos) + { + bill_index++; + if (bill_index == sourceBillNos.Count) + bill_str = bill_str + $"'{bill}'"; + else + bill_str = bill_str + $"'{bill}'" + ","; + } + param.FilterString = param.FilterString + bill_str + ")"; + } + + query.Data = JsonConvert.SerializeObject(param); + var json = JsonConvert.SerializeObject(query); + + //4.请求查询接口 + var result_json = await _client.ExecuteBillQueryAsync(json); + var result = JsonConvert.DeserializeObject>>(result_json); + + //5.返回数据的组装 + var erp_list = new List(); + foreach (var item in result) + { + var lis = new ErpPurchaseInStockDetailsDto(); + lis.OrderId = item[0]; + lis.DetailId = item[1]; + lis.Qty = Convert.ToDecimal(item[2]); + lis.PurchaseBillNo = item[3]; + lis.OrderBillNo = item[4]; + lis.DocumentStatus = item[5]; + lis.PurchaseDetailId = purchaseDetailId; + erp_list.Add(lis); + } + return Result>.ReSuccess(erp_list); + } + catch (Exception ex) + { + return Result>.ReFailure(ResultCodes.Erp_BillQuery_Error); + } + } + + public async Task> BillQueryForInventory(List<(string orgCode, string stockCode)> request) { try diff --git a/src/WMS.Web.Domain/Values/Erp/FormIdParam.cs b/src/WMS.Web.Domain/Values/Erp/FormIdParam.cs index aefb2beb..e67b73f4 100644 --- a/src/WMS.Web.Domain/Values/Erp/FormIdParam.cs +++ b/src/WMS.Web.Domain/Values/Erp/FormIdParam.cs @@ -82,7 +82,7 @@ namespace WMS.Web.Domain.Values.Erp /// STK_Inventory = 18, /// - /// 生产入库单(来源于生产汇报单) + /// 生产汇报单 /// PRD_MORPT = 19, @@ -90,6 +90,10 @@ namespace WMS.Web.Domain.Values.Erp /// 领料出库单(来源于普通领料出库单) /// PRD_PickMtrl = 20, + /// + /// 生产入库单(汇报) + /// + PRD_INSTOCK=21, } diff --git a/src/WMS.Web.Repositories/InStockRepositories.cs b/src/WMS.Web.Repositories/InStockRepositories.cs index 20db76c8..b9f5afa6 100644 --- a/src/WMS.Web.Repositories/InStockRepositories.cs +++ b/src/WMS.Web.Repositories/InStockRepositories.cs @@ -408,7 +408,7 @@ namespace WMS.Web.Repositories Qty = s.detail.Qty, Creator = _singleDataService.GetSingleData(SingleAction.Staffs, companyId, s.order.CreatorId), CreateTime = s.order.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), - SuccessSync = (s.order.Type != InstockType.Purchase ? "--" : (s.order.SuccessSync == SyncStatus.Success ? "成功" : (s.order.SuccessSync == SyncStatus.SyncIng ? "同步中" : "失败"))), + SuccessSync = ((s.order.Type != InstockType.Purchase && s.order.Type != InstockType.ProduceSotck) ? "--" : (s.order.SuccessSync == SyncStatus.Success ? "成功" : (s.order.SuccessSync == SyncStatus.SyncIng ? "同步中" : "失败"))), SuccessSyncStatus= (int)s.order.SuccessSync, Remark = s.order.Remark }).OrderByDescending(x => x.Id).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync();