|
|
|
|
@@ -79,7 +79,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Task<Result> Sync(OperateRequest dto, LoginInDto loginInfo, bool isRepeatSync = true)
|
|
|
|
|
{
|
|
|
|
|
var list = _inStockRepositories.GetList(dto.Ids).GetAwaiter().GetResult();
|
|
|
|
|
var list = _inStockRepositories.GetList(dto.Ids).GetAwaiter().GetResult();
|
|
|
|
|
var isSuccess = true;
|
|
|
|
|
if (isRepeatSync)
|
|
|
|
|
{
|
|
|
|
|
@@ -88,7 +88,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
isSuccess = _inStockRepositories.UpdateRange(list, true).GetAwaiter().GetResult();
|
|
|
|
|
}
|
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
foreach (var entity in list)
|
|
|
|
|
{
|
|
|
|
|
var res = await this.PurchaseInStock(entity, loginInfo);
|
|
|
|
|
@@ -149,7 +149,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
{
|
|
|
|
|
OperateRequest oRequest = new OperateRequest();
|
|
|
|
|
oRequest.Ids.Add(entity.Id);
|
|
|
|
|
await Sync(oRequest, loginInfo,false);
|
|
|
|
|
await Sync(oRequest, loginInfo, false);
|
|
|
|
|
}
|
|
|
|
|
return Result.ReSuccess();
|
|
|
|
|
}
|
|
|
|
|
@@ -162,7 +162,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<Result> ShelfNoPurchase(NoPurchaseShelfRequest dto, LoginInDto loginInDto)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId+loginInDto.UserInfo.Nickname}");
|
|
|
|
|
_logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId + loginInDto.UserInfo.Nickname}");
|
|
|
|
|
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
|
|
|
|
|
bool isRollback = false;
|
|
|
|
|
bool isTransaction = false;
|
|
|
|
|
@@ -236,7 +236,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
box_task_detail.ErpDetailId = item.ErpDetailId;
|
|
|
|
|
box_task_detail.BoxMaterialQty = item.ReceiveQty;
|
|
|
|
|
box_task_detail.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, item.MaterialNumber);
|
|
|
|
|
box_task_detail.MaterialNumber = item.MaterialNumber;
|
|
|
|
|
box_task_detail.MaterialNumber = item.MaterialNumber;
|
|
|
|
|
box_task_detail.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, item.MaterialNumber);
|
|
|
|
|
result.Details.Add(box_task_detail);
|
|
|
|
|
}
|
|
|
|
|
@@ -271,8 +271,8 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
//1.获取来源单
|
|
|
|
|
var taskIds = dto.Details.GroupBy(x => x.TaskId).Select(x => x.Key).ToList();
|
|
|
|
|
var tasks = await _inStockTaskRepositories.GetList(taskIds);
|
|
|
|
|
|
|
|
|
|
if (tasks == null || tasks.Count==0)
|
|
|
|
|
|
|
|
|
|
if (tasks == null || tasks.Count == 0)
|
|
|
|
|
return Result<InStock>.ReFailure(ResultCodes.SourceBillNoDateError);
|
|
|
|
|
|
|
|
|
|
// 组织集合
|
|
|
|
|
@@ -361,12 +361,12 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
//保存成功后:序列号跟踪流程添加
|
|
|
|
|
var serialNumber_result = await _serialNumberService.InStock(entity, loginInfo, isTransaction);
|
|
|
|
|
if (!serialNumber_result.IsSuccess)
|
|
|
|
|
return Result<InStock >.ReFailure(serialNumber_result);
|
|
|
|
|
return Result<InStock>.ReFailure(serialNumber_result);
|
|
|
|
|
|
|
|
|
|
//箱库存变动
|
|
|
|
|
var boxInventoryResult = await _boxInventoryService.GenerateInStockBox(entity, isTransaction);
|
|
|
|
|
if (!boxInventoryResult.IsSuccess)
|
|
|
|
|
return Result<InStock>.ReFailure(boxInventoryResult);
|
|
|
|
|
return Result<InStock>.ReFailure(boxInventoryResult);
|
|
|
|
|
|
|
|
|
|
return Result<InStock>.ReSuccess(entity);
|
|
|
|
|
|
|
|
|
|
@@ -384,7 +384,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
_logger.LogInformation($"非采购上架-保存:{JsonConvert.SerializeObject(dto)} 操作人:{loginInfo.UserInfo.StaffId}");
|
|
|
|
|
|
|
|
|
|
//非采购入库的时候:不能扫同样的箱,按箱入库时候
|
|
|
|
|
if (dto.Boxs != null && dto.Boxs.Count != 0 && dto.ShelfMethod==(int)ShelfMethod.Box)
|
|
|
|
|
if (dto.Boxs != null && dto.Boxs.Count != 0 && dto.ShelfMethod == (int)ShelfMethod.Box)
|
|
|
|
|
{
|
|
|
|
|
if (dto.Boxs.Select(x => x.BoxId).Distinct().Count() != dto.Boxs.Select(x => x.BoxId).Count())
|
|
|
|
|
return Result<InStock>.ReFailure(ResultCodes.BoxOutStockTaskBoxError);
|
|
|
|
|
@@ -402,7 +402,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
|
|
|
|
|
//1.1.2判断上架数量不能超过应入库数量
|
|
|
|
|
var dtoDetails = dto.Boxs.SelectMany(x => x.Details).ToList();
|
|
|
|
|
var dtoTotalDetails = dtoDetails.GroupBy(x => new { x.ErpDetailId,x.MaterialNumber }).Select(x => new { ErpDetailId = x.Key.ErpDetailId, MaterialNumber = x.Key.MaterialNumber, Qty = x.Sum(t => t.Qty) }).ToList();
|
|
|
|
|
var dtoTotalDetails = dtoDetails.GroupBy(x => new { x.ErpDetailId, x.MaterialNumber }).Select(x => new { ErpDetailId = x.Key.ErpDetailId, MaterialNumber = x.Key.MaterialNumber, Qty = x.Sum(t => t.Qty) }).ToList();
|
|
|
|
|
foreach (var item in task.Details)
|
|
|
|
|
{
|
|
|
|
|
var current_det = dtoTotalDetails.Where(x => x.ErpDetailId == item.ErpDetailId && x.MaterialNumber == item.MaterialNumber).FirstOrDefault();
|
|
|
|
|
@@ -617,7 +617,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//1.1筛选出对应仓库的明细
|
|
|
|
|
var task_details = task.Details.Where(x => x.StockCode == dto.StockCode && x.AccruedQty>0).ToList();
|
|
|
|
|
var task_details = task.Details.Where(x => x.StockCode == dto.StockCode && x.AccruedQty > 0).ToList();
|
|
|
|
|
|
|
|
|
|
//2.找到箱对应的物料信息:多个箱
|
|
|
|
|
var boxs = await _boxRepositories.GetEntityListByNos(dto.BoxBillNos);
|
|
|
|
|
@@ -627,7 +627,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
//3.判断箱里面对应的物料是否存在;不存在就报错
|
|
|
|
|
foreach (var item in boxs)
|
|
|
|
|
{
|
|
|
|
|
if(item.Details==null || item.Details.Count==0)
|
|
|
|
|
if (item.Details == null || item.Details.Count == 0)
|
|
|
|
|
return Result<ContrastMaterialsResponse>.ReFailure(ResultCodes.BoxMateriaNoData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -692,7 +692,7 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
/// <param name="entity"></param>
|
|
|
|
|
/// <param name="loginInfo"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private async Task<Result> PurchaseInStock(InStock entity, LoginInDto loginInfo)
|
|
|
|
|
private async Task<Result> PurchaseInStock(InStock entity, LoginInDto loginInfo)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"采购下推-同步:{JsonConvert.SerializeObject(entity)} 操作人:{loginInfo.UserInfo.StaffId}");
|
|
|
|
|
var scope = _serviceScopeFactory.CreateScope();
|
|
|
|
|
@@ -707,50 +707,40 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
var sc_erpService = scope.ServiceProvider.GetRequiredService<IErpService>();
|
|
|
|
|
|
|
|
|
|
//找到金蝶最新的采购订单数据
|
|
|
|
|
var erp_purchase_result =await sc_erpService.BillQueryForPurchaseInStock(entity.ErpDetails.GroupBy(x=>x.SourceBillNo).Select(x=>x.Key).ToList());
|
|
|
|
|
var erp_purchase_result = await sc_erpService.BillQueryForPurchaseInStock(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();
|
|
|
|
|
var isHave = erp_purchase_result.Data.Where(x => x.ErpDetailId == item.ErpDetailId && x.MaterialNumber == item.MaterialNumber).Any();
|
|
|
|
|
if (isHave)
|
|
|
|
|
erpDetails.Add(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
foreach (var s in erpDetails)
|
|
|
|
|
{
|
|
|
|
|
foreach (var s in erpDetails)
|
|
|
|
|
var erp_details = entity.ErpDetails
|
|
|
|
|
.Where(w => w.SourceBillNo.Equals(s)).Select(s => s.ErpDetailId).ToList();
|
|
|
|
|
var erpDto = new ErpPushDto()
|
|
|
|
|
{
|
|
|
|
|
var erp_details = entity.ErpDetails
|
|
|
|
|
.Where(w => w.SourceBillNo.Equals(s)).Select(s => s.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(),
|
|
|
|
|
IsDraftWhenSaveFail = true
|
|
|
|
|
};
|
|
|
|
|
//下推金蝶
|
|
|
|
|
var res = await this.Push(erpDto, s, entity.BillNo, sc_erpService);
|
|
|
|
|
if (res.result.IsSuccess)
|
|
|
|
|
entity.SyncSuccess(s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo);
|
|
|
|
|
else
|
|
|
|
|
entity.SyncFail(res.result.Message, s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus);
|
|
|
|
|
}
|
|
|
|
|
//最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱
|
|
|
|
|
var isSuccess = await sc_InStockRepositories.Update(entity, true);
|
|
|
|
|
if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError);
|
|
|
|
|
return Result.ReSuccess();
|
|
|
|
|
RuleId = "PUR_PurchaseOrder-STK_InStock",//转换规则内码 采购订单下推采购入库单
|
|
|
|
|
FormId = FormIdParam.PUR_PurchaseOrder.ToString(),
|
|
|
|
|
TargetFormId = FormIdParam.STK_InStock.ToString(),
|
|
|
|
|
DetailsId = s.ErpDetailId.ToString(),
|
|
|
|
|
IsDraftWhenSaveFail = true
|
|
|
|
|
};
|
|
|
|
|
//下推金蝶
|
|
|
|
|
var res = await this.Push(erpDto, s, entity.BillNo, sc_erpService);
|
|
|
|
|
if (res.result.IsSuccess)
|
|
|
|
|
entity.SyncSuccess(s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo);
|
|
|
|
|
else
|
|
|
|
|
entity.SyncFail(res.result.Message, s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"采购下推-同步:错误:{JsonConvert.SerializeObject(entity)} 操作人:{loginInfo.UserInfo.StaffId}");
|
|
|
|
|
return Result.ReFailure(ResultCodes.ErpSynsError);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱
|
|
|
|
|
var isSuccess = await sc_InStockRepositories.Update(entity, true);
|
|
|
|
|
if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError);
|
|
|
|
|
return Result.ReSuccess();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@@ -761,46 +751,55 @@ namespace WMS.Web.Domain.Services
|
|
|
|
|
/// <param name="billNo"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private async Task<(Result result, SyncStatus syncStatus, string erpBillNo)> Push(ErpPushDto dto, InStockErpDetails erpDetail, string billNo, IErpService sc_erpService)
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
//下推动作
|
|
|
|
|
var res = await sc_erpService.Push(dto);
|
|
|
|
|
if (!res.IsSuccess)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"入库单->下推失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res.Message}");
|
|
|
|
|
return (Result.ReFailure(res.Message, res.Status), SyncStatus.Fail, "");
|
|
|
|
|
}
|
|
|
|
|
string id = res.Data;
|
|
|
|
|
var resPurchaseInStock = await sc_erpService.BillQueryForPurchaseInStock(id);
|
|
|
|
|
var purchaseInStock = resPurchaseInStock.Data;
|
|
|
|
|
purchaseInStock.Details[0].Qty = erpDetail.Qty;
|
|
|
|
|
string formId = dto.TargetFormId.ToString();
|
|
|
|
|
_logger.LogInformation($"入库单->开始同步金蝶 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 数据: {JsonConvert.SerializeObject(dto)}");
|
|
|
|
|
var res_s = await sc_erpService.Save<ErpPurchaseInStockSaveDto>(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, id);
|
|
|
|
|
}
|
|
|
|
|
//提交
|
|
|
|
|
_logger.LogInformation($"入库单->保存成功 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}");
|
|
|
|
|
ErpOperateDto o_dto = new ErpOperateDto(formId, res_s.Data);//res_s.Data
|
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
_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, "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//下推动作
|
|
|
|
|
var res = await sc_erpService.Push(dto);
|
|
|
|
|
if (!res.IsSuccess)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"入库单->下推失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res.Message}");
|
|
|
|
|
return (Result.ReFailure(res.Message, res.Status), SyncStatus.Fail, "");
|
|
|
|
|
}
|
|
|
|
|
string id = res.Data;
|
|
|
|
|
var resPurchaseInStock = await sc_erpService.BillQueryForPurchaseInStock(id);
|
|
|
|
|
var purchaseInStock = resPurchaseInStock.Data;
|
|
|
|
|
purchaseInStock.Details[0].Qty = erpDetail.Qty;
|
|
|
|
|
string formId = dto.TargetFormId.ToString();
|
|
|
|
|
_logger.LogInformation($"入库单->开始同步金蝶 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 数据: {JsonConvert.SerializeObject(dto)}");
|
|
|
|
|
var res_s = await sc_erpService.Save<ErpPurchaseInStockSaveDto>(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, id);
|
|
|
|
|
}
|
|
|
|
|
//提交
|
|
|
|
|
_logger.LogInformation($"入库单->保存成功 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}");
|
|
|
|
|
ErpOperateDto o_dto = new ErpOperateDto(formId, res_s.Data);//res_s.Data
|
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
_logger.LogInformation($"入库单->同步金蝶成功->单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}");
|
|
|
|
|
return (Result.ReSuccess(), SyncStatus.Success, o_dto.Numbers.First());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|