刘磊
2025-08-15 baad30699918c536d0b96e36df70b8f352d520e4
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -131,9 +131,10 @@
        WebResponseContent content = new WebResponseContent();
        try
        {
            // æ›´æ–°åº“位状态与任务状态
            var stock = _palletStockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
            //查找库存
            var stock = await _palletStockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
            // æ›´æ–°åº“位状态与任务状态
            (var loc, var tas) = UpdateStockAndTaskStatus(stock, task);
            var taskHty = task.Adapt<Dt_Task_Hty>();
            taskHty.FinishTime = DateTime.Now;
@@ -150,7 +151,8 @@
            {
                var isLocationUpdate = await _locationRepository.UpdateDataAsync(loc);                      //更新库位
                var isPalletHty = await _palletStockInfo_HtyRepository.AddDataAsync(stockInfo_Hty);         //添加历史库存记录
                var isTaskUpdated = await BaseDal.DeleteDataByIdAsync(task.TaskId);                         //删除任务
                //var isTaskUpdated = await BaseDal.DeleteDataByIdAsync(task.TaskId);                       //删除任务
                await BaseDal.UpdateDataAsync(task);                                                        //取消删除任务,改为完成状态;并WMS界面由人工确认完成
                var isTaskAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0;                        //加入历史任务
                var isDelete = await _palletStockInfoRepository.DeleteDataAsync(stock);                     //删除库存
                await DeleteStockInfoDetailsAsync(stock.StockInfoDetails);                                  //删除库存明细
@@ -257,7 +259,6 @@
    #endregion å¤–部接口方法
    #region ä»»åŠ¡çŠ¶æ€æ›´æ”¹
    /// <summary>
@@ -318,93 +319,106 @@
            string palletCode = saveModel.MainData["palletCode"].ToString();
            string station = saveModel.MainData["station"].ToString();
            // æŸ¥è¯¢åº“存信息
            var stockInfo = _palletStockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
            if (stockInfo == null)
            var barcode = JsonConvert.DeserializeObject<List<string>>(saveModel.MainData["palletCode"].ToString());
            if (barcode == null && barcode.Count == 0) throw new Exception($"无托盘参数,请重试!");
            foreach (var item in barcode)
            {
                return content.Error("未查询到对应的库存信息");
                // æŸ¥è¯¢åº“存信息
                var stockInfo = _palletStockInfoRepository.QueryFirst(x => x.PalletCode == item);
                if (stockInfo == null)
                {
                    return content.Error("未查询到对应的库存信息");
                }
                if (stockInfo.StockStatus != 2) return content.Error($"指定失败:托盘{item}当前状态不允许指定出库");
                stockInfo.StockStatus = 3;
                //查询库位是否锁定,
                var location = _locationRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                if (location.LocationStatus == (int)LocationEnum.Lock) return content.Error("库位锁定,请先解锁后再指定出库");
                location.LocationStatus = (int)LocationEnum.InStockDisable;
                var task = BaseDal.QueryFirst(x => x.PalletCode == palletCode);
                if (task != null)
                {
                    return content.Error($"【{item}】已存在任务");
                }
                var stationInfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode == station);
                if (stationInfo.Roadway != stockInfo.AreaCode) throw new Exception($"当前托盘{item}与下料位不同区域,请重新选择!");
                // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                string agvId = Guid.NewGuid().ToString().Replace("-", "").Take(16);
                task = new Dt_Task
                {
                    Grade = 1,
                    Roadway = stationInfo.Roadway,
                    TargetAddress = stationInfo.stationLocation,
                    Dispatchertime = DateTime.Now,
                    MaterialNo = "",
                    NextAddress = stationInfo.stationLocation,
                    OrderNo = null,
                    PalletCode = stockInfo.PalletCode,
                    SourceAddress = stockInfo.LocationCode,
                    CurrentAddress = stockInfo.LocationCode,
                    TaskState = (int)TaskOutStatusEnum.OutNew,
                    TaskType = (int)TaskOutboundTypeEnum.Outbound,
                    TaskNum = BaseDal.GetTaskNo().Result,
                    Creater = "System",
                    CreateDate = DateTime.Now,
                    TaskId = 0,
                    AGVtaskId = agvId
                };
                addtask schedulingTask = new addtask
                {
                    task_id = task.AGVtaskId,
                    task_type = task.TaskType == (int)TaskTypeEnum.Inbound ? "push" : "pop",
                    work_begin = task.SourceAddress,
                    work_end = task.TargetAddress
                };
                string address = AGV_Interface + "add_task";
                string result = HttpsClient.PostAsync(address, schedulingTask.ToDictionary()).Result;
                content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                if (content.ack != 0)
                {
                    Console.WriteLine($"请求RCS异常:{content.msg}");
                    LogFactory.GetLog("下发AGV任务").Info(true, $"\r\r--------------------------------------");
                    LogFactory.GetLog("下发AGV任务").Info(true, $"请求参数:{schedulingTask.ToJsonString()}");
                    LogFactory.GetLog("下发AGV任务").Info(true, $"响应参数:{content.ToJsonString()}");
                    throw new Exception(content.msg);
                }
                _unitOfWorkManage.BeginTran();
                // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                BaseDal.AddData(task);
                // æ›´æ–°åº“位位置状态为不可用
                _locationRepository.UpdateData(location);
                _palletStockInfoRepository.UpdateData(stockInfo);
                _unitOfWorkManage.CommitTran();
            }
            if (stockInfo.StockStatus != 2) return content.Error("指定失败:当前状态不允许指定出库");
            stockInfo.StockStatus = 3;
            //查询库位是否锁定,
            var location = _locationRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
            if (location.LocationStatus == (int)LocationEnum.Lock) return content.Error("库位锁定,请先解锁后再指定出库");
            location.LocationStatus = (int)LocationEnum.InStockDisable;
            var task = BaseDal.QueryFirst(x => x.PalletCode == palletCode);
            if (task != null)
            {
                return content.Error($"【{palletCode}】已存在任务");
            }
            var stationInfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode == station);
            // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
            string agvId = Guid.NewGuid().ToString().Replace("-", "").Take(16);
            task = new Dt_Task
            {
                Grade = 1,
                Roadway = stationInfo.Roadway,
                TargetAddress = stationInfo.stationLocation,
                Dispatchertime = DateTime.Now,
                MaterialNo = "",
                NextAddress = stationInfo.stationLocation,
                OrderNo = null,
                PalletCode = stockInfo.PalletCode,
                SourceAddress = stockInfo.LocationCode,
                CurrentAddress = stockInfo.LocationCode,
                TaskState = (int)TaskOutStatusEnum.OutNew,
                TaskType = (int)TaskOutboundTypeEnum.Outbound,
                TaskNum = BaseDal.GetTaskNo().Result,
                Creater = "System",
                CreateDate = DateTime.Now,
                TaskId = 0,
                AGVtaskId = agvId
            };
            addtask schedulingTask = new addtask
            {
                task_id = task.AGVtaskId,
                task_type = task.TaskType == (int)TaskTypeEnum.Inbound ? "push" : "pop",
                work_begin = task.SourceAddress,
                work_end = task.TargetAddress
            };
            string address = AGV_Interface + "add_task";
            string result = HttpsClient.PostAsync(address, schedulingTask.ToDictionary()).Result;
            content = JsonConvert.DeserializeObject<WebResponseContent>(result);
            if (content.ack != 0)
            {
                Console.WriteLine($"请求RCS异常:{content.msg}");
                LogFactory.GetLog("下发AGV任务").Info(true, $"\r\r--------------------------------------");
                LogFactory.GetLog("下发AGV任务").Info(true, $"请求参数:{schedulingTask.ToJsonString()}");
                LogFactory.GetLog("下发AGV任务").Info(true, $"响应参数:{content.ToJsonString()}");
                throw new Exception(content.msg);
            }
            _unitOfWorkManage.BeginTran();
            // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
            BaseDal.AddData(task);
            // æ›´æ–°åº“位位置状态为不可用
            _locationRepository.UpdateData(location);
            _palletStockInfoRepository.UpdateData(stockInfo);
            _unitOfWorkManage.CommitTran();
            content.OK();
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            Console.WriteLine($"发生异常: {ex.Message}");
            Console.WriteLine($"指定出库异常: {ex.Message}");
            LogFactory.GetLog("指定出库异常").Info(true, $"\r\r--------------------------------------");
            LogFactory.GetLog("指定出库异常").Info(true, $"请求参数:{saveModel.ToJsonString()}");
            content.Error(ex.Message);
        }
        return content;