zhangchengsong
12 小时以前 f59f3b24814387573b5bca9a9b6c832a3720ee7e
ÏîÄ¿´úÂë/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -56,6 +56,7 @@
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.System;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoRepository;
@@ -123,14 +124,13 @@
                {
                    task.TaskState = (int)TaskOutStatusEnum.OutFinish;
                    BaseDal.UpdateData(task);
                    string Result = WMSTaskStatusEnum.outsuccess.GetDescription();
                    if (task.Creater.Equals("WMS"))
                    {
                        //同步给上游反馈任务完成
                        Dt_roadwayinfo roadwayinfo = _Dt_roadwayinfoService.GetRoadwayinfo(task.Roadway);
                        CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                        if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                        if (command.status != "success")return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    }
                    task.ModifyDate = DateTime.Now;
                    BaseDal.DeleteData(task);
@@ -160,18 +160,17 @@
                    task.TaskState = (int)TaskinventoryStatusEnum.inventoryFinish;
                    BaseDal.UpdateData(task);
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    if (task.Creater.Equals("WMS"))
                    {
                        Dt_roadwayinfo roadwayinfo = _Dt_roadwayinfoService.GetRoadwayinfo(task.Roadway);
                        CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                        if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                        if (command.status != "success")return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    }
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"入库完成");
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"盘点完成");
                }
                else
                {
@@ -472,12 +471,12 @@
        /// <returns>返回任务实体对象,可能为null</returns>
        public List<Dt_Task> QueryStackerCraneTask(string deviceNo, string currentAddress = "")
        {
            return BaseDal.QueryData(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
            return BaseDal.QueryData(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskinventoryStatusEnum.inventoryNew), TaskOrderBy);
        }
        public Dt_Task CutStackerCraneTask(string deviceNo)
        {
            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting  || x.TaskState == (int)TaskInStatusEnum.SC_InExecuting));
            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting  || x.TaskState == (int)TaskInStatusEnum.SC_InExecuting || x.TaskState == (int)TaskinventoryStatusEnum.SC_inventoryExecuting));
            return dt_Task;
        }
        /// <summary>
