1
dengjunjie
2026-03-05 af7d711002c16d219eba4b823a3cdae38a2ccfad
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs
@@ -1,15 +1,30 @@
using System;
using Magicodes.IE.Core;
using NetTaste;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.LocationEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.AGV.HIKROBOT;
using WIDESEAWCS_DTO.RGV.FOURBOT;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_TaskInfoService
{
    public partial class TaskService
    {
        #region æ›´æ–°ä»»åŠ¡çŠ¶æ€
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡çŠ¶æ€
        /// </summary>
@@ -19,17 +34,299 @@
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent UpdateTaskStatus(object TaskDTO, DeviceTypeEnum deviceTypeEnum)
        {
            WebResponseContent content = new WebResponseContent();
            GALAXISUpdateTaskStatus gALAXIS = new();
            FOURBOTTaskStatusNotify Rgv = new();//四向车任务状态通知
            HIKROBOTTaskProcessReport hIKROBOT = new();//海康机器人
            try
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                     gALAXIS = TaskDTO.Serialize().DeserializeObject<GALAXISUpdateTaskStatus>();
                    if (gALAXIS == null) throw new Exception("参数转换失败!");
                    var task = BaseDal.QueryFirst(x => x.WMSTaskNum == gALAXIS.taskId);
                    if (task == null) throw new Exception($"未找到任务,任务编号【{gALAXIS.taskId}】");
                    switch (gALAXIS.taskStatus)
                    {
                        case 0:
                            TaskCompleted(task, deviceTypeEnum);
                            break;
                        case 4:
                            TaskFromCompleted(task, deviceTypeEnum);
                            break;
                        default:
                            task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum);
                            BaseDal.UpdateData(task);
                            break;
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
                    hIKROBOT=TaskDTO.Serialize().DeserializeObject<HIKROBOTTaskProcessReport>();
                    if (hIKROBOT==null) throw new Exception("参数转换失败!");
                    var task = BaseDal.QueryFirst(x => x.WMSTaskNum == hIKROBOT.robotTaskCode);
                    if (task == null) throw new Exception($"未找到任务,任务编号【{hIKROBOT.robotTaskCode}】");
                    switch (hIKROBOT.extra.values.method)
                    {
                        case "start":
                            TaskCompleted(task, deviceTypeEnum);
                            break;
                        case "end":
                            TaskFromCompleted(task, deviceTypeEnum);
                            break;
                        default:
                            task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum);
                            BaseDal.UpdateData(task);
                            break;
                    }
                }
                else //四向车
                {
                    Rgv = TaskDTO.Serialize().DeserializeObject<FOURBOTTaskStatusNotify>();
                    if (Rgv==null) throw new Exception("参数转换失败!");
                    var task = BaseDal.QueryFirst(x => x.WMSTaskNum == Rgv.taskID.ToString());
                    if (task==null) throw new Exception($"未找到任务,任务编号【{Rgv.taskID}】");
                    switch (Rgv.status)
                    {
                        case 2:
                            TaskCompleted(task, deviceTypeEnum);
                            break;
                        case 4:
                            TaskFromCompleted(task, deviceTypeEnum);
                            break;
                        default:
                            task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum);
                            break;
                    }
                }
               return content.OK();
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
            finally
            {
                // åœ¨ finally ä¸­åˆ¤æ–­å“ªä¸ªå¯¹è±¡è¢«èµ‹å€¼äº†
                object logObject = null;
                string deviceName = "";
                if (gALAXIS != null && gALAXIS.taskId != null)
                {
                    logObject = gALAXIS;
                    deviceName = "凯乐士AGV";
                }
                else if (hIKROBOT != null && hIKROBOT.robotTaskCode != null)
                {
                    logObject = hIKROBOT;
                    deviceName = "海康机器人";
                }
                else if (Rgv != null && Rgv.taskID != 0)
                {
                    logObject = Rgv;
                    deviceName = "四向车";
                }
                if (logObject != null)
                {
                    _trackloginfoService.AddTrackLog(logObject, content, $"下发{deviceName}任务", "", "");
                }
            }
        }
        #endregion
        #region ä»»åŠ¡çŠ¶æ€è½¬æ¢
        public int ReturnTaskStatus(object status, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                    TaskStatusEnum taskStatus = status switch
                    {
                        1 => TaskStatusEnum.FromOutOfStock,
                        2 => TaskStatusEnum.ToaddInStock,
                        3 => TaskStatusEnum.TaskNumRepetition,
                        5 => TaskStatusEnum.RCSDataError,
                        6 => TaskStatusEnum.TaskTypeError,
                        7 => TaskStatusEnum.ParameterError,
                        8 => TaskStatusEnum.RCSError,
                        10 => TaskStatusEnum.Takeing,
                        13 => TaskStatusEnum.Cancel,
                        _ => throw new ArgumentOutOfRangeException(
                            nameof(status),
                            status,
                            $"未知的任务状态码: {status}"
                        )
                    };
                    return (int)taskStatus;
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
                    return 0;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region ä»»åŠ¡èµ·ç‚¹å®Œæˆ
        /// <summary>
        /// ä»»åŠ¡èµ·ç‚¹å®Œæˆ
        /// </summary>
        /// <param name="dt_Task"></param>
        /// <param name="deviceTypeEnum"></param>
        /// <returns></returns>
        public WebResponseContent TaskFromCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                dt_Task.TaskState = TaskStatusEnum.TakeFinish.ObjToInt();
                Db.Ado.BeginTran();
                UpdateLocationStatus(dt_Task, deviceTypeEnum, LocationStatusEnum.Free);
                BaseDal.UpdateData(dt_Task);
                Db.Ado.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region ä»»åŠ¡å®Œæˆ
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <param name=""></param>
        /// <param name="deviceTypeEnum"></param>
        /// <returns></returns>
        public WebResponseContent TaskCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                WMSInOutBoundCompleteFeedback boundCompleteFeedback = new WMSInOutBoundCompleteFeedback();
                WMSReturn agvContent = null;
                dt_Task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(WMSInOutBoundCompleteFeedback));
                if (apiInfo == null) dt_Task.ExceptionMessage = "未找到出入库完成反馈WMS接口配置信息!请检查接口配置";
                else
                {
                    boundCompleteFeedback.taskCode = dt_Task.WMSTaskNum;
                    boundCompleteFeedback.containerCode = dt_Task.PalletCode;
                    boundCompleteFeedback.fromStationCode = dt_Task.SourceAddress;
                    boundCompleteFeedback.toLocationCode = dt_Task.TargetAddress;
                    switch (deviceTypeEnum)
                    {
                        case DeviceTypeEnum.GALAXIS:
                            boundCompleteFeedback.businessType = 1;
                            break;
                        case DeviceTypeEnum.YuanLiJuHe:
                            boundCompleteFeedback.businessType = 2;
                            break;
                    }
                    boundCompleteFeedback.completeType = 1;
                    string response = HttpHelper.Post(apiInfo.ApiAddress, boundCompleteFeedback.Serialize());
                    agvContent = response.DeserializeObject<WMSReturn>();
                    if (agvContent.code != 0) dt_Task.ExceptionMessage = agvContent.msg;
                }
                Db.Ado.BeginTran();
                UpdateLocationStatus(dt_Task, deviceTypeEnum, LocationStatusEnum.InStock);
                if (agvContent != null && agvContent.code == 0)
                    BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.自动完成);
                else
                    BaseDal.UpdateData(dt_Task);
                Db.Ado.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region æ›´æ–°è´§ä½çŠ¶æ€
        /// <summary>
        /// æ›´æ–°è´§ä½çŠ¶æ€
        /// </summary>
        /// <param name="LocationCode"></param>
        /// <param name="deviceTypeEnum"></param>
        /// <param name="locationStatusEnum"></param>
        /// <returns></returns>
        public WebResponseContent UpdateLocationStatus(Dt_Task takse, DeviceTypeEnum deviceTypeEnum, LocationStatusEnum locationStatusEnum)
        {
            try
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                    Dt_KLSLocationInfo? dt_KLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress);
                    if (dt_KLSLocationInfo != null)
                    {
                        if (locationStatusEnum== LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号
                        {
                            dt_KLSLocationInfo.PalletCode = "";
                        }
                        else
                        {
                            dt_KLSLocationInfo.PalletCode = takse.PalletCode;
                        }
                        dt_KLSLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _kLSLocationInfoService.Repository.UpdateData(dt_KLSLocationInfo);
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
                    Dt_HKLocationInfo? dt_HKLocationInfo = _hKLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress);
                    if (dt_HKLocationInfo != null)
                    {
                        if (locationStatusEnum == LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号
                        {
                            dt_HKLocationInfo.PalletCode = "";
                        }
                        else
                        {
                            dt_HKLocationInfo.PalletCode = takse.PalletCode;
                        }
                        dt_HKLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _hKLocationInfoService.Repository.UpdateData(dt_HKLocationInfo);
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.YuanLiJuHe)
                {
                    Dt_RGVLocationInfo dt_RGVLocationInfo = _rGVLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress);
                    //这里将任务的托盘号给货位表中的PalletCode字段。
                    if (dt_RGVLocationInfo != null)
                    {
                        if (locationStatusEnum == LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号
                        {
                            dt_RGVLocationInfo.PalletCode = "";
                        }
                        else
                        {
                            dt_RGVLocationInfo.PalletCode = takse.PalletCode;
                        }
                        dt_RGVLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _rGVLocationInfoService.Repository.UpdateData(dt_RGVLocationInfo);
                    }
                }
                else//库外站台
                {
                }
@@ -37,8 +334,9 @@
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
}