diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index 663fedcc..165aa467 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/TestController.cs b/src/WMS.Web.Api/Controllers/TestController.cs index 7be5691d..0cdcefb5 100644 --- a/src/WMS.Web.Api/Controllers/TestController.cs +++ b/src/WMS.Web.Api/Controllers/TestController.cs @@ -416,5 +416,13 @@ namespace WMS.Web.Api.Controllers Console.WriteLine("redis1:" + tt2); return Result.ReSuccess(tt2); } + + [HttpGet] + [Route("lst3")] + public async Task lst3() + { + var data=await _erpService.BillQueryForPurchaseInStockBy("1541693"); + return true; + } } } diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index 3e653133..d9a8b0d4 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -1076,6 +1076,41 @@ 批号 + + + 入库订单ID + + + + + 状态 + + + + + 入库单订单号 + + + + + 采购订单号 + + + + + 入库单明细Id + + + + + 采购订单明细Id + + + + + 入库数量 + + 下推 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 511d4777..8e65e3d2 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -3917,6 +3917,13 @@ + + + + + + + erp:单据查询-采购入库单 @@ -5156,6 +5163,17 @@ + + + 金蝶已有的入库单进行不同处理:保存、提交、审核 + + + + + + + + 任务单的箱收货记录服务 @@ -6421,6 +6439,36 @@ 出库单 + + + erp订单状态 + + + + + 创建 + + + + + 审核中 + + + + + 已审核 + + + + + 重新审核 + + + + + 暂存 + + 业务对象表单Id:对应erp的单据表的名称 diff --git a/src/WMS.Web.Core/Dto/Erp/ErpPurchaseInStockSaveDto.cs b/src/WMS.Web.Core/Dto/Erp/ErpPurchaseInStockSaveDto.cs index b0c30582..d66efa48 100644 --- a/src/WMS.Web.Core/Dto/Erp/ErpPurchaseInStockSaveDto.cs +++ b/src/WMS.Web.Core/Dto/Erp/ErpPurchaseInStockSaveDto.cs @@ -68,4 +68,40 @@ namespace WMS.Web.Core.Dto.Erp [JsonProperty("FNumber")] public string Number { get; set; } } + + public class ErpPurchaseInStockDetailsDto + { + /// + /// 入库订单ID + /// + public string OrderId { get; set; } + + /// + /// 状态 + /// + public string DocumentStatus { get; set; } + + /// + /// 入库单订单号 + /// + public string OrderBillNo { get; set; } + + /// + /// 采购订单号 + /// + public string PurchaseBillNo { get; set; } + + /// + /// 入库单明细Id + /// + public string DetailId { get; set; } + /// + /// 采购订单明细Id + /// + public string PurchaseDetailId { get; set; } + /// + /// 入库数量 + /// + public decimal Qty { get; set; } + } } diff --git a/src/WMS.Web.Domain/IService/Public/IErpService.cs b/src/WMS.Web.Domain/IService/Public/IErpService.cs index 03862446..523c3013 100644 --- a/src/WMS.Web.Domain/IService/Public/IErpService.cs +++ b/src/WMS.Web.Domain/IService/Public/IErpService.cs @@ -27,6 +27,13 @@ namespace WMS.Web.Domain.IService.Public /// Task> BillQueryForPurchaseInStock(string id); + /// + /// + /// + /// + /// + Task>> BillQueryForPurchaseInStockBy(string purchaseDetailId); + /// /// erp:单据查询-采购入库单 /// diff --git a/src/WMS.Web.Domain/Services/InStockService.cs b/src/WMS.Web.Domain/Services/InStockService.cs index 5197a88d..11e5b5cc 100644 --- a/src/WMS.Web.Domain/Services/InStockService.cs +++ b/src/WMS.Web.Domain/Services/InStockService.cs @@ -124,7 +124,7 @@ namespace WMS.Web.Domain.Services // 构建 Redis 锁的值,用于标识锁的持有者 string lockValue = Guid.NewGuid().ToString(); // 获取 Redis 锁,设置超时时间为 10 秒 - if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10))) + if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10))) { try { @@ -203,7 +203,7 @@ namespace WMS.Web.Domain.Services await _redisDb.LockReleaseAsync(lockKey, lockValue); } } - else + else { return Result.ReFailure(ResultCodes.Concurrent_Instock); } @@ -856,30 +856,50 @@ namespace WMS.Web.Domain.Services if (erpDetails.Count != 0) { - foreach (var s in erpDetails) + foreach (var det in erpDetails) { var erp_details = entity.ErpDetails - .Where(w => w.SourceBillNo.Equals(s)).Select(s => s.ErpDetailId).ToList(); + .Where(w => w.SourceBillNo.Equals(det)).Select(t => t.ErpDetailId).ToList(); var erpDto = new ErpPushDto() { RuleId = "PUR_PurchaseOrder-STK_InStock",//转换规则内码 采购订单下推采购入库单 FormId = FormIdParam.PUR_PurchaseOrder.ToString(), TargetFormId = FormIdParam.STK_InStock.ToString(), - DetailsId = s.ErpDetailId.ToString(), + DetailsId = det.ErpDetailId.ToString(), IsDraftWhenSaveFail = true//是否需要暂存 }; - //下推金蝶 - var res = await this.Push(erpDto, s, entity.BillNo, sc_erpService, sc_inStockRepositories); - if (res.result.IsSuccess) - entity.SyncSuccess(s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo); + + List details = new List(); + var resPurchaseInStockDetails_result = await sc_erpService.BillQueryForPurchaseInStockBy(det.ErpDetailId.ToString()); + if (resPurchaseInStockDetails_result.IsSuccess) + details = resPurchaseInStockDetails_result.Data; + + //金蝶已有的单;进行金蝶不同操作处理:保存,提交,审核 + var currentDet = details.Where(x => x.Qty == det.Qty).FirstOrDefault(); + if (currentDet != null) + { + var res= await this.QueryFirst(currentDet, erpDto.FormId, 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); + } else - entity.SyncFail(res.result.Message, s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus); + { + //下推金蝶 + 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); + } + } } else { erpDetails_tags.ForEach(x => { x.SuccessSync = SyncStatus.Fail; }); - entity.SyncFailAll("同步金蝶失败,金蝶存在已审核的采购入库单", loginInfo?.UserInfo?.StaffId ?? 0); + entity.SyncFailAll("同步金蝶失败,该采购单已存在采购入库单", loginInfo?.UserInfo?.StaffId ?? 0); } //最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱 var isSuccess = await sc_InStockRepositories.Update(entity, true); @@ -975,6 +995,102 @@ namespace WMS.Web.Domain.Services } + /// + /// 金蝶已有的入库单进行不同处理:保存、提交、审核 + /// + /// + /// + /// + /// + /// + /// + private async Task<(Result result, SyncStatus syncStatus, string erpBillNo)> QueryFirst(ErpPurchaseInStockDetailsDto currentDet, string formId, string billNo, InStockErpDetails erpDetail, IErpService sc_erpService) + { + try + { + var purchaseInstock = new ErpPurchaseInStockSaveDto(currentDet.OrderId); + var det = new ErpPurchaseInStockDetailsSaveDto(); + det.DetailId = currentDet.DetailId; + det.Qty = currentDet.Qty; + purchaseInstock.Details.Add(det); + ErpOperateDto o_dto = new ErpOperateDto(formId, currentDet.OrderBillNo);//res_s.Data + if (currentDet.DocumentStatus == ErpOrderStatus.Z.ToString()) + { + //保存 + _logger.LogInformation($"入库单->查询到已有暂存的入库单 开始保存 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 数据: {JsonConvert.SerializeObject(purchaseInstock)}"); + var res_s = await sc_erpService.Save(purchaseInstock, formId); + if (!res_s.IsSuccess) + { + _logger.LogInformation($"入库单->保存失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res_s.Message}"); + return (Result.ReFailure(res_s.Message, res_s.Status), SyncStatus.SubmitFail, currentDet.OrderId); + } + + //提交 + _logger.LogInformation($"入库单->保存成功 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + var resSubmit = await sc_erpService.Submit(o_dto, formId); + if (!resSubmit.IsSuccess) + { + _logger.LogInformation($"入库单->提交失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); + return (resSubmit, SyncStatus.SubmitFail, o_dto.Numbers.First()); + } + + //审核 + _logger.LogInformation($"入库单->提交成功 开始审核 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + resSubmit = await sc_erpService.Audit(o_dto, formId); + if (!resSubmit.IsSuccess) + { + _logger.LogInformation($"入库单->审核失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); + return (resSubmit, SyncStatus.CheckFail, o_dto.Numbers.First()); + } + } + else if (currentDet.DocumentStatus == ErpOrderStatus.A.ToString()) + { + //提交 + _logger.LogInformation($"入库单->查询到已有保存的入库单 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + var resSubmit = await sc_erpService.Submit(o_dto, formId); + if (!resSubmit.IsSuccess) + { + _logger.LogInformation($"入库单->提交失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); + return (resSubmit, SyncStatus.SubmitFail, o_dto.Numbers.First()); + } + + //审核 + _logger.LogInformation($"入库单->提交成功 开始审核 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + resSubmit = await sc_erpService.Audit(o_dto, formId); + if (!resSubmit.IsSuccess) + { + _logger.LogInformation($"入库单->审核失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); + return (resSubmit, SyncStatus.CheckFail, o_dto.Numbers.First()); + } + } + else if (currentDet.DocumentStatus == ErpOrderStatus.B.ToString()) + { + //审核 + _logger.LogInformation($"入库单->查询到已有提交的入库单 开始审核 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + var resSubmit = await sc_erpService.Audit(o_dto, formId); + if (!resSubmit.IsSuccess) + { + _logger.LogInformation($"入库单->审核失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); + return (resSubmit, SyncStatus.CheckFail, o_dto.Numbers.First()); + } + } + else if (currentDet.DocumentStatus == ErpOrderStatus.C.ToString()) + { + _logger.LogInformation($"入库单->存在已审核的ERP入库单 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:存在已审核的ERP入库单"); + return (Result.ReFailure("存在已审核的ERP入库单", 2001), SyncStatus.CheckFail, o_dto.Numbers.First()); + } + _logger.LogInformation($"入库单->同步金蝶成功->单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); + return (Result.ReSuccess(), SyncStatus.Success, o_dto.Numbers.First()); + } + catch (Exception ex) + { + + _logger.LogInformation($"入库单-同步:错误:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{ex.Message}"); + var result = Result.ReFailure(ex.Message, 50001); + return (result, SyncStatus.Fail, ""); + } + + } } } diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 89a4d1ec..ca1f489d 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -2510,6 +2510,52 @@ namespace WMS.Web.Domain.Services.Public } } + public async Task>> BillQueryForPurchaseInStockBy(string purchaseDetailId) + { + 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.STK_InStock.ToString()); + param.FieldKeys = "FID,FInStockEntry_FEntryID,FRealQty,FPOOrderNo,FBillNo,FDocumentStatus"; + param.Limit = 10000; + param.FilterString = $"FPOORDERENTRYID={purchaseDetailId}"; + + 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 materialNumber, string orgCode, string stockCode, int subStockId)> request) { try diff --git a/src/WMS.Web.Domain/Values/ErpOrderStatus.cs b/src/WMS.Web.Domain/Values/ErpOrderStatus.cs new file mode 100644 index 00000000..11ba0344 --- /dev/null +++ b/src/WMS.Web.Domain/Values/ErpOrderStatus.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Domain.Values +{ + /// + /// erp订单状态 + /// + public enum ErpOrderStatus + { + /// + /// 创建 + /// + A, + /// + /// 审核中 + /// + B, + /// + /// 已审核 + /// + C, + /// + /// 重新审核 + /// + D, + /// + /// 暂存 + /// + Z + } +} diff --git a/src/WMS.Web.Repositories/InStockTaskRepositories.cs b/src/WMS.Web.Repositories/InStockTaskRepositories.cs index fa5b888d..e8a0656d 100644 --- a/src/WMS.Web.Repositories/InStockTaskRepositories.cs +++ b/src/WMS.Web.Repositories/InStockTaskRepositories.cs @@ -139,21 +139,21 @@ namespace WMS.Web.Repositories //1.获取物料集合和组织集合和供应商的集合 var materials = new List(); - var materials_result = await _erpService.BillQueryForMaterial(); - if (materials_result.IsSuccess) - materials = materials_result.Data.ToList(); + //var materials_result = await _erpService.BillQueryForMaterial(); + //if (materials_result.IsSuccess) + // materials = materials_result.Data.ToList(); //组织集合 var orgs = new List(); - var orgs_result = await _erpService.BillQueryForOrg(); - if (orgs_result.IsSuccess) - orgs = orgs_result.Data.ToList(); + //var orgs_result = await _erpService.BillQueryForOrg(); + //if (orgs_result.IsSuccess) + // orgs = orgs_result.Data.ToList(); //供应商集合 var suppliers = new List(); - var suppliers_result = await _erpService.BillQueryForSupplier(); - if (suppliers_result.IsSuccess) - suppliers = suppliers_result.Data.ToList(); + //var suppliers_result = await _erpService.BillQueryForSupplier(); + //if (suppliers_result.IsSuccess) + // suppliers = suppliers_result.Data.ToList(); var entity = await _context.InStockTask.Include(x => x.Details).Where(x => x.Id == id).FirstOrDefaultAsync(); @@ -238,7 +238,7 @@ namespace WMS.Web.Repositories if (current_box != null) { var current_boxDet = current_box.Details.Where(d => d.MaterialNumber == x.MaterialNumber).FirstOrDefault(); - if (x.MethodForInt == (int)InventoryInOutMethod.Product && current_boxDet.Qty != 0) + if (current_boxDet!=null && x.MethodForInt == (int)InventoryInOutMethod.Product && current_boxDet.Qty != 0) x.Qty = current_boxDet.Qty; } });