陈勇
2026-03-10 fc9cba5f058089887aa7061d2e6b4006b9e04a9a
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -10,8 +10,10 @@
using WIDESEA_DTO.WMS;
using WIDESEA_IServices;
using WIDESEA_IStoragIntegrationServices;
using WIDESEA_StorageTaskRepository;
using WIDESEA_StoragIntegrationServices;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.Models;
@@ -21,6 +23,7 @@
public partial class Dt_TaskService : ServiceBase<Dt_Task, IDt_TaskRepository>, IDt_TaskService
{
    private readonly LogFactory LogFactory = new LogFactory();
    //private readonly BDCManager bDCManager = new BDCManager();
    private readonly IUnitOfWorkManage _unitOfWorkManage;
    private readonly IDt_Task_HtyRepository _task_HtyRepository;
    private readonly IMapper _mapper;
@@ -30,9 +33,12 @@
    private readonly IDt_StationManagerRepository _stationManagerRepository;
    private readonly ISys_ConfigService _configService;
    private readonly IDt_PalletStockInfoRepository _palletStockInfoRepository;
    private readonly IDt_PalletStockInfoDetailRepository _palletStockInfoDetailRepository;
    private readonly IDt_PalletStockInfo_htyRepository _palletStockInfo_HtyRepository;
    private readonly IBoxingInfoRepository _boxingInfoRepository;
    private readonly IDt_CarBodyInfoRepository _carBodyRepository;
    private readonly IDt_BDCConfigurationRepository _bdcConfigurationRepository;
    private readonly IDt_BDCConfigurationService _bdcConfigurationService;
    private readonly IDt_RoadWayRepository _roadWayRepository;
    private readonly IDt_RoadWayInfoRepository _roadWayInfoRepository;
    public Dt_TaskService(IDt_TaskRepository BaseDal,
                                IUnitOfWorkManage unitOfWorkManage,
@@ -42,7 +48,7 @@
                                ITaskExecuteDetailRepository taskExecuteDetailRepository,
                                ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository,
                                IDt_StationManagerRepository stationManagerRepository,
                                ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_PalletStockInfo_htyRepository palletStockInfo_HtyRepository, IBoxingInfoRepository boxingInfoRepository, IDt_PalletStockInfoDetailRepository palletStockInfoDetailRepository) : base(BaseDal)
                                ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_PalletStockInfo_htyRepository palletStockInfo_HtyRepository, IDt_CarBodyInfoRepository carBodyRepository, IDt_BDCConfigurationRepository bdcConfigurationRepository, IDt_BDCConfigurationService bDCConfigurationService, IDt_RoadWayRepository roadWayRepository, IDt_RoadWayInfoRepository roadWayInfoRepository) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
@@ -55,8 +61,11 @@
        _configService = configService;
        _palletStockInfoRepository = palletStockInfoRepository;
        _palletStockInfo_HtyRepository = palletStockInfo_HtyRepository;
        _boxingInfoRepository = boxingInfoRepository;
        _palletStockInfoDetailRepository = palletStockInfoDetailRepository;
        _carBodyRepository = carBodyRepository;
        _bdcConfigurationRepository = bdcConfigurationRepository;
        _bdcConfigurationService = bDCConfigurationService;
        _roadWayRepository = roadWayRepository;
        _roadWayInfoRepository = roadWayInfoRepository;
    }
    #region å¤–部接口方法
@@ -73,9 +82,12 @@
        WebResponseContent content = new WebResponseContent();
        try
        {
            var stationInfo = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway);
            //if( stationInfo == null ) throw new Exception ("未配置任务站台");
            // èŽ·å–åº“ä½ä¿¡æ¯
            var locationInf = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress && x.RoadwayNo == task.Roadway);
            var locationInf = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress && x.RoadwayNo == stationInfo.RoadwayNo);
            int lastStatus = locationInf.LocationStatus;
            // æ›´æ–°ç›®æ ‡ä½ç½®çŠ¶æ€ä¸ºåº“å­˜ä¸­
