Exemplo n.º 1
0
        public async Task <RouteData> StockOutReport(long stockOutId, [FromBody] OutsideStockOutReportDto result)
        {
            try
            {
                _logger.LogInformation($"[出库任务状态变化通知]收到通知,StockOutId={stockOutId},data={JsonConvert.SerializeObject(result)}");
                result.StockOutId = stockOutId;
                Wms_stockout stockOut = await _client.Queryable <Wms_stockout>()
                                        .FirstAsync(x => x.StockOutId == result.StockOutId);

                if (stockOut == null)
                {
                    _logger.LogError($"[出库任务状态变化通知]E2113-没有找到出库单,StockOutId={stockOutId}");
                    return(YL.Core.Dto.RouteData.From(PubMessages.E2113_STOCKOUT_NOTFOUND));
                }
                if (stockOut.StockOutStatus == StockOutStatus.task_finish.ToInt32())
                {
                    _logger.LogError($"[出库任务状态变化通知]E2114-出库单状态已标记为完成,本次操作中断,StockOutId={stockOutId}, StockOutNo={stockOut.StockOutNo}");
                    //return YL.Core.Dto.RouteData.From(PubMessages.E2114_STOCKOUT_ALLOW_FINISHED);
                    return(new RouteData());
                }
                Wms_mestask mesTask = await _client.Queryable <Wms_mestask>()
                                      .FirstAsync(x => x.MesTaskId == stockOut.MesTaskId);

                if (mesTask == null)
                {
                    _logger.LogError($"[出库任务状态变化通知]E3000-没有找到相应的Mes任务,StockOutId={stockOutId}, StockOutNo={stockOut.StockOutNo}, MesTaskId={stockOut.MesTaskId}");
                    return(YL.Core.Dto.RouteData.From(PubMessages.E3000_MES_STOCKINTASK_NOTFOUND));
                }


                Wms_stockoutdetail[] details = _client.Queryable <Wms_stockoutdetail>()
                                               .Where(x => x.StockOutId == result.StockOutId).ToArray();

                _client.BeginTran();
                foreach (OutsideStockOutReportDetail detail in result.Details)
                {
                    Wms_stockoutdetail localDetail = details.FirstOrDefault(
                        x => x.UniqueIndex == detail.UniqueIndex);
                    if (localDetail == null)
                    {
                        _client.RollbackTran();
                        _logger.LogError($"[出库任务状态变化通知]E2115-没有找到相应的物料,StockOutId={stockOutId}, StockOutNo={stockOut.StockOutNo} ,UniqueOutdex ={ detail.UniqueIndex}");
                        return(YL.Core.Dto.RouteData.From(PubMessages.E2115_STOCKOUT_HASNOT_MATERIAL, $"MaterialId={detail.MaterialId}"));
                    }
                    localDetail.PlanOutQty   = detail.PlanOutQty;
                    localDetail.ActOutQty    = detail.ActOutQty;
                    localDetail.Status       = detail.Status.ToInt32();
                    localDetail.ModifiedBy   = PubConst.InterfaceUserId;
                    localDetail.ModifiedUser = detail.ModifiedBy;
                    localDetail.ModifiedDate = Convert.ToDateTime(detail.ModifiedDate);
                    localDetail.Remark       = detail.Remark;
                }

                if (_client.Updateable(details).ExecuteCommand() == 0)
                {
                    _client.RollbackTran();
                    _logger.LogError($"[出库任务状态变化通知]E0002-任务明细更新失败,StockOutId={stockOutId}, StockOutNo={stockOut.StockOutNo}");
                    return(YL.Core.Dto.RouteData.From(PubMessages.E0002_UPDATE_COUNT_FAIL));
                }

                stockOut.StockOutStatus = result.StockOutStatus.ToInt32();
                stockOut.ModifiedBy     = PubConst.InterfaceUserId;
                stockOut.ModifiedUser   = PubConst.InterfaceUserName;

                if (_client.Updateable(stockOut).ExecuteCommand() == 0)
                {
                    _client.RollbackTran();
                    _logger.LogError($"[出库任务状态变化通知]E0002-任务更新失败,StockOutId={stockOutId}, StockOutNo={stockOut.StockOutNo}");
                    return(YL.Core.Dto.RouteData.From(PubMessages.E0002_UPDATE_COUNT_FAIL));
                }

                bool anyWorking = await _client.Queryable <Wms_stockout>()
                                  .AnyAsync(x => x.MesTaskId == mesTask.MesTaskId &&
                                            x.StockOutStatus != (int)StockOutStatus.task_finish &&
                                            x.StockOutStatus != (int)StockOutStatus.task_canceled);

                if (!anyWorking)
                {
                    _logger.LogInformation($"[出库任务状态变化通知]所有相关任务已完成,尝试通知MES MesTaskId={stockOut.MesTaskId}");
                    await _client.NofityStockOut(mesTask);
                }
                else
                {
                    _logger.LogInformation($"[出库任务状态变化通知]尚有未完成任务,等待其余任务完成通知 MesTaskId={stockOut.MesTaskId}");
                }

                _logger.LogInformation($"[出库任务状态变化通知]通知处理正常完成,StockOutId={stockOutId}");
                _client.CommitTran();
                return(new RouteData());
            }
            catch (Exception ex)
            {
                _client.RollbackTran();
                _logger.LogError($"[出库任务状态变化通知]E-1-发生异常,处理结束 ex={ex.ToString()}");
                return(new RouteData()
                {
                    Code = -1, Message = ex.Message
                });
            }
        }