using HH.WMS.BLL.Basic; using HH.WMS.BLL.External; using HH.WMS.BLL.Interface; using HH.WMS.BLL.MiddleDB; using HH.WMS.Common; using HH.WMS.Common.External; using HH.WMS.Common.Response; using HH.WMS.DAL.Basic; using HH.WMS.DAL.Pda; using HH.WMS.Entitys; using HH.WMS.Entitys.Autobom; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys.Mes; using HH.WMS.Entitys.External; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.Pda { public class ZCBLL : DapperBaseBLL { #region 保存任务 public OperateResult SaveTask(TN_MES_TASK task) { OperateResult result = BLLCreator.CreateDapper().Add(task); return result; } #endregion #region 根据库区取占用的货位 /// /// 根据库区取占用的货位 /// /// /// public List GetUsedLocationByArea(string areaCode) { return CreateDAL().GetUsedLocationByArea(areaCode); } #endregion #region 移库 /// /// 移库 /// /// public void TransferRubber(string transferType) { string workFlowName = string.Empty; switch (transferType) { case "transferOfFinalRubber": workFlowName = WorkFlowName.FlowNameList["Z3"]; break; case "transferOfRawRubber": workFlowName = WorkFlowName.FlowNameList["S2"]; break; } if (string.IsNullOrEmpty(workFlowName)) TransferRubberThrow(new Exception("未找到移库工作流名称"), workFlowName); var isEnableAms = new GLTransferDto(); var _isEnableAmsStr = JsonHelper.GetValue("isSendAms"); if (!string.IsNullOrEmpty(_isEnableAmsStr)) { isEnableAms = JsonConvert.DeserializeObject(_isEnableAmsStr); isEnableAms = isEnableAms ?? new GLTransferDto(); } try { var mapStr = JsonHelper.GetValue(transferType); if (string.IsNullOrEmpty(mapStr)) return; var config = JsonConvert.DeserializeObject(mapStr); if (IsWorkTime(config)) { var usedLocations = BLLCreator.Create().GetUsedLocationByArea(config.endArea); if (usedLocations.Count < config.transferMax) { mapStr = JsonHelper.GetValue("workFlowTransType"); if (string.IsNullOrEmpty(mapStr)) return; var workFlowTransType = JsonConvert.DeserializeObject>(mapStr); var existsWorkFlow = workFlowTransType.Find(f => f.workFlowName == workFlowName); if (existsWorkFlow == null) { TransferRubberThrow(new Exception("未找到移库方向"), workFlowName); } TN_WM_B_MAKE_TASKEntity makeReq = new TN_WM_B_MAKE_TASKEntity() { CN_S_START_AREA = config.startArea, CN_S_END_AREA = config.endArea, CN_S_ITEM_CODE = config.itemCode, CN_S_NEED_AMS = Constants.Y, CN_S_WORKFLOW_NAME = workFlowName, CN_S_ISTRANSPORT = isEnableAms.moveStockEnableAms, //CN_F_QUANTITY = 1 }; var externalRes = new ExternalResponse(); if (existsWorkFlow.transType == "In") { try { var res = BLLCreator.Create().GLInWorkArea(makeReq); externalRes = JsonConvert.DeserializeObject(res); } catch (Exception ex) { TransferRubberThrow(ex, workFlowName); } } else { try { var res = BLLCreator.Create().GLOutWorkArea(makeReq); externalRes = JsonConvert.DeserializeObject(res); } catch (Exception ex) { TransferRubberThrow(ex, workFlowName); } } if (!externalRes.success) { TransferRubberThrow(new Exception(externalRes.errMsg), workFlowName); } else//成功的话写移库记录 { var ok = externalRes.okList[0]; AGV_Transfer_record _log = new AGV_Transfer_record() { ID = Guid.NewGuid().ToString(), LoadNo = ok.trayCode, MaterielCode = config.itemCode, MaterielName = config.itemName, Quantity = 1, LocationName_Source = ok.startBit, LocationName_Dest = ok.endBit, CreateDate = DateTime.Now, HasBeenReceived = Constants.Y }; var _or = BLLCreator.CreateMiddleDapper().Add(_log); if (!_or.Success) { TransferRubberThrow(new Exception("下达成功,写入移库记录失败:" + _or.Msg), workFlowName); //throw new Exception("下达成功,写入移库记录失败:" + _or.Msg); //ors.Add(OperateResult.Succeed("下达成功,写入移送任务日志失败:" + _or.Msg, req)); } var _serviceExec = new TN_WM_SERVICE_EXECEntity() { CN_S_TASK_NO = Guid.NewGuid().ToString(), CN_S_ITEM_CODE = config.itemCode, CN_S_ITEM_NAME = config.itemName, CN_S_TASK_TYPE = "移库", CN_S_TRANS_TYPE = workFlowName, CN_S_TRAY_CODE = ok.trayCode, CN_N_PRIORITY = 1, CN_S_START_LOCATION = ok.startBit, CN_S_END_LOCATION = ok.endBit, CN_T_CREATE = DateTime.Now, CN_C_COMPLETE = Constants.Y, CN_C_SEND_MES = Constants.Y, CN_S_MSG = "下达成功" }; var or = BLLCreator.CreateDapper().Add(_serviceExec); if (!or.Success) throw new Exception(or.Msg); Log.DomainInfo(workFlowName + "移库成功", JsonConvert.SerializeObject(externalRes)); } } } } catch (Exception ex) { Log.DomainInfo(workFlowName + " Error", ex.Message); } } #endregion #region 移库异常记录 /// /// 移库异常记录 /// /// private void TransferRubberThrow(Exception ex, string workFlowName) { var lastServiceExec = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_TASK_TYPE = "移库", CN_S_TRANS_TYPE = workFlowName, }, " ORDER BY CN_T_CREATE DESC "); if (lastServiceExec != null && ex.Message == lastServiceExec.CN_S_MSG) { BLLCreator.CreateDapper().Update(new { CN_T_CREATE = DateTime.Now }, new { CN_S_TASK_NO = lastServiceExec.CN_S_TASK_NO }); throw ex; } TN_WM_SERVICE_EXECEntity serviceExec = new TN_WM_SERVICE_EXECEntity() { CN_S_TASK_NO = Guid.NewGuid().ToString(), CN_S_TASK_TYPE = "移库", CN_S_TRANS_TYPE = workFlowName, CN_T_CREATE = DateTime.Now, CN_C_COMPLETE = Constants.Y, CN_C_SEND_MES = Constants.N, CN_S_MSG = ex.Message }; var or = BLLCreator.CreateDapper().Add(serviceExec); if (!or.Success) throw new Exception(or.Msg); throw ex; } #endregion #region 移送任务 /// /// 移送任务 /// /// public List ExecTransferTask(List transportReqs) { List ors = new List(); if (transportReqs.Any()) { var xbqBitStr = JsonHelper.GetValue("xbqBit"); if (string.IsNullOrEmpty(xbqBitStr)) throw new Exception("未找到配置:xbqBit"); var xbqBits = JsonConvert.DeserializeObject>(xbqBitStr); foreach (var req in transportReqs) { string startBit = req.Location_From; string endBit = req.Location_To; string startArea = string.Empty, endArea = string.Empty; try { InWorkAreaEntity inModel = new InWorkAreaEntity(); inModel.itemCode = req.PROD_NO; inModel.trayCode = req.TurnCardNum; inModel.priority = req.Priority; inModel.startBit = req.Location_From; inModel.endBit = req.Location_To; inModel.remark = "业务类型:" + req.BUSI_TYPE; OutWorkAreaEntity outModel = new OutWorkAreaEntity(); outModel.itemCode = req.PROD_NO; outModel.trayCode = req.TurnCardNum; outModel.priority = req.Priority; outModel.startBit = req.Location_From; outModel.endBit = req.Location_To; outModel.remark = "业务类型:" + req.BUSI_TYPE; // 下一步要执行的阶段 string section = NextSection(req); bool needCreateTask = true; string direction = ""; if (section == TaskSectionConstants.ERROR) { // "执行失败,MES任务业务类型或阶段不正确" needCreateTask = false; } else if (string.IsNullOrEmpty(section)) { needCreateTask = false; } else if (section == TaskSectionConstants.BCP_KTCK) { // 出库 direction = Constants.Out; // 入库任务的起点是满托位,查找其相邻的空托位 var ktBit = xbqBits.FirstOrDefault(bit => bit.mtBit == inModel.startBit); if (ktBit == null) { Log.Error("查找线边区空托点失败", ",空托点=null,入库任务的线边区满托点:" + inModel.startBit); ors.Add(OperateResult.Error("查找线边区空托点失败" + ",空托点=null,入库任务的线边区满托点:" + inModel.startBit, req)); continue; } // 修改出库任务的终点为空托位 outModel.endBit = ktBit.ktBit; outModel.startBit = ""; outModel.remark += ",半成品空托出库"; } else if (section == TaskSectionConstants.BCP_MTRK) { direction = Constants.In; } else if (section == TaskSectionConstants.CXJ_BCPHK) { direction = Constants.In; } else if (section == TaskSectionConstants.CXJ_KTHK_RECORD) { needCreateTask = false; } else if (section == TaskSectionConstants.CXJ_MTCK) { direction = Constants.Out; } else if (section == TaskSectionConstants.CXJ_KTHK_KTRK) { direction = Constants.In; } else if (section == TaskSectionConstants.DS_BCPKTHK) { direction = Constants.In; } else if (section == TaskSectionConstants.DS_MTCK) { direction = Constants.Out; } // 更新MES任务阶段 req.SECTION = section; var externalRes = new ExternalResponse(); string taskNo = ""; if (needCreateTask) { if (direction == Constants.In) { //传递参数 List inWorkAreaEntitys = new List(); inWorkAreaEntitys.Add(inModel); try { Log.Info("入作业区开始,传参:", JsonConvert.SerializeObject(inWorkAreaEntitys)); externalRes = BLLCreator.Create().InWorkArea(inWorkAreaEntitys); if (!externalRes.success) { Log.Error("入作业区失败,传参:", JsonConvert.SerializeObject(inWorkAreaEntitys) + externalRes.errMsg); ors.Add(OperateResult.Error("入作业区失败:" + externalRes.errMsg, req)); continue; } taskNo = inModel.taskNo; } catch (Exception ex) { Log.Error("入作业区失败,传参:", JsonConvert.SerializeObject(inWorkAreaEntitys) + ex.ToString()); ors.Add(OperateResult.Error("入作业区失败:" + ex.Message, req)); continue; } } else if (direction == Constants.Out) { //传递参数 List outWorkAreaEntitys = new List(); outWorkAreaEntitys.Add(outModel); try { Log.Info("出作业区开始,传参:", JsonConvert.SerializeObject(outWorkAreaEntitys)); externalRes = BLLCreator.Create().OutWorkArea(outWorkAreaEntitys); if (!externalRes.success) { Log.Error("出作业区失败,传参:", JsonConvert.SerializeObject(outWorkAreaEntitys) + externalRes.errMsg); ors.Add(OperateResult.Error("出作业区失败:" + externalRes.errMsg, req)); continue; } taskNo = outModel.taskNo; } catch (Exception ex) { Log.Error("出作业区失败,传参:", JsonConvert.SerializeObject(outWorkAreaEntitys) + ex.ToString()); ors.Add(OperateResult.Error("出作业区失败:" + ex.Message, req)); continue; } } else { ors.Add(OperateResult.Error("未知的出入库类型:" + direction, req)); continue; } } else { // 不需要创建wms任务的执行流程,标识为成功 externalRes.success = true; } var _serviceExec = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_TASK_NO = req.task_no }); if (_serviceExec != null) { _serviceExec.Update = true; } else { _serviceExec = new TN_WM_SERVICE_EXECEntity() { CN_S_TASK_NO = req.task_no, CN_S_ITEM_CODE = req.PROD_NO, CN_S_ITEM_NAME = "", CN_S_TASK_TYPE = "移送", CN_S_TRANS_TYPE = req.BUSI_TYPE_NAME, CN_S_TRAY_CODE = req.TurnCardNum, CN_N_PRIORITY = req.Priority, CN_S_START_LOCATION = req.Location_From, CN_S_END_LOCATION = req.Location_To, CN_T_CREATE = DateTime.Now, CN_C_COMPLETE = Constants.N, CN_C_SEND_MES = Constants.N, CN_F_QUANTITY = Convert.ToDecimal(req.CURRENT_AMOUNT), CN_N_REQUEST_TYPE = null, CN_S_TRAY_TYPE = "" }; } if (!externalRes.success) { _serviceExec.CN_C_COMPLETE = Constants.N; _serviceExec.CN_C_SEND_MES = Constants.N; _serviceExec.CN_S_MSG = externalRes.errMsg; var _or = BLLCreator.Create().TransportSuccess(req, _serviceExec, taskNo); if (!_or.Success) { Log.DomainInfo("TransportSuccess error", _or.Msg); Log.DomainInfo("externalRes Error: " + externalRes.errMsg, JsonConvert.SerializeObject(req)); ors.Add(OperateResult.Error("TransportSuccess error", _or.Msg)); } else { ors.Add(OperateResult.Error("externalRes Error: " + externalRes.errMsg, req)); } } else { var ok = externalRes.okList[0]; _serviceExec.CN_S_START_LOCATION = ok.startBit; _serviceExec.CN_S_END_LOCATION = ok.endBit; _serviceExec.CN_C_COMPLETE = Constants.Y; _serviceExec.CN_C_SEND_MES = Constants.Y; _serviceExec.CN_S_MSG = "下达成功"; req.Data_status = req.SECTION == TaskSectionConstants.COMPLETE ? 2 : 1; req.NeedTrig = Constants.N; req.SECTION = section; var _or = BLLCreator.Create().TransportSuccess(req, _serviceExec, taskNo); if (!_or.Success) { ors.Add(OperateResult.Warning("下达成功,更新移送任务日志失败:" + _or.Msg, req)); continue; } ors.Add(OperateResult.Succeed("下达成功", req)); } Log.DomainInfo("移送任务 结果", JsonConvert.SerializeObject(ors)); } catch (Exception ex) { ors.Add(OperateResult.Error("移送任务失败:" + ex.Message, req)); continue; } } Log.DomainInfo("移送任务 结果", JsonConvert.SerializeObject(ors)); } return ors; } #endregion public string NextSection(TN_MES_TASK task) { if (task.BUSI_TYPE == "1") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.BCP_KTCK; else if (task.SECTION == TaskSectionConstants.BCP_KTCK) return TaskSectionConstants.BCP_MTRK; else if (task.SECTION == TaskSectionConstants.BCP_MTRK) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else if (task.BUSI_TYPE == "2") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.CXJ_BCPHK; else if (task.SECTION == TaskSectionConstants.CXJ_BCPHK) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else if (task.BUSI_TYPE == "3") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.CXJ_KTHK_RECORD; else if (task.SECTION == TaskSectionConstants.CXJ_KTHK_RECORD) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else if (task.BUSI_TYPE == "4") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.CXJ_MTCK; else if (task.SECTION == TaskSectionConstants.CXJ_MTCK) return TaskSectionConstants.CXJ_KTHK_KTRK; else if (task.SECTION == TaskSectionConstants.CXJ_KTHK_KTRK) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else if (task.BUSI_TYPE == "5") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.DS_BCPKTHK; else if (task.SECTION == TaskSectionConstants.DS_BCPKTHK) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else if (task.BUSI_TYPE == "6") { if (string.IsNullOrEmpty(task.SECTION)) return TaskSectionConstants.DS_MTCK; else if (task.SECTION == TaskSectionConstants.DS_MTCK) return TaskSectionConstants.COMPLETE; else return TaskSectionConstants.ERROR; } else { return TaskSectionConstants.ERROR; } } #region 判断是否在工作时间 /// /// 判断是否在工作时间 /// /// /// private bool IsWorkTime(GLTransferDto config) { try { TimeSpan dspWorkingDayAM = config.startTime.TimeOfDay; TimeSpan dspWorkingDayPM = config.endTime.TimeOfDay; TimeSpan dspNow = DateTime.Now.TimeOfDay; if (dspNow >= dspWorkingDayAM && dspNow <= dspWorkingDayPM) { return true; } return false; } catch { return false; } } #endregion /// /// 入作业区 /// /// /// public string GLInWorkArea(TN_WM_B_MAKE_TASKEntity entity) { ExternalResponse result = new ExternalResponse(); try { Log.Info("处理位置信息开始:", JsonConvert.SerializeObject(entity)); //处理位置信息 CheckPosition(ref entity); Log.Info("处理位置信息结束:", JsonConvert.SerializeObject(entity)); //传递参数 List inWorkAreaEntitys = new List(); InWorkAreaEntity model = new InWorkAreaEntity(); model.itemCode = entity.CN_S_ITEM_CODE; model.trayCode = entity.CN_S_TRAY_CODE; model.priority = Convert.ToInt32(entity.CN_S_PRIORITY); model.startBit = entity.CN_S_START_BIT; model.startArea = entity.CN_S_START_AREA; model.startStock = entity.CN_S_START_STOCK; model.endBit = entity.CN_S_END_BIT; model.endArea = entity.CN_S_END_AREA; model.endStock = entity.CN_S_END_STOCK; model.remark = entity.CN_S_WORKFLOW_NAME; model.isBackItem = ""; model.needCreateAMSTask = entity.CN_S_NEED_AMS; //标记是否是退回物料(生胶、小料、母胶、终炼胶小盘料退回,余料格栅车退回,余料帘布退回) string workFlowName = entity.CN_S_WORKFLOW_NAME; if (workFlowName == WorkFlowName.FlowNameList["S5"] || workFlowName == WorkFlowName.FlowNameList["X7"] || workFlowName == WorkFlowName.FlowNameList["M5"] || workFlowName == WorkFlowName.FlowNameList["Z6"] || workFlowName == WorkFlowName.FlowNameList["T5"] || workFlowName == WorkFlowName.FlowNameList["L5"]) { model.isBackItem = Constants.Y; } List keyList = (from q in WorkFlowName.FlowNameList where q.Value == entity.CN_S_WORKFLOW_NAME select q.Key).ToList(); //get all keys var funcName = WorkFlowName.FlowNameList.FirstOrDefault(q => q.Value == entity.CN_S_WORKFLOW_NAME).Key; if (funcName != "" && funcName != null) { model.funCode = funcName; } //物料编码不为空时 才组织Data if (!string.IsNullOrEmpty(entity.CN_S_ITEM_CODE)) { var item = BLLCreator.Create().GetItem(entity.CN_S_ITEM_CODE); List DataList = new List(); DataList.Add(new ChaoYangItemDataEntity { itemCode = entity.CN_S_ITEM_CODE, qty = Convert.ToInt32(entity.CN_F_QUANTITY), itemModel = item == null ? "" : item.CN_S_MODEL, itemPackUnit = item == null ? "" : item.CN_S_MEASURE_UNIT, itemName = item == null ? "" : item.CN_S_ITEM_NAME, itemState = "合格" }); model.data = DataList; } inWorkAreaEntitys.Add(model); Log.Info("开始进入入库,传参:", JsonConvert.SerializeObject(inWorkAreaEntitys)); result = BLLCreator.Create().InWorkArea(inWorkAreaEntitys); return JsonConvert.SerializeObject(result); } catch (Exception ex) { result.errCode = "5";//程序异常 result.errMsg = ex.Message;//程序异常 Log.DomainInfo(entity.CN_S_WORKFLOW_NAME + ": InError", ex.Message); return JsonConvert.SerializeObject(result); } } /// /// 出作业区 /// /// /// public string GLOutWorkArea(TN_WM_B_MAKE_TASKEntity entity) { ExternalResponse result = new ExternalResponse(); try { Log.Info("处理位置信息开始:", JsonConvert.SerializeObject(entity)); //处理位置信息 CheckPosition(ref entity); Log.Info("处理位置信息结束:", JsonConvert.SerializeObject(entity)); //传递参数 List outWorkAreaEntitys = new List(); List DataList = new List(); //物料编码不为空时 才组织Data if (!string.IsNullOrEmpty(entity.CN_S_ITEM_CODE)) { DataList.Add(new OutWorkDataEntity { ItemCode = entity.CN_S_ITEM_CODE, TrayCode = entity.CN_S_TRAY_CODE, UnitQty = Convert.ToInt32(entity.CN_F_QUANTITY) }); } string funCode = ""; List keyList = (from q in WorkFlowName.FlowNameList where q.Value == entity.CN_S_WORKFLOW_NAME select q.Key).ToList(); //get all keys var funcName = WorkFlowName.FlowNameList.FirstOrDefault(q => q.Value == entity.CN_S_WORKFLOW_NAME).Key; if (funcName != "" && funcName != null) { funCode = funcName; } outWorkAreaEntitys.Add(new OutWorkAreaEntity() { itemCode = entity.CN_S_ITEM_CODE, trayCode = entity.CN_S_TRAY_CODE, priority = Convert.ToInt32(entity.CN_S_PRIORITY), startBit = entity.CN_S_START_BIT, startArea = entity.CN_S_START_AREA, startStock = entity.CN_S_START_STOCK, endBit = entity.CN_S_END_BIT, endArea = entity.CN_S_END_AREA, endStock = entity.CN_S_END_STOCK, remark = entity.CN_S_WORKFLOW_NAME, Data = DataList, needCreateAMSTask = entity.CN_S_NEED_AMS, IsTransport = entity.CN_S_ISTRANSPORT, funCode = string.IsNullOrEmpty(funCode) ? "" : funCode }); Log.Info("开始进入出库,传参:", JsonConvert.SerializeObject(entity)); result = BLLCreator.Create().OutWorkArea(outWorkAreaEntitys); return JsonConvert.SerializeObject(result); } catch (Exception ex) { result.errCode = "5";//程序异常 result.errMsg = ex.Message;//程序异常 Log.DomainInfo(entity.CN_S_WORKFLOW_NAME + ": OutError", ex.Message); return JsonConvert.SerializeObject(result); } } /// /// 处理位置信息 /// /// private void CheckPosition(ref TN_WM_B_MAKE_TASKEntity entity) { //防止传了起始位置,没传起始库区 if (!string.IsNullOrEmpty(entity.CN_S_START_BIT)) { TN_WM_LOCATION_EXTEntity locationModel = BLL.BLLCreator.Create().GetExtModel(" WHERE CN_S_LOCATION_CODE='" + entity.CN_S_START_BIT + "' "); if (locationModel != null) { entity.CN_S_START_AREA = locationModel.CN_S_AREA_CODE.Trim(); entity.CN_S_START_STOCK = locationModel.CN_S_STOCK_CODE.Trim(); } } //防止传了目的位置,没传目的库区 if (!string.IsNullOrEmpty(entity.CN_S_END_BIT)) { TN_WM_LOCATION_EXTEntity locationModel = BLL.BLLCreator.Create().GetExtModel(" WHERE CN_S_LOCATION_CODE='" + entity.CN_S_END_BIT + "' "); if (locationModel != null) { entity.CN_S_END_AREA = locationModel.CN_S_AREA_CODE.Trim(); entity.CN_S_END_STOCK = locationModel.CN_S_STOCK_CODE.Trim(); } } Log.Info("处理位置信息位置一:", JsonConvert.SerializeObject(entity)); if (string.IsNullOrEmpty(entity.CN_S_START_AREA) || string.IsNullOrEmpty(entity.CN_S_END_AREA)) { //找作业路径 var workRoute = BLLCreator.Create().GetSingleRoute(entity.CN_S_START_AREA, entity.CN_S_END_AREA); if (workRoute == null) { throw new Exception("失败,未找到作业路径!"); } if (string.IsNullOrEmpty(entity.CN_S_START_AREA)) { entity.CN_S_START_AREA = workRoute.CN_S_START_AREA_CODE; } if (string.IsNullOrEmpty(entity.CN_S_END_AREA)) { entity.CN_S_END_AREA = workRoute.CN_S_END_AREA_CODE; } } Log.Info("处理位置信息位置二:", JsonConvert.SerializeObject(entity)); var SareaEntity = BLLCreator.Create().GetStockAreaEntity(entity.CN_S_START_AREA.Trim()); if (SareaEntity != null) entity.CN_S_START_STOCK = SareaEntity.CN_S_STOCK_CODE; var EareaEntity = BLLCreator.Create().GetStockAreaEntity(entity.CN_S_END_AREA.Trim()); if (EareaEntity != null) entity.CN_S_END_STOCK = EareaEntity.CN_S_STOCK_CODE; Log.Info("处理位置信息位置三:", JsonConvert.SerializeObject(entity)); } #region 服务执行记录日志分页 /// /// 服务执行记录日志分页 /// /// /// public OperateResult GetServiceExecList(SearchModel sm) { return CreateDAL().GetServiceExecList(sm); } #endregion public void SelfManageTask() { try { //取未执行的自管任务 var tasks = BLLCreator.CreateDapper().GetList(new { CN_S_TASK_FLAG = Constants.TaskFlag_ZG, CN_S_STATE = new List() { Constants.TaskState_NoExecuted, Constants.TaskState_CompleteHalf } }); var mes_tasks = BLLCreator.CreateDapper().GetList(new { task_no = tasks.ConvertAll(t => t.CN_S_EXT1).ToList() }); var connectBitStr = JsonHelper.GetValue("connectBit"); if (string.IsNullOrEmpty(connectBitStr)) throw new Exception("未找到配置:connectBit"); var connectBits = JsonConvert.DeserializeObject>(connectBitStr); List ors = new List(); foreach (var task in tasks) { try { var mes_task = mes_tasks.FirstOrDefault(t => t.task_no == task.CN_S_EXT1); if (mes_task == null) { ors.Add(OperateResult.Error("从TN_MES_TASK表中未找到此任务的来源MES任务,任务编号:" + task.CN_S_TASK_NO)); continue; } // 出库主任务是同时下两条子任务 if (mes_task.SECTION == TaskSectionConstants.BCP_KTCK || mes_task.SECTION == TaskSectionConstants.CXJ_MTCK || mes_task.SECTION == TaskSectionConstants.DS_MTCK) { string tasktype = mes_task.SECTION == TaskSectionConstants.BCP_KTCK ? ConnectBitConstants.KTCK : mes_task.SECTION == TaskSectionConstants.CXJ_MTCK ? ConnectBitConstants.MTCK : mes_task.SECTION == TaskSectionConstants.DS_MTCK ? ConnectBitConstants.DSCK : ""; //立库货位 string lkBit = task.CN_S_START_BIT; var locationBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = lkBit }); if (locationBit == null) throw new Exception("未找到立库货位:" + lkBit); var _bit = connectBits.Find(f => f.tasktype == tasktype); if (_bit == null) throw new Exception("未找到配置类型为:" + tasktype + "的接驳位"); var connectBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = _bit.bit }); if (connectBit == null) throw new Exception("未找到接驳位货位:" + _bit.bit); if (connectBit.CN_S_LOCATION_STATE != Constants.Location_State_Normal) throw new Exception("接驳位:" + _bit.bit + "存在未执行完的任务"); var readytBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = _bit.readybit }); if (readytBit == null) throw new Exception("未找到准备点货位:" + _bit.bit); if (readytBit.CN_S_LOCATION_STATE != Constants.Location_State_Normal) throw new Exception("准备点:" + _bit.bit + "存在未执行完的任务"); //赋值接驳位 task.CN_S_CONNECT_BIT = _bit.bit; task.CN_S_EXT2 = _bit.readybit; string taskNo1 = task.CN_S_TASK_NO + "_1"; //创建第一个任务 TN_WM_TASKEntity taskEntity1 = new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo1, CN_S_TRAY_CODE = task.CN_S_TRAY_CODE, CN_S_START_BIT = task.CN_S_START_BIT, CN_S_END_BIT = task.CN_S_CONNECT_BIT, CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_BF_TASK_NO = "", CN_S_AF_TASK_NO = "", CN_S_STOCK_CODE = task.CN_S_STOCK_CODE, CN_S_START_AREA = task.CN_S_START_AREA, CN_S_END_AREA = connectBit.CN_S_AREA_CODE, CN_N_PRIORITY = 1, CN_S_CREATOR = "sys", CN_S_CREATOR_BY = "sys", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_REMARK = "", CN_S_TASK_FLAG = Constants.TaskFlag_LG, CN_S_TASK_TYPE = "转运" }; string taskNo2 = task.CN_S_TASK_NO + "_2"; //创建第二个任务 TN_WM_TASKEntity taskEntity2 = new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo2, CN_S_TRAY_CODE = task.CN_S_TRAY_CODE, CN_S_START_BIT = task.CN_S_CONNECT_BIT, CN_S_END_BIT = task.CN_S_END_BIT, CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_BF_TASK_NO = "", CN_S_AF_TASK_NO = "", CN_S_STOCK_CODE = task.CN_S_STOCK_CODE, CN_S_START_AREA = connectBit.CN_S_AREA_CODE, CN_S_END_AREA = task.CN_S_END_AREA, CN_N_PRIORITY = 1, CN_S_CREATOR = "sys", CN_S_CREATOR_BY = "sys", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_REMARK = "", CN_S_TASK_FLAG = Constants.TaskFlag_AGV, CN_S_TASK_TYPE = "转运" }; var or = UseTransaction(trans => { //增加子任务 CreateDapperDAL().Add(taskEntity1, trans); //更新接驳位状态 CreateDapperDAL().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_InLock }, new { CN_S_LOCATION_CODE = taskEntity1.CN_S_END_BIT }, trans); // 更新主任务接驳位 状态置为执行中 记录接驳位和准备点 CreateDapperDAL().Update(new { CN_S_CONNECT_BIT = task.CN_S_CONNECT_BIT, CN_S_EXT1 = task.CN_S_EXT1, CN_S_STATE = Constants.TaskState_Executing }, new { CN_S_TASK_NO = task.CN_S_TASK_NO }, trans); //立库任务 需要调用wcs接口 // 发送Wcs任务 Log.Detail(LogType.LogPara("调用WCS接口执行任务"), "任务信息:" + JsonConvert.SerializeObject(taskEntity1)); OperateResult re = BLLCreator.Create().SendWcsCreateTask(taskEntity1); Log.Detail(LogType.LogPara("调用WCS接口执行任务"), "执行结果:" + JsonConvert.SerializeObject(re)); if (!re.Success) { throw new Exception(re.Msg); } //增加子任务 CreateDapperDAL().Add(taskEntity2, trans); //更新准备点状态 CreateDapperDAL().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock }, new { CN_S_LOCATION_CODE = taskEntity2.CN_S_START_BIT }, trans); //agv任务 re = new OtherSysApi().SendAmsCreateTask(taskEntity2); if (!re.Success) { throw new Exception(re.Msg); } }); if (!or.Success) throw new Exception(or.Msg); } else { //未执行表示第一个任务 if (task.CN_S_STATE == Constants.TaskState_NoExecuted) { //立库货位 string lkBit = string.Empty; //根据任务类型判断立库货位 if (task.CN_S_TASK_TYPE == Constants.Out) { lkBit = task.CN_S_START_BIT; } else if (task.CN_S_TASK_TYPE == Constants.In) { lkBit = task.CN_S_END_BIT; } else { throw new Exception("自管任务任务类型不正确"); } var locationBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = lkBit }); if (locationBit == null) throw new Exception("未找到立库货位:" + lkBit); var _bit = connectBits.Find(f => f.tunnel == Util.ToString(locationBit.CN_S_ROADWAY).Trim()); if (_bit == null) throw new Exception("未找到配置巷道:" + locationBit.CN_S_ROADWAY + "的接驳位"); var connectBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = _bit.bit }); if (connectBit == null) throw new Exception("未找到接驳位货位:" + _bit.bit); if (connectBit.CN_S_LOCATION_STATE != Constants.Location_State_Normal) throw new Exception("接驳位:" + _bit.bit + "存在未执行完的任务"); //赋值接驳位 task.CN_S_CONNECT_BIT = _bit.bit; string taskNo = task.CN_S_TASK_NO + "_1"; //创建第一个任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo, CN_S_TRAY_CODE = task.CN_S_TRAY_CODE, CN_S_START_BIT = task.CN_S_START_BIT, CN_S_END_BIT = task.CN_S_CONNECT_BIT, CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_BF_TASK_NO = "", CN_S_AF_TASK_NO = "", CN_S_STOCK_CODE = task.CN_S_STOCK_CODE, CN_S_START_AREA = task.CN_S_START_AREA, CN_S_END_AREA = connectBit.CN_S_AREA_CODE, CN_N_PRIORITY = 1, CN_S_CREATOR = "sys", CN_S_CREATOR_BY = "sys", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_REMARK = "", CN_S_TASK_FLAG = task.CN_S_TASK_TYPE == Constants.Out ? Constants.TaskFlag_LG : Constants.TaskFlag_AGV, CN_S_TASK_TYPE = "转运" }; var or = UseTransaction(trans => { //增加子任务 CreateDapperDAL().Add(taskEntity, trans); //更新接驳位状态 CreateDapperDAL().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_InLock }, new { CN_S_LOCATION_CODE = taskEntity.CN_S_END_BIT }, trans); // 更新主任务接驳位 状态置为执行中 CreateDapperDAL().Update(new { CN_S_CONNECT_BIT = task.CN_S_CONNECT_BIT, CN_S_STATE = Constants.TaskState_Executing }, new { CN_S_TASK_NO = task.CN_S_TASK_NO }, trans); //立库任务 需要调用wcs接口 if (taskEntity.CN_S_TASK_FLAG == Constants.TaskFlag_LG) { //to do... #region 待测试 //OperateResult re = new OtherSysApi().SendWcsCreateTask(taskEntity, _bit); //if (!re.Success) //{ // throw new Exception(re.Msg); //} #endregion } else//agv任务 { //OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); //if (!re.Success) //{ // throw new Exception(re.Msg); //} } }); if (!or.Success) throw new Exception(or.Msg); } else//执行一半的任务,开始创建第二个任务 { string taskNo = task.CN_S_TASK_NO + "_2"; var connectBit = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = task.CN_S_CONNECT_BIT }); var _bit = connectBits.Find(f => f.tunnel == Util.ToString(connectBit.CN_S_ROADWAY).Trim()); if (_bit == null) throw new Exception("未找到配置巷道:" + connectBit.CN_S_ROADWAY + "的接驳位"); //创建第二个任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo, CN_S_TRAY_CODE = task.CN_S_TRAY_CODE, CN_S_START_BIT = task.CN_S_CONNECT_BIT, CN_S_END_BIT = task.CN_S_END_BIT, CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_BF_TASK_NO = "", CN_S_AF_TASK_NO = "", CN_S_STOCK_CODE = task.CN_S_STOCK_CODE, CN_S_START_AREA = connectBit.CN_S_AREA_CODE, CN_S_END_AREA = task.CN_S_END_AREA, CN_N_PRIORITY = 1, CN_S_CREATOR = "sys", CN_S_CREATOR_BY = "sys", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_REMARK = "", CN_S_TASK_FLAG = task.CN_S_TASK_TYPE == Constants.Out ? Constants.TaskFlag_AGV : Constants.TaskFlag_LG, CN_S_TASK_TYPE = "转运" }; var or = UseTransaction(trans => { //增加子任务 CreateDapperDAL().Add(taskEntity, trans); //更新接驳位状态 CreateDapperDAL().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock }, new { CN_S_LOCATION_CODE = taskEntity.CN_S_START_BIT }, trans); // 更新主任务接驳位 状态置为执行中 CreateDapperDAL().Update(new { CN_S_STATE = Constants.TaskState_Executing }, new { CN_S_TASK_NO = task.CN_S_TASK_NO }, trans); //立库任务 需要调用wcs接口 if (taskEntity.CN_S_TASK_FLAG == Constants.TaskFlag_LG) { //to do... #region 待测试 //OperateResult re = new OtherSysApi().SendWcsCreateTask(taskEntity, _bit); //if (!re.Success) //{ // throw new Exception(re.Msg); //} #endregion } else//agv任务 { //OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); //if (!re.Success) //{ // throw new Exception(re.Msg); //} } }); if (!or.Success) throw new Exception(or.Msg); } } ors.Add(OperateResult.Succeed("生成成功")); } catch (Exception ex) { ors.Add(OperateResult.Error(ex.Message)); } } Log.DomainInfo("SelfManageTask", JsonConvert.SerializeObject(ors)); } catch (Exception ex) { Log.DomainInfo("SelfManageTask Error", ex.Message); } } } /// /// 配置文件中的常量定义 /// public class ConnectBitConstants { /// /// 带束入库 /// public static string DSRK = "带束入库"; /// /// 带束出库 /// public static string DSCK = "带束出库"; /// /// 满托入库 /// public static string MTRK = "满托入库"; /// /// 空托出库 /// public static string KTCK = "空托出库"; /// /// 满托出库 /// public static string MTCK = "满托出库"; /// /// 空托入库 /// public static string KTRK = "空托入库"; } /// /// 任务阶段常量 /// public class TaskSectionConstants { /// /// 任务完成 /// public static string COMPLETE = "任务完成"; public static string ERROR = "执行失败"; #region 半成品 /// /// 半成品-空托出库 /// public static string BCP_KTCK = "半成品-空托出库"; /// /// 半成品-满托入库 /// public static string BCP_MTRK = "半成品-满托入库"; #endregion #region 成型机 /// /// 成型机-半成品回库 /// public static string CXJ_BCPHK = "成型机-半成品回库"; /// /// 成型机-空托回库-记录阶段 /// public static string CXJ_KTHK_RECORD = "成型机-空托回库-记录阶段"; /// /// 成型机-空托回库-入库阶段 /// public static string CXJ_KTHK_KTRK = "成型机-空托回库-入库阶段"; /// /// 成型机-满托出库 /// public static string CXJ_MTCK = "成型机-满托出库"; #endregion #region 带束 /// /// 带束-半成品/空托回库 /// public static string DS_BCPKTHK = "成型机带束-半成品/空托回库"; /// /// 带束-满托出库 /// public static string DS_MTCK = "成型机带束-满托出库"; #endregion } }