@@ -85,22 +97,26 @@
            var taskHty = CreateHistoricalTask(task);
            //获取组盘信息
            var boxinginfo = await _boxingInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
            var carBody = await _carBodyRepository.QueryFirstAsync(x => x.PalletCode == task.PalletCode && x.RFID == task.PVI);
            // æ ¹æ®åˆ›å»ºåº“存实例模型
            //var boxDetail = boxinginfo.BoxingInfoDetails.Adapt<List<Dt_PalletStockInfoDetail>>();
            Dt_PalletStockInfo palletStockInfo = new Dt_PalletStockInfo
            {
                CreateDate = DateTime.Now,
                Creater = task.Creater,
                LocationCode = task.TargetAddress,
                StockStatus = 2,
                PalletCode = task.PalletCode,
                StockStatus = 0,
                //PalletCode = task.PalletCode,
                RoadwayNo = stationInfo.RoadwayNo,
                LockOrder = 0,
                TaskStatus = 0,
                carBodyID = carBody.Id,
                CarBodyInfo = carBody
            };
            // æ‰§è¡Œæ•°æ®åº“事务
            bool isResult = await ExecuteTransaction(palletStockInfo, taskHty, locationInf, task.TaskId, boxinginfo);
            bool isResult = await ExecuteTransaction(palletStockInfo, taskHty, locationInf, task.TaskId, carBody);
            if (isResult)
            {
                _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(locationInf, lastStatus, (int)StatusChangeTypeEnum.AutomaticStorage, task.TaskNum);
@@ -129,7 +145,7 @@
        try
        {
            //查找库存
            var stock = await _palletStockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
            var stock = await _palletStockInfoRepository.QueryFirstNavAsync(x => x.CarBodyInfo.PalletCode == task.PalletCode);
            // æ›´æ–°åº“位状态与任务状态
            (var loc, var tas) = UpdateStockAndTaskStatus(stock, task);
@@ -141,15 +157,15 @@
            stockInfo_Hty.FinishTime = DateTime.Now;
            stockInfo_Hty.OperateType = (int)OperateTypeEnum.自动完成;
            var boxinfo = _boxingInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
            var boxinfo = _carBodyRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
            // äº‹åŠ¡å¤„ç†
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                var isLocationUpdate = await _locationRepository.UpdateDataAsync(loc);                      //更新库位
                var isPalletHty = await _palletStockInfo_HtyRepository.AddDataAsync(stockInfo_Hty);         //添加历史库存记录
                //var isTaskUpdated = await BaseDal.DeleteDataByIdAsync(task.TaskId);                       //删除任务
                await BaseDal.UpdateDataAsync(task);                                                        //取消删除任务,改为完成状态;并WMS界面由人工确认完成
                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);                                  //删除库存明细
@@ -173,7 +189,9 @@
    private (DtLocationInfo, Dt_Task) UpdateStockAndTaskStatus(Dt_PalletStockInfo stock, Dt_Task task)
    {
        var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == task.Roadway);
        var stationInfo = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway);
        var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == stationInfo.RoadwayNo);
        int lastStatus = location.LocationStatus;
        location.LocationStatus = (int)LocationEnum.Free;
        task.TaskState = (int)TaskOutStatusEnum.OutFinish;
