This commit is contained in:
tongfei
2024-03-22 16:54:27 +08:00
parent 17378dafb5
commit ae135dff4e
4 changed files with 90 additions and 91 deletions

View File

@@ -179,11 +179,11 @@ namespace WMS.Web.Domain.Entitys
/// <param name="syncStatus"></param> /// <param name="syncStatus"></param>
public void SyncFail(string remark, int erpDetailId, int operateId, SyncStatus syncStatus) public void SyncFail(string remark, int erpDetailId, int operateId, SyncStatus syncStatus)
{ {
var erpd = this.ErpDetails.Where(w=>w.ErpDetailId==erpDetailId).ToList(); var erpd = this.ErpDetails.Where(w => w.ErpDetailId == erpDetailId).ToList();
erpd.ForEach(det => erpd.ForEach(det =>
{ {
det.SuccessSync = syncStatus; det.SuccessSync = syncStatus;
}); });
this.SuccessSync = SyncStatus.Fail; this.SuccessSync = SyncStatus.Fail;
this.Remark = remark; this.Remark = remark;
this.OperateId = operateId; this.OperateId = operateId;

View File

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

View File

@@ -173,8 +173,8 @@ namespace WMS.Web.Domain.Services.Public
loginInfo.TokenInfo = token; loginInfo.TokenInfo = token;
//var ops_login_time = token.Expired.AddDays(1) - DateTime.Now;//用于正式 //var ops_login_time = token.Expired.AddDays(1) - DateTime.Now;//用于正式
var ops_login_time = token.Expired - DateTime.Now;//用于正式
_redisClientService.SetStringKey<LoginInDto>($"wms_login_{token.Token}", loginInfo, token.Expired.TimeOfDay); _redisClientService.SetStringKey<LoginInDto>($"wms_login_{token.Token}", loginInfo, ops_login_time);
_logger.LogInformation($"登录信息:用户人员信息->{staffName}{r.UserInfo.StaffId}),公司名称->{r.UserInfo.CompanyName}"+",过期时间:"+token.Expired.ToString("yyyy-MM-dd HH:mm:ss")); _logger.LogInformation($"登录信息:用户人员信息->{staffName}{r.UserInfo.StaffId}),公司名称->{r.UserInfo.CompanyName}"+",过期时间:"+token.Expired.ToString("yyyy-MM-dd HH:mm:ss"));

View File

@@ -34,6 +34,6 @@ namespace WMS.Web.Domain.Values
/// 同步中 /// 同步中
/// </summary> /// </summary>
[EnumRemark("同步中")] [EnumRemark("同步中")]
SyncIng = 4 SyncIng = 4,
} }
} }