helongyang
13 小时以前 06eb604f71605c47f015b88b1620b72b6f69df8c
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -139,29 +139,6 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// æ”¾è´§å®Œæˆ
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public WebResponseContent PutFinish(string code, string barCode = "", string taskNum = "")
        {
            try
            {
                string url = AppSettings.Get("WCS");
                if (string.IsNullOrEmpty(url))
                {
                    return WebResponseContent.Instance.Error($"未找到WCSAApi地址,请检查配置文件");
                }
                string response = HttpHelper.Post($"{url}/api/CTU_AGV/PutFinish?code={code}&barCode={barCode}&taskNum={taskNum}" );
                return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("返回错误");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent AGVTasks(SaveModel saveModel)
        {
@@ -213,6 +190,7 @@
                    PalletType = stockInfo.PalletType,
                    MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                    Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
                    BatchNo = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.BatchNo
                };
                _unitOfWorkManage.BeginTran();
                BaseDal.AddData(newTask);
@@ -265,6 +243,7 @@
                if (task.TaskType == TaskTypeEnum.MesPalletLargeReturn.ObjToInt() || task.TaskType == TaskTypeEnum.MesPalletSmallReturn.ObjToInt())
                {
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    FeedBackWCSTaskCompleted(taskNum);
                    _unitOfWorkManage.BeginTran();
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
@@ -293,6 +272,7 @@
                {
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    FeedBackWCSTaskCompleted(taskNum);
                    stockInfo.Details.ForEach(x =>
                    {
                        x.Status = StockStatusEmun.入库完成.ObjToInt();
@@ -1177,5 +1157,287 @@
            }
            return content;
        }
        public WebResponseContent InboundTaskHandCancel(int taskNum)
        {
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该任务信息");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseType == WarehouseTypEnum.成品.ToString())
                {
                    if(task.TaskType == TaskTypeEnum.EmptyProductBack.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                        FeedBackWCSTaskHandCancel(taskNum);
                        _unitOfWorkManage.BeginTran();
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK();
                    }
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
                    if (proStockInfo == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到胶框为{task.PalletCode}组盘信息");
                    }
                    Dt_LocationInfo prolocationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (prolocationInfo != null)
                    {
                        if (prolocationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                        {
                            return WebResponseContent.Instance.Error($"货位状态不正确");
                        }
                        prolocationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                    }
                    if(task.TaskType == TaskTypeEnum.InProduct.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        FeedBackWCSTaskHandCancel(taskNum);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                        _stockService.ProStockInfoService.Repository.DeleteAndMoveIntoHty(proStockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                        _stockService.ProStockInfoDetailService.Repository.DeleteAndMoveIntoHty(proStockInfo.proStockInfoDetails, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                        _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK();
                    }
                    else
                    {
                        proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                        proStockInfo.proStockInfoDetails.ForEach(x =>
                        {
                            x.ProOutDetailStatus = StockStatusEmun.出库完成.ObjToInt();
                        });
                        task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        FeedBackWCSTaskHandCancel(taskNum);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                        _stockService.ProStockInfoService.Repository.UpdateData(proStockInfo);
                        _stockService.ProStockInfoDetailService.Repository.UpdateData(proStockInfo.proStockInfoDetails);
                        _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        _unitOfWorkManage.CommitTran();
                        return WebResponseContent.Instance.OK();
                    }
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
                }
                if (!string.IsNullOrEmpty(stockInfo.LocationCode))
                {
                    return WebResponseContent.Instance.Error($"该托盘已绑定货位");
                }
                if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"未找到该托盘库存明细信息");
                }
                if (task.TaskType == TaskTypeEnum.MesPalletLargeReturn.ObjToInt() || task.TaskType == TaskTypeEnum.MesPalletSmallReturn.ObjToInt())
                {
                    task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    FeedBackWCSTaskHandCancel(taskNum);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                    _unitOfWorkManage.CommitTran();
                    return WebResponseContent.Instance.OK();
                }
                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                if (locationInfo != null)
                {
                    if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    {
                        return WebResponseContent.Instance.Error($"货位状态不正确");
                    }
                    locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                }
                Dt_InboundOrder? inboundOrder = _inboundRepository.InboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.InboundOrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
                Dt_InboundOrderDetail? inboundOrderDetail = null;
                Dt_ReturnOrder? returnOrder = null;
                //标准入库流程查找入库单据
                if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt()&&(task.WarehouseId == WarehouseEnum.HA152.ObjToInt()|| task.WarehouseId == WarehouseEnum.HA58.ObjToInt()))
                {
                    inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == stockInfo.Details.FirstOrDefault()?.InboundOrderRowNo);
                    foreach (var item in stockInfo.Details)
                    {
                        if (inboundOrderDetail == null)
                        {
                            continue;
                        }
                        inboundOrderDetail.ReceiptQuantity -= item.StockQuantity;
                    }
                    //判断是否为退料入库单
                    if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                    {
                        returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                        returnOrder.ReturnOrderStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
                        foreach (var item in inboundOrder.Details)
                        {
                            Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x => x.MCode == item.MaterielCode);
                            if (returnOrderDetail != null)
                            {
                                returnOrderDetail.ReturnQty -= item.ReceiptQuantity;
                            }
                        }
                    }
                }
                if(task.WarehouseId == WarehouseEnum.HA154.ObjToInt()|| task.WarehouseId == WarehouseEnum.HA152.ObjToInt() || task.WarehouseId == WarehouseEnum.HA58.ObjToInt())
                {
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.自动删除 : OperateTypeEnum.人工删除);
                }else
                {
                    stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt();
                }
                task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                FeedBackWCSTaskHandCancel(taskNum);
                _unitOfWorkManage.BeginTran();
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.人工删除);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                if (inboundOrder != null && inboundOrderDetail != null)
                {
                    _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                    _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                }
                if (returnOrder != null)
                {
                    _inboundRepository.ReturnOrderRepository.UpdateData(returnOrder);
                    _inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details);
                }
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch(Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent OutboundTaskHandCancel(int taskNum)
        {
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该任务信息");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseType == WarehouseTypEnum.成品.ToString())
                {
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
                    if (proStockInfo == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到胶框为{task.PalletCode}组盘信息");
                    }
                    Dt_LocationInfo prolocationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (prolocationInfo != null)
                    {
                        if (prolocationInfo.LocationStatus == LocationStatusEnum.Free.ObjToInt())
                        {
                            return WebResponseContent.Instance.Error($"货位状态不正确");
                        }
                        prolocationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                    }
                    proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    proStockInfo.proStockInfoDetails.ForEach(x =>
                    {
                        x.ProOutDetailStatus = StockStatusEmun.入库完成.ObjToInt();
                        x.OutboundQuantity = 0;
                    });
                    task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    FeedBackWCSTaskHandCancel(taskNum);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.自动删除);
                    _stockService.ProStockInfoService.Repository.UpdateData(proStockInfo);
                    _stockService.ProStockInfoDetailService.Repository.UpdateData(proStockInfo.proStockInfoDetails);
                    _basicService.LocationInfoService.UpdateLocationStatus(prolocationInfo, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
                    _unitOfWorkManage.CommitTran();
                    return WebResponseContent.Instance.OK();
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
                }
                if (string.IsNullOrEmpty(stockInfo.LocationCode))
                {
                    return WebResponseContent.Instance.Error($"该托盘在立库未绑定货位");
                }
                if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"未找到该托盘库存明细信息");
                }
                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (locationInfo != null)
                {
                    if (locationInfo.LocationStatus == LocationStatusEnum.Free.ObjToInt())
                    {
                        return WebResponseContent.Instance.Error($"货位状态不正确");
                    }
                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                }
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                stockInfo.Details.ForEach(x =>
                {
                    x.Status = StockStatusEmun.入库完成.ObjToInt();
                    x.OutboundQuantity = 0;
                });
                task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
                FeedBackWCSTaskHandCancel(taskNum);
                _unitOfWorkManage.BeginTran();
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工删除 : OperateTypeEnum.人工删除);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent RelocationTaskHandCancel(Dt_Task task)
        {
            Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
            if (stockInfo == null)
            {
                return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
            }
            Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
            if (locationInfoStart == null)
            {
                return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
            }
            Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
            if (locationInfoEnd == null)
            {
                return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
            }
            task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
            FeedBackWCSTaskHandCancel(task.TaskNum);
            _unitOfWorkManage.BeginTran();
            stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
            _stockService.StockInfoService.Repository.UpdateData(stockInfo);
            _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
            _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
            BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工删除 : WIDESEA_Core.Enums.OperateTypeEnum.自动删除);
            _unitOfWorkManage.CommitTran();
            return WebResponseContent.Instance.OK();
        }
    }
}