@@ -246,7 +264,7 @@
            if (task == null)
                return content.Error($"暂未找到【{input.PalletCode}】的任务");
            return content; //= await UpdateExistingTask(input, task);
            return await UpdateExistingTask(input, task);   // content;
        }
        catch (Exception err)
        {
@@ -279,6 +297,7 @@
                await _unitOfWorkManage.UseTranAsync(async () =>
                {
                    var asb = await BaseDal.DeleteDataByIdAsync(task.TaskId);
                    var asbHty = await _task_HtyRepository.AddDataAsync(taskHty) > 0;
                    if (asb && asbHty)
                        content.OK();
@@ -290,6 +309,7 @@
            else
            {
                task.TaskState = taskState;
                task.Dispatchertime = DateTime.Now;
                var asb = await BaseDal.UpdateDataAsync(task);
                if (asb)
                    content.OK();
@@ -323,16 +343,16 @@
            foreach (var item in barcode)
            {
                // æŸ¥è¯¢åº“存信息
                var stockInfo = _palletStockInfoRepository.QueryFirst(x => x.PalletCode == item);
                var stockInfo = _palletStockInfoRepository.QueryFirst(x => x.Id == item.ObjToInt());
                if (stockInfo == null)
                {
                    return content.Error("未查询到对应的库存信息");
                }
                if (stockInfo.StockStatus != 2) return content.Error($"指定失败:托盘{item}当前状态不允许指定出库");
                if (stockInfo.StockStatus != 0) return content.Error($"指定失败:托盘{item}当前状态不允许指定出库");
                stockInfo.StockStatus = 3;
                stockInfo.StockStatus = 1;
                //查询库位是否锁定,
                var location = _locationRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
@@ -347,20 +367,50 @@
                    return content.Error($"【{item}】已存在任务");
                }
                var stationInfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode == station);
                var carBody = _carBodyRepository.QueryFirst(x => x.Id == stockInfo.carBodyID);
                List<Dt_StationManager> stationLists = null;
                if (carBody.CarType == 1)
                {
                    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == stockInfo.RoadwayNo && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3");
                }
                else if (carBody.CarType == 2)
                {
                    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == stockInfo.RoadwayNo && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4");
                }
                else if (carBody.CarType == 3)
                {
                    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == stockInfo.RoadwayNo && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3");
                }
                //if (stationInfo.Roadway != stockInfo.AreaCode) throw new Exception($"当前托盘{item}与下料位不同区域,请重新选择!");
                if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用");
                Dt_StationManager Outstation = null;
                //if (stationLists.Count > 1)
                //{
                //    var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault();
                //    if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault();
                //    else Outstation = stationLists.FirstOrDefault();
                //}
                //else
                //{
                Outstation = stationLists.FirstOrDefault();
                //}
                //var stationInfo = stationInfos.FirstOrDefault();
                // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                task = new Dt_Task
                {
                    Grade = 1,
                    Roadway = stationInfo.Roadway,
                    TargetAddress = stationInfo.stationLocation,
                    Roadway = Outstation.Roadway,
                    TargetAddress = "RB043",
                    Dispatchertime = DateTime.Now,
                    NextAddress = stationInfo.stationLocation,
                    NextAddress = Outstation.stationChildCode,
                    OrderNo = null,
                    PalletCode = stockInfo.PalletCode,
                    PalletCode = carBody.PalletCode,
                    PVI = carBody.PVI,
                    SourceAddress = stockInfo.LocationCode,
                    CurrentAddress = stockInfo.LocationCode,
                    TaskState = (int)TaskOutStatusEnum.OutNew,
@@ -371,40 +421,33 @@
                    TaskId = 0,
                };
                // åˆ›å»ºä»»åŠ¡ä¼ è¾“ç”¨çš„DTO对象
                var taskDTO = CreateTaskDTO(task);
                //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
                //};
                // èŽ·å–WMS IP地址用于发送任务请求
                var wmsIpAddress = GetWCSIpReceiveTask();
                if (wmsIpAddress == null)
                {
                    throw new InvalidOperationException("WMS IP æœªé…ç½®");
                }
                //string address = AGV_Interface + "add_task";
                //string result = HttpsClient.PostAsync(address, schedulingTask.ToDictionary()).Result;
                var tasks = new List<WMSTaskDTO>() { taskDTO };
                // å‘送任务请求到WMS
                var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result;
                content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                if (content.Status)
                {
                    _unitOfWorkManage.BeginTran();
                    // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                    BaseDal.AddData(task);
                    // æ›´æ–°åº“位位置状态为不可用
                    _locationRepository.UpdateData(location);
                    _palletStockInfoRepository.UpdateData(stockInfo);
                //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();
                    _unitOfWorkManage.CommitTran();
                }
            }
            content.OK();
        }
        catch (Exception ex)
@@ -417,20 +460,42 @@
        }
        return content;
    }
    #endregion æŒ‡å®šä»»åŠ¡å‡ºåº“
    private string GetAGVIpReceiveTask()
    /// <summary>
    /// åˆ›å»ºä»»åŠ¡DTO
    /// </summary>
    private WMSTaskDTO CreateTaskDTO(Dt_Task task)
    {
        return new WMSTaskDTO
        {
            TaskNum = task.TaskNum.Value,
            Grade = task.Grade.Value,
            PalletCode = task.PalletCode,
            RoadWay = task.Roadway,
            SourceAddress = task.SourceAddress,
            TargetAddress = task.TargetAddress,
            TaskState = task.TaskState.Value,
            Id = 0,
            TaskType = task.TaskType,
            pvi = task.PVI,
            NextAddress = task.NextAddress
        };
    }
    private string GetWCSIpReceiveTask()
    {
        var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
        var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.AGVIPAddress)?.ConfigValue;
        var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.addTask)?.ConfigValue;
        var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
        var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
        if (wmsBase == null || ipAddress == null)
        {
            return null;
        }
        return wmsBase + ipAddress;
    }
    #endregion æŒ‡å®šä»»åŠ¡å‡ºåº“
    #endregion å¤–部接口方法