@@ -491,36 +490,21 @@
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                string Result = task.TaskType == 200 || task.TaskType == 300 ? WMSTaskStatusEnum.inerror.GetDescription(): WMSTaskStatusEnum.outerror.GetDescription();
                if (task.Creater.Equals("WMS"))
                {
                    //上报入库任务异常
                    if (task.TaskType == (int)TaskTypeEnum.Inbound)
                    {
                        string Result = WMSTaskStatusEnum.inerror.GetDescription();
                        if (task.Creater.Equals("WMS"))
                        {
                            Dt_roadwayinfo roadwayinfo = _Dt_roadwayinfoService.GetRoadwayinfo(task.Roadway);
                            CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                            if (command.status != "success") return content.Error($"调取上游返回失败,任务取消失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                        }
                        BaseDal.DeleteData(task);
                        task.ModifyDate = DateTime.Now;
                        task.Modifier = App.User?.UserName;
                        task.Remark = "人工手动取消";
                        BaseDal.DeleteData(task);
                        _task_HtyService.AddTaskHty(task);
                        content.Status = true;
                    }
                    else
                    {
                        WebResponseContent.Instance.Error($"取消失败,只能取消入库任务");
                    }
                     Dt_roadwayinfo roadwayinfo = _Dt_roadwayinfoService.GetRoadwayinfo(task.Roadway);
                     CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                     if (command.status != "success") return content.Error($"调取上游返回失败,任务取消失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                }
                else
                {
                    WebResponseContent.Instance.Error($"取消失败,该任务【{taskNum}】不存在");
                }
                BaseDal.DeleteData(task);
                task.ModifyDate = DateTime.Now;
                task.Modifier = App.User?.UserName;
                task.Remark = "人工手动取消";
                BaseDal.DeleteData(task);
                _task_HtyService.AddTaskHty(task);
                content.Status = true;
                return content;
            }
            catch (Exception e)
@@ -550,7 +534,7 @@
                        CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                        if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    }
                        task.ModifyDate = DateTime.Now;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
@@ -566,7 +550,8 @@
                        CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                        if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    }
                        task.ModifyDate = DateTime.Now;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
@@ -574,20 +559,21 @@
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动入库完成");
                }
                else if (task.TaskType == (int)TaskTypeEnum.Inventorybound)
                {;
                {
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    if (task.Creater.Equals("WMS"))
                    {
                        Dt_roadwayinfo roadwayinfo = _Dt_roadwayinfoService.GetRoadwayinfo(task.Roadway);
                        CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, roadwayinfo.WarehouseInvType, "");
                        if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    }
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动入库完成");
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动盘点完成");
                }
                else
                {
@@ -615,9 +601,6 @@
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName.Contains("堆垛机"));
                // åˆ¤æ–­è®¾å¤‡æ˜¯å¦å­˜åœ¨
                if (device == null)
                {
@@ -627,8 +610,9 @@
                }
                // åˆ¤æ–­åœ°å€æ˜¯å¦å±žäºŽå½“前设备库
                if (transfer.SourceAddress.Contains(device.DeviceCode) && transfer.TargetAddress.Contains(device.DeviceCode))
                if ((transfer.TaskType == 300 || transfer.SourceAddress.Contains(device.DeviceCode) ) && transfer.TargetAddress.Contains(device.DeviceCode))
                {
                    // å…¥åº“
                    if (transfer.TaskType == 200)
                    {
@@ -637,6 +621,7 @@
                        {
                            content.Error($"手动创建任务失败,原因:{device.DeviceCode}库不存在这个库口:{transfer.SourceAddress}");
                            WriteLog.Write_Log("手动任务创建失败", "创建失败", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                        }
                        else
                        {
@@ -652,8 +637,8 @@
                            _unitOfWorkManage.BeginTran();
                            BaseDal.AddData(transfer);
                            _unitOfWorkManage.CommitTran();
                            content.OK("手动任务创建成功!");
                            WriteLog.Write_Log("手动任务创建成功", "创建成功", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                            content.OK("手动入库任务创建成功!");
                            WriteLog.Write_Log("手动任务创建成功", "创建成功", $",任务类型:【入库】,任务号:【{transfer.TaskNum}】托盘编号:【{transfer.PalletCode}】,起始地址:【{transfer.SourceAddress}】,目标地址:【{transfer.TargetAddress}】");
                        }
                        return content;
@@ -670,7 +655,7 @@
                        {
                            // æ­£å¸¸åˆ›å»ºä»»åŠ¡
                            transfer.TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
                            transfer.TaskState = 200;
                            transfer.TaskState = 100;
                            transfer.CurrentAddress = transfer.SourceAddress;
                            transfer.NextAddress = transfer.TargetAddress;
                            transfer.Roadway = device.DeviceCode;
@@ -680,18 +665,35 @@
                            _unitOfWorkManage.BeginTran();
                            BaseDal.AddData(transfer);
                            _unitOfWorkManage.CommitTran();
                            content.OK("手动任务创建成功!");
                            WriteLog.Write_Log("手动任务创建成功", "创建成功", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                            content.OK("手动出库任务创建成功!");
                            WriteLog.Write_Log("手动任务创建成功", "创建成功", $"任务类型:【出库】,任务号:【{transfer.TaskNum}】托盘编号:【{transfer.PalletCode}】,,起始地址:【{transfer.SourceAddress}】,目标地址:【{transfer.TargetAddress}】");
                        }
                        return content;
                    }
                    else if (transfer.TaskType == 300)
                    {
                            // æ­£å¸¸åˆ›å»ºä»»åŠ¡
                            transfer.TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
                            transfer.TaskState = 300;
                            transfer.CurrentAddress = transfer.SourceAddress;
                            transfer.NextAddress = transfer.TargetAddress;
                            transfer.Roadway = device.DeviceCode;
                            transfer.Creater = "WCS";
                            transfer.Grade = 1;
                            transfer.CreateDate = DateTime.Now;
                            _unitOfWorkManage.BeginTran();
                            BaseDal.AddData(transfer);
                            _unitOfWorkManage.CommitTran();
                            content.OK("手动盘点任务创建成功!");
                        WriteLog.Write_Log("手动任务创建成功", "创建成功", $",任务类型:【盘点】,任务号:【{transfer.TaskNum}】,托盘编号:【{transfer.PalletCode}】,目标地址:【{transfer.TargetAddress}】");
                        return content;
                    }
                }
                else
                {
                    content.Error($"手动创建任务失败,原因:{device.DeviceCode}库地址不匹配,起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                    WriteLog.Write_Log("手动任务创建失败", "创建失败", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                    WriteLog.Write_Log("手动任务创建失败", "创建失败",$"任务号:【{transfer.TaskNum}】,托盘编号:【{transfer.PalletCode}】,目标地址:【{transfer.TargetAddress}】");
                }
            }
            catch (Exception ex)
@@ -701,5 +703,145 @@
            }
            return content;
        }
        /// <summary>
        /// æ‰‹åŠ¨åˆ é™¤ä»»åŠ¡
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent CreateDelete(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null)
                    return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                task.ModifyDate = DateTime.Now;
                task.Modifier = App.User?.UserName;
                task.Remark = "人工手动删除";
                content.Status =  BaseDal.DeleteData(task);
                _task_HtyService.AddTaskHty(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动删除任务");
            }
            catch(Exception e)
            {
                WebResponseContent.Instance.Error(e.Message);
            }
            return content;
        }
        /// <summary>
        /// ç¼–辑
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string json = JsonConvert.SerializeObject(saveModel.MainData);
                Dt_Task task = JsonConvert.DeserializeObject<Dt_Task>(json);
                content.Status = BaseDal.UpdateData(task);
            }catch(Exception e)
            {
                WebResponseContent.Instance.Error(e.Message);
            }
            return content;
        }
        ///
        //agv进出状态反馈
        public WebResponseContent getManuaAGVStatus(AgvUpdateRequest agvUpdateRequest)
        {
            //获取WMS调取的参数
            WriteLog.Write_Log("手动agv进出状态反馈接口", "手动agv进出状态信息", $"库口名称:【{agvUpdateRequest.warehousenumber}】,申请状态:【{agvUpdateRequest.agvstatus}】");
            WebResponseContent content = new WebResponseContent();
            try
            {
                string DeciceCodes = "1003";
                if (agvUpdateRequest.warehousenumber.StartsWith("C")) DeciceCodes = "1004";
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeciceCodes);
                if (device == null) return content.Error("WCS未能获取到库口实例");
                CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                //是否可进出
                DeviceProDTO? HandShake = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "HandShake");
                if (HandShake == null) return content.Error($"WCS未找到库口:{agvUpdateRequest.warehousenumber},对应的协议");
                DeviceProDTO? Request = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "Request");
                if (agvUpdateRequest.agvstatus == 1)
                {
                    bool HandShakebool = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 1);
                    if (HandShakebool)
                    {
                        if (Request != null)
                        {
                            conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 1);
                        }
                        //是否可进出    1允许取  2允许放
                        DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "PermitHandShake");
                        //是否有货
                        DeviceProDTO? StationNumProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "StationNum");
                        if (deviceProDTO == null || StationNumProDTO == null) return content.Error($"WCS未找到库口:{agvUpdateRequest.warehousenumber},对应的协议");
                        int statusValue = 0;
                        int portStatus = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                        int StationStatus = conveyorLine.Communicator.Read<ushort>(StationNumProDTO.DeviceProAddress);
                        //有货,可进信号
                        statusValue = ((portStatus == 1 && StationStatus == 1) || (portStatus == 2 && StationStatus == 0)) ? 1 : (portStatus == 0) ? 0 : 0;
                        if (agvUpdateRequest.warehousenumber == "G01" || agvUpdateRequest.warehousenumber == "G06" || agvUpdateRequest.warehousenumber == "G07")
                        {
                            if (statusValue == 1)
                            {
                                return content.OK("申请进入成功");
                            }
                            else
                            {
                                conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 0);
                                return content.Error("读取plc不可进入信息");
                            }
                        }
                        else
                        {
                            return content.OK("申请进入成功");
                        }
                    }
                    else
                    {
                        return content.Error("写入plc进入信号失败");
                    }
                }
                else if (agvUpdateRequest.agvstatus == 2)
                {
                    //写入输送线信号
                    bool portStatus = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 0);
                    if (portStatus)
                    {
                        if (Request != null)
                        {
                            conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 0);
                        }
                        return content.OK("申请退出成功");
                    }
                    else
                    {
                        return content.Error("写入plc清除信号失败");
                    }
                }
                else
                {
                    return content.Error($"agv对应的申请错误,字段:agvstatus,申请的值:{agvUpdateRequest.agvstatus}");
                }
            }
            catch (Exception ex)
            {
                return content.Error($"WCS任务添加错误,原因:{ex.Message}");
            }
        }
    }
}