| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using WCS.Data;using WCS.Data.Models;using WCS.Data.Utils;using WCS.PLC;using WCS.PLC.Model.Equipment;namespace WCS.Workflow{    public class ConvPlc03 : Base_Conv    {        #region 只读变量        private readonly string Conv_1390 = "1390";        private readonly string Conv_1418 = "1418";        private readonly string Conv_1401 = "1401";        private readonly string Conv_1416 = "1416";        #endregion;        public override void Run()        {            Conv_ScanBarCodeExeTask();            ConvTaskFinish();        }        private void ConvTaskFinish()        {            ConveyorTaskFinish(PlcName, Conv_1401, false, true);            ConveyorTaskFinish(PlcName, Conv_1416, false, true);            ConveyorTaskFinish();        }        public void ConveyorTaskFinish()         {            try            {                //调用函数完成任务                string result = TryCachHelper.TryExecute((db) =>                {                    var task = db.Queryable<WCS_TASK>().First(v => v.TASK_POSIDTO == Conv_1418 && v.TASK_POSIDCUR != v.TASK_POSIDFROM);                    if (task == null) return;                    //修改任务的状态                    db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })                                .Where(it => it.TASK_NO == task.TASK_NO)                                .ExecuteCommand();                });                if (!string.IsNullOrWhiteSpace(result))                {                    throw new Exception(result);                }            }            catch (Exception ex)            {                LogMessageHelper.RecordLogMessage(ex);            }        }        /// <summary>        /// 输送线任务完成        /// </summary>        /// <param name="plcName">Plc</param>        /// <param name="convNo">输送线出口</param>        /// <param name="isCheckEndPos">是否检测当前地址和任务目标地址一致</param>        /// <param name="isTaskDelete">是否删除输送线任务</param>        public override void ConveyorTaskFinish(string plcName, string convNo, bool isCheckEndPos = true, bool isTaskDelete = false)        {            try            {                var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);                var conveyorTo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);                var cs = conveyorTo.EquSignal_Conv;                if (cs.DB521_Tasknum > 0 && cs.DB521_Request)                {                    if (convNo == "1401" || convNo == "1416")                    {                        Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]获取删除任务请求信号成功!", convNo));                    }                    //调用函数完成任务                    string result = TryCachHelper.TryExecute((db) =>                    {                        WCS_TASK taskcur = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_WKSTATUS < 99);                        if (taskcur == null) return;                        if (isCheckEndPos)                        {                            if (taskcur.TASK_COMTYPE != 6 && taskcur.TASK_POSIDTO != convNo) return;                        }                        //任务类型不是出库/搬运/移动类型                        if (taskcur.TASK_COMTYPE != 2 && taskcur.TASK_COMTYPE != 4 && taskcur.TASK_COMTYPE != 5) return;                        //var task = db.Queryable<WCS_TASK>().First(v => v.TASK_WKSTATUS == 99 && v.TASK_POSIDFROM == "1390" && v.TASK_POSIDTO == taskcur.TASK_POSIDTO);                        //if (task == null)                        //{                            //修改任务的状态                            db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })                              .Where(it => it.TASK_NO == taskcur.TASK_NO)                              .ExecuteCommand();                        //}                        //else                         //{                        //    BaseWorkflow.AddLedErrorMsg(convNo, string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]",task.TASK_POSIDTO, task.TASK_BOXBARCODE,task.TASK_NO), 0);                        //   // LogMessageHelper.RecordLogMessage(string.Format("上一个箱子[{0}]存在未完成任务", task.TASK_BOXBARCODE, task.TASK_NO), true, LogLevelEnum.INFO.ToString());                        //    throw new Exception(string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]", task.TASK_POSIDTO, task.TASK_BOXBARCODE, task.TASK_NO));                                                   //}                    });                    if (!string.IsNullOrWhiteSpace(result))                    {                        throw new Exception(result);                    }                    else                     {                        if (convNo == "1401" || convNo == "1416")                        {                            Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]任务[{1}]标识完成成功!", convNo, cs.DB521_Tasknum));                        }                    }                    if (isTaskDelete)                    {                        if (cs.DB521_Tasknum > 0 && cs.DB523_Fault == false && cs.CvDB51_PH_Status == false                            //&& cs.DB521_Goodsend == Convert.ToInt32(convNo)                             && cs.DB521_Request)                        {                            var converywrite = new WCSWriteToConveyorSignal()                            {                                Plc = plc.Plc,                                DBName = plc.WriteDBName,                                ConveyorNo = convNo,                                WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,                                TaskDelete = true                            };                                                   WriteInfoToConv(cs, converywrite, true);                        }                    }                }            }            catch (Exception ex)            {                LogMessageHelper.RecordLogMessage(ex);            }        }        private void Conv_ScanBarCodeExeTask()        {            Conv_ScanningRequest(Conv_1390, Current.Pvchouseputong, Conv_1418);        }        public string TranslationBarCode(string barCode)        {            var arr = barCode.Split('}');            return arr[1];        }        protected virtual void Conv_ScanningRequest(string convPosFrom, string warehouseid, string exitNo = "")        {            try            {                var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);                var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convPosFrom);                var cs = conveyor.EquSignal_Conv;                if (!cs.DB521_Request) return;                if (cs.DB520_Confirm) return;                WCS_TASK task = QueryTaskByCode(cs, convPosFrom, exitNo);                if (task == null)                {                    string code = TranslationBarCode(cs.BarCodeStr);                    var param = new GetInTaskParam()                    {                        ContainerBarCode = code,                        ContainerType = 1,                        MatBarCode = string.Empty,                        WareHouseId = warehouseid,                        EquipmentNo = convPosFrom,                        EndPostion = string.Empty,                        Memo2 = exitNo                    };                    task = BaseWorkflow.GetWcsInTask(param);                }                if (task == null) return;                //判断任务是否已经执行                if (task.TASK_WKSTATUS >= 2)                {                    if (task.TASK_POSIDFROM != task.TASK_POSIDCUR)                    {                        task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom && v.TASK_COMTYPE == 6);                        if (task == null)                        {                            #region 重码异常口排出                            string message = string.Format("条码[{0}]是重码。", cs.BarCodeStr);                            LogMessageHelper.RecordLogMessage(message);                            var wcstask = new WCS_TASK()                            {                                TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),                                TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,                                TASK_SYSTYPE = "WCS",                                TASK_POSIDFROM = convPosFrom,//起点地址                                TASK_POSIDCUR = convPosFrom,                                TASK_POSIDNEXT = convPosFrom,                                TASK_POSIDMOVE = "",                                TASK_PRIORITY = 1,                                TASK_WKSTATUS = 1,                                TASK_WHID = Current.Pvchouseputong,                                TASK_ADDUSERNO = "WCS",                                TASK_ADDDATETIME = DateTime.Now,                                TASK_EDITUSERNO = "WCS",                                TASK_EDITDATETIME = DateTime.Now,                                TASK_NOTES = "",                                TASK_RGVNO = "",                                TASK_BOXBARCODE = "MultipleCoding_" + DateTime.Now.ToString("yyyyMMddhhmmss"),                                TASK_POSIDTO = Conv_1418                            };                            string result = TryCachHelper.TryTranExecute((db) =>                            {                                int id = db.Insertable(wcstask).ExecuteReturnIdentity();                                if (id <= 0)                                {                                    throw new Exception(string.Format("重码[{0}]添加异常排出任务失败。", cs.BarCodeStr));                                }                                else                                {                                    wcstask.TASK_NO = id;                                }                                var task_dtl = new WCS_TASK_DTL()                                {                                    ID = Guid.NewGuid().ToString(),                                    PARENTID = wcstask.TASK_NO,                                    TASKNO = wcstask.TASK_NO,                                    POSIDCUR = convPosFrom,                                    POSIDNEXT = convPosFrom,                                    DESCRIPTION = message,                                    EXECUTEDATE = DateTime.Now                                };                                db.Insertable(task_dtl).ExecuteReturnIdentity();                                BaseWorkflow.AddLedErrorMsg(db, convPosFrom, message, wcstask.TASK_NO, 100);                            });                            if (!string.IsNullOrWhiteSpace(result))                            {                                throw new Exception(result);                            }                            #endregion;                        }                    }                }                if (task.TASK_WKSTATUS >= 2) return;                //WCS_PalletizingCode palletizingCode = null;                if (task.TASK_COMTYPE != 6)                {                    //var PalletizingCodeSet = SugarBase.DB.Queryable<WCS_PalletizingCode>().ToList();                    //palletizingCode = Current.IsAvailableRange_BoxSize(PalletizingCodeSet, task.PalletizingBoxSize, task.TASK_NO);                    //palletizingCode = PalletizingCodeSet.FirstOrDefault(v => v.IsAvailableRange_BoxSize(task.PalletizingBoxSize, task.TASK_NO));                    if (task == null)                    {                        throw new Exception(string.Format("输送线[{0}]任务[{1}]未获取到码垛清单,请维护码垛信息.", convPosFrom, task.TASK_NO));                    }                }                bool notask = false;                int goodsend = 0;                if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)                {                    notask = true;                    goodsend = Convert.ToInt32(exitNo);                }                else                {                    var routeSet = EquRouteHelper.QueryRoute(convPosFrom, task.TASK_POSIDTO);                    var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convPosFrom).ToList();                    if (routes.Count() == 0)                    {                        throw new Exception(string.Format("输送线扫描位置[{0}]任务[{1}]查询路由失败。", convPosFrom, task.TASK_NO));                    }                    else                    {                        goodsend = Convert.ToInt32(routes.First().ROUTE_SONPOS);                    }                }                if (goodsend == 0) return;                var converywrite = new WCSWriteToConveyorSignal()                {                    Plc = plc.Plc,                    DBName = plc.WriteDBName,                    ConveyorNo = convPosFrom,                    WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,                    Tasknum = task.TASK_NO,                    Goodstype = Convert.ToInt32(task.TASK_POSIDTO),                    Goodssize = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.PalletizingBoxSize) : 0,                    Goodsstart = Convert.ToInt32(convPosFrom),                    //UpMatRequest = task.TASK_ORDERTYPE >= 1 ? true : false,                    TASK_WEIGHT = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.TASK_WEIGHT) : 0,                    Notask = notask,                    Goodsend = goodsend                };                WriteInfoToConv(cs, converywrite);            }            catch (Exception ex)            {                BaseWorkflow.AddLedErrorMsg(convPosFrom, ex.Message, 0);                LogMessageHelper.RecordLogMessage(ex);            }        }        protected WCS_TASK QueryTaskByCode(ConvSignal cs, string convPosFrom,string exitNo)        {            WCS_TASK task = null;            if (cs.DB521_BCR_Noread)            {                task = Current.TaskSet.SingleOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom);                if (task == null)                {                    string errormsg = string.Format("箱式输送线[{0}]条码未读出。", convPosFrom);                    LogMessageHelper.RecordLogMessage(errormsg);                    BaseWorkflow.AddLedErrorMsg(convPosFrom, errormsg, 0);                    string wmsno = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss");                    //wms任务异常需要生成退回托盘任务                    task = new WCS_TASK()                    {                        TASK_WMSNO = wmsno,                        TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,                        TASK_SYSTYPE = "WCS",                        TASK_POSIDFROM = convPosFrom,//起点地址                        TASK_POSIDCUR = convPosFrom,                        TASK_POSIDNEXT = convPosFrom,                        TASK_POSIDMOVE = "",                        TASK_PRIORITY = 1,                        TASK_WKSTATUS = 1,                        TASK_WHID = "PVC普通立库",                        TASK_ADDUSERNO = "WCS",                        TASK_ADDDATETIME = DateTime.Now,                        TASK_EDITUSERNO = "WCS",                        TASK_EDITDATETIME = DateTime.Now,                        TASK_NOTES = "",                        TASK_RGVNO = "",                        TASK_BOXBARCODE = wmsno,                        TASK_POSIDTO = exitNo                    };                    int id = SugarBase.DB.Insertable(task).ExecuteReturnIdentity();                    if (id <= 0)                    {                        throw new Exception(string.Format("添加WCS读码异常任务失败"));                    }                    else                    {                        task.TASK_NO = id;                    }                                        var task_dtl = new WCS_TASK_DTL()                    {                        ID = Guid.NewGuid().ToString(),                        PARENTID = task.TASK_NO,                        TASKNO = task.TASK_NO,                        POSIDCUR = convPosFrom,                        POSIDNEXT = convPosFrom,                        DESCRIPTION = errormsg,                        EXECUTEDATE = DateTime.Now                    };                    SugarBase.DB.Insertable(task_dtl).ExecuteReturnIdentity();                }            }            else            {                if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convPosFrom));                if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||                    cs.BarCodeStr.ToUpper().Contains("N") ||                    cs.BarCodeStr.Contains("?"))                {                    throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convPosFrom, cs.BarCodeStr));                }            }            if (task == null)            {                string code = TranslationBarCode(cs.BarCodeStr);                task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == code);            }            if (task == null)            {                task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR==convPosFrom && v.TASK_POSIDNEXT==convPosFrom && v.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回);            }            //if (task != null && task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回 && task.TASK_WKSTATUS == 2)            //{            //    int updateResult = SugarBase.DB.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now })            //                                .Where(it => it.TASK_NO == task.TASK_NO)            //                                .ExecuteCommand();            //    if (updateResult <= 0)            //    {            //        throw new Exception(string.Format("异常任务[{0}]结束失败。", task.TASK_NO));            //    }            //    task = null;            //}            return task;        }    }}
 |