@@ -617,21 +682,6 @@
    #endregion å†…部调用方法
    #region private å†…部方法
    private async Task DeleteStockInfoDetailsAsync(IEnumerable<Dt_PalletStockInfoDetail> details)
    {
        if (details != null)
        {
            var ids = details.Select(x => (object)x.Id).ToArray();
            var isStockDetailUpdated = await _palletStockInfoDetailRepository.DeleteDataByIdsAsync(ids);
            if (!isStockDetailUpdated)
            {
                throw new Exception("库存详情信息更新失败");
            }
        }
    }
    /// <summary>
    /// åˆ›å»ºåŽ†å²ä»»åŠ¡è®°å½•
    /// </summary>
@@ -665,7 +715,7 @@
    /// <param name="taskHty">历史任务对象</param>
    /// <param name="taskId">任务ID</param>
    /// <returns></returns>
    private async Task<bool> ExecuteTransaction(Dt_PalletStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId, DtBoxingInfo boxingInfo)
    private async Task<bool> ExecuteTransaction(Dt_PalletStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId, Dt_CarBodyInfo boxingInfo)
    {
        _unitOfWorkManage.BeginTran();
        try
@@ -673,17 +723,17 @@
            var isUpdateStock = true;
            var isDeleteBoxing = true;
            // æ·»åŠ åº“å­˜
            isUpdateStock = await _palletStockInfoRepository.AddDataNavAsync(stock);
            isUpdateStock = await _palletStockInfoRepository.AddDataAsync(stock) > 0;
            //删除组盘数据
            if (boxingInfo != null)
            {
                var box = _boxingInfoRepository.DeleteData(boxingInfo);
                //boxingInfo.CurrentStatue = 5;
                //isDeleteBoxing = await _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxingInfo.Id)
                //                        .Include(x => x.BoxingInfoDetails)
                //                        .ExecuteCommandAsync();
            }
            //if (boxingInfo != null)
            //{
            //    //var box = _carBodyRepository.DeleteData(boxingInfo);
            //    //boxingInfo.CurrentStatue = 5;
            //    //isDeleteBoxing = await _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxingInfo.Id)
            //    //                        .Include(x => x.BoxingInfoDetails)
            //    //                        .ExecuteCommandAsync();
            //}
            //
            // æ·»åŠ åŽ†å²ä»»åŠ¡
@@ -739,25 +789,27 @@
                // åˆ›å»ºWebResponseContent对象
                var content = new WebResponseContent();
                // èŽ·å–åº“ä½
                //var location = RequestLocation(input);
                //if (location == null)
                //{
                //    return content.Error("无法获取货位信息");
                //}
                var carInfo = _carBodyRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                var stationInfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode == input.Position);
                // èŽ·å–åº“ä½;
                var location = RequestLocation(stationInfo.RoadwayNo, carInfo.CarType);
                if (location == null)
                {
                    return content.Error("无法获取货位信息");
                }
                //string toAddress = location.LocationCode;
                //int taskState = (int)TaskInStatusEnum.Line_InFinish;
                //int beforeStatus = location.LocationStatus;
                //// æ›´æ–°è´§ä½ä¿¡æ¯
                //location.LocationStatus = (int)LocationEnum.Lock;
                string toAddress = location.LocationCode;
                int taskState = (int)TaskInStatusEnum.Line_InFinish;
                int beforeStatus = location.LocationStatus;
                // æ›´æ–°è´§ä½ä¿¡æ¯
                location.LocationStatus = (int)LocationEnum.Lock;
                // æ›´æ–°ä»»åŠ¡ä¿¡æ¯
                //MapTaskProperties(task, input, toAddress, taskState);
                //更新任务信息
                MapTaskProperties(task, input, toAddress, taskState);
                _unitOfWorkManage.BeginTran();
                // å¼€å§‹äº‹åŠ¡
                var isResult = false; //await UpdateTaskAsync(task, location, beforeStatus);
                var isResult = await UpdateTaskAsync(task, location, beforeStatus);
                if (!isResult)
                {
                    _unitOfWorkManage.RollbackTran();