This commit is contained in:
2025-07-04 15:54:48 +08:00
parent 0189deea95
commit a1489cf8ce
6 changed files with 196 additions and 7 deletions

View File

@@ -5692,6 +5692,14 @@
<param name="loginInfo"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.InStockService.ProduceInStock(WMS.Web.Domain.Entitys.InStock,WMS.Web.Core.Dto.Login.LoginInDto)">
<summary>
生产入库:同步金蝶
</summary>
<param name="entity"></param>
<param name="loginInfo"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.InStockService.Push(WMS.Web.Core.Dto.Erp.ErpPushDto,WMS.Web.Domain.Entitys.InStockErpDetails,System.String,WMS.Web.Domain.IService.Public.IErpService,WMS.Web.Domain.Infrastructure.IInStockRepositories)">
<summary>
下推
@@ -7378,7 +7386,7 @@
</member>
<member name="F:WMS.Web.Domain.Values.Erp.FormIdParam.PRD_MORPT">
<summary>
生产入库单(来源于生产汇报单
生产汇报单
</summary>
</member>
<member name="F:WMS.Web.Domain.Values.Erp.FormIdParam.PRD_PickMtrl">
@@ -7386,6 +7394,11 @@
领料出库单(来源于普通领料出库单)
</summary>
</member>
<member name="F:WMS.Web.Domain.Values.Erp.FormIdParam.PRD_INSTOCK">
<summary>
生产入库单(汇报)
</summary>
</member>
<member name="T:WMS.Web.Domain.Values.ExportStatus">
<summary>
文件导出状态

View File

@@ -34,6 +34,9 @@ namespace WMS.Web.Domain.IService.Public
/// <returns></returns>
Task<Result<List<ErpPurchaseInStockDetailsDto>>> BillQueryForPurchaseInStockBy(string purchaseDetailId, List<string> sourceBillNos);
Task<Result<List<ErpPurchaseInStockDetailsDto>>> BillQueryForProduceInStockBy(string purchaseDetailId, List<string> sourceBillNos);
/// <summary>
/// erp:单据查询-采购入库单
/// </summary>

View File

@@ -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<ContrastMaterialsResponse>.ReSuccess(response);
}
/// <summary>
/// 采购:同步金蝶
/// </summary>
@@ -975,6 +988,96 @@ namespace WMS.Web.Domain.Services
return Result.ReSuccess();
}
/// <summary>
/// 生产入库:同步金蝶
/// </summary>
/// <param name="entity"></param>
/// <param name="loginInfo"></param>
/// <returns></returns>
private async Task<Result> ProduceInStock(InStock entity, LoginInDto loginInfo)
{
_logger.LogInformation($"生产入库下推-同步:{JsonConvert.SerializeObject(entity)} 操作人:{loginInfo.UserInfo.StaffId}");
var scope = _serviceScopeFactory.CreateScope();
var sc_InStockRepositories = scope.ServiceProvider.GetRequiredService<IInStockRepositories>();
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<InStockErpDetails>();
var sc_erpService = scope.ServiceProvider.GetRequiredService<IErpService>();
var sc_inStockRepositories = scope.ServiceProvider.GetRequiredService<IInStockRepositories>();
//找到金蝶最新的生产汇报单
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<ErpPurchaseInStockDetailsDto> details = new List<ErpPurchaseInStockDetailsDto>();
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();
}
/// <summary>
/// 下推
/// </summary>

View File

@@ -2971,6 +2971,72 @@ namespace WMS.Web.Domain.Services.Public
}
}
public async Task<Result<List<ErpPurchaseInStockDetailsDto>>> BillQueryForProduceInStockBy(string purchaseDetailId, List<string> sourceBillNos)
{
try
{
//1.先登录金蝶-拿到token
var token_result = await this.Init();
if (!token_result.IsSuccess)
return Result<List<ErpPurchaseInStockDetailsDto>>.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<List<List<string>>>(result_json);
//5.返回数据的组装
var erp_list = new List<ErpPurchaseInStockDetailsDto>();
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<List<ErpPurchaseInStockDetailsDto>>.ReSuccess(erp_list);
}
catch (Exception ex)
{
return Result<List<ErpPurchaseInStockDetailsDto>>.ReFailure(ResultCodes.Erp_BillQuery_Error);
}
}
public async Task<ResultList<ErpInventoryDto>> BillQueryForInventory(List<(string orgCode, string stockCode)> request)
{
try

View File

@@ -82,7 +82,7 @@ namespace WMS.Web.Domain.Values.Erp
/// </summary>
STK_Inventory = 18,
/// <summary>
/// 生产入库单(来源于生产汇报单
/// 生产汇报单
/// </summary>
PRD_MORPT = 19,
@@ -90,6 +90,10 @@ namespace WMS.Web.Domain.Values.Erp
/// 领料出库单(来源于普通领料出库单)
/// </summary>
PRD_PickMtrl = 20,
/// <summary>
/// 生产入库单(汇报)
/// </summary>
PRD_INSTOCK=21,
}

View File

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