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();