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) { var mapStr = JsonHelper.GetValue("workFlowTransType"); if (string.IsNullOrEmpty(mapStr)) throw new Exception("未找到配置:workFlowTransType"); var isEnableAms = new ZCTransferDto(); var _isEnableAmsStr = JsonHelper.GetValue("isSendAms"); if (!string.IsNullOrEmpty(_isEnableAmsStr)) { isEnableAms = JsonConvert.DeserializeObject(_isEnableAmsStr); isEnableAms = isEnableAms ?? new ZCTransferDto(); } var workFlowTransType = JsonConvert.DeserializeObject>(mapStr); List ors = new List(); if (transportReqs.Any()) { foreach (var req in transportReqs) { string startBit = req.Location_From; string endBit = req.Location_To; string startArea = string.Empty, endArea = string.Empty; //校验起点 if (!string.IsNullOrEmpty(startBit)) { var _location = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = startBit }); if (_location == null) { ors.Add(OperateResult.Error("未找到起始货位:" + startBit, req)); continue; } startArea = Util.ToString(_location.CN_S_AREA_CODE).Trim(); } //校验终点 if (!string.IsNullOrEmpty(endBit)) { var _location = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_LOCATION_CODE = endBit }); if (_location == null) { ors.Add(OperateResult.Error("未找到终点货位:" + endBit, req)); continue; } endArea = Util.ToString(_location.CN_S_AREA_CODE).Trim(); } if (string.IsNullOrEmpty(startArea) && string.IsNullOrEmpty(endArea)) { ors.Add(OperateResult.Error("起点终点不可同时为空")); continue; } //找作业路径 //var workRoute = BLLCreator.Create().GetSingleRoute(startArea, endArea); //if (workRoute == null) //{ // ors.Add(OperateResult.Error("未找到作业路径", req)); // continue; //} var workRoute = new TN_AB_B_WORK_AREA_PROEntity(); var workRoutes = BLLCreator.Create().GetRoute("", startArea, endArea); if (!workRoutes.Any()) { ors.Add(OperateResult.Error("未找到作业路径", req)); continue; } else { workRoute = workRoutes[0]; if (workRoutes.Count > 1) { if (workRoutes.Exists(e => Util.ToString(e.CN_S_TYPE_CODE) == "X6" || Util.ToString(e.CN_S_TYPE_CODE) == "X7")) { if (string.IsNullOrEmpty(req.PROD_NO)) { workRoute = workRoutes.Find(f => f.CN_S_TYPE_CODE == "X6"); } else { workRoute = workRoutes.Find(f => f.CN_S_TYPE_CODE == "X7"); } } } if (workRoute == null) { ors.Add(OperateResult.Error("未找到作业路径", req)); continue; } } var existsWorkFlow = workFlowTransType.Find(f => f.workFlowCode == workRoute.CN_S_TYPE_CODE); if (existsWorkFlow == null) { ors.Add(OperateResult.Error("未找到作业方向", req)); continue; } TN_WM_B_MAKE_TASKEntity makeReq = new TN_WM_B_MAKE_TASKEntity() { CN_S_ITEM_CODE = req.PROD_NO, CN_S_ITEM_NAME = "", CN_S_START_BIT = req.Location_From, CN_S_START_AREA = workRoute.CN_S_START_AREA_CODE, CN_S_END_BIT = req.Location_To, CN_S_END_AREA = workRoute.CN_S_END_AREA_CODE, CN_S_TRAY_CODE = req.TurnCardNum, CN_S_PRIORITY = req.Priority.ToString(), CN_S_WORKFLOW_NAME = WorkFlowName.FlowNameList[existsWorkFlow.workFlowCode], CN_F_QUANTITY = Convert.ToDecimal(req.CURRENT_AMOUNT), CN_S_NEED_AMS = isEnableAms.transferEnableAms, CN_S_ISTRANSPORT = existsWorkFlow.isTransport }; var externalRes = new ExternalResponse(); if (existsWorkFlow.transType == "In") { try { var res = BLLCreator.Create().GLInWorkArea(makeReq); externalRes = JsonConvert.DeserializeObject(res); } catch (Exception ex) { ors.Add(OperateResult.Error("入作业区失败:" + ex.Message, req)); continue; } } else { try { var res = BLLCreator.Create().GLOutWorkArea(makeReq); externalRes = JsonConvert.DeserializeObject(res); } catch (Exception ex) { ors.Add(OperateResult.Error("出作业区失败:" + ex.Message, req)); continue; } } 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 = WorkFlowName.FlowNameList[existsWorkFlow.workFlowCode], 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 = 0,//req.RequestType, CN_S_TRAY_TYPE = "0"//req.LoadType }; } if (!externalRes.success) { //写任务执行表,并回报mes if (externalRes.errCode == "7" || externalRes.errCode == "8") { _serviceExec.CN_C_COMPLETE = Constants.Y; _serviceExec.CN_C_SEND_MES = Constants.Y; _serviceExec.CN_S_MSG = externalRes.errMsg; } else { _serviceExec.CN_C_COMPLETE = Constants.N; _serviceExec.CN_C_SEND_MES = Constants.N; _serviceExec.CN_S_MSG = externalRes.errMsg; } var _or = TransportSuccess(_serviceExec); 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 { if (externalRes.errCode == "7" || externalRes.errCode == "8") { ors.Add(OperateResult.Warning("已反馈至mes,消息: " + externalRes.errMsg, req)); } 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 = "下达成功"; var _or = TransportSuccess(_serviceExec); if (!_or.Success) { ors.Add(OperateResult.Warning("下达成功,更新移送任务日志失败:" + _or.Msg, req)); continue; } ors.Add(OperateResult.Succeed("下达成功", req)); } } Log.DomainInfo("移送任务 结果", JsonConvert.SerializeObject(ors)); } return ors; } #endregion #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)); } private OperateResult TransportSuccess(TN_WM_SERVICE_EXECEntity _serviceExec) { return UseTransaction(trans => { if (_serviceExec.Update) { var or = BLLCreator.CreateDapper().Update(new { CN_S_START_LOCATION = _serviceExec.CN_S_START_LOCATION, CN_S_END_LOCATION = _serviceExec.CN_S_END_LOCATION, CN_C_COMPLETE = _serviceExec.CN_C_COMPLETE, CN_C_SEND_MES = _serviceExec.CN_C_SEND_MES, CN_S_MSG = _serviceExec.CN_S_MSG }, new { CN_S_TASK_NO = _serviceExec.CN_S_TASK_NO }); if (!or.Success) throw new Exception(or.Msg); } else { var or = BLLCreator.CreateDapper().Add(_serviceExec); if (!or.Success) throw new Exception(or.Msg); } }); } #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 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 { //未执行表示第一个任务 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 postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_TransTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; //string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); //if (string.IsNullOrEmpty(taskNo)) // throw new Exception("任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); 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_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_FLAG = task.CN_S_TASK_TYPE == Constants.Out ? Constants.TaskFlag_LG : Constants.TaskFlag_AGV, //CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY, //CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY, //CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV, //CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV, //CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE, //CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_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_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 postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_TransTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; //string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); //if (string.IsNullOrEmpty(taskNo)) // throw new Exception("任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); 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_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_FLAG = task.CN_S_TASK_TYPE == Constants.Out ? Constants.TaskFlag_AGV : Constants.TaskFlag_LG, //CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY, //CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY, //CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV, //CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV, //CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE, //CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_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_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); } } /// /// 遍历中间表,根据业务类型创建WMS任务 /// public void ExecTransferTask() { // 已接收待处理任务 var receiveTasks = BLLCreator.CreateDapper().GetList(new TN_MES_TASK { NeedTrig = "Y" }).OrderBy(t => t.CreateDate).ToList(); List ors = new List(); foreach (var task in receiveTasks) { try { // 从mongo中获取货位相关的信息 - 起始货位 AutoBomLocationEntity start_location = CreateDAL().GetModel(task.Location_From); // 从mongo中获取货位相关的信息 - 终点货位 AutoBomLocationEntity end_location = CreateDAL().GetModel(task.Location_To); // 创建WMS主任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity() { CN_S_TASK_NO = task.task_no, CN_S_TRAY_CODE = task.TurnCardNum, CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_BF_TASK_NO = "", CN_S_AF_TASK_NO = "", CN_S_STOCK_CODE = start_location.CN_S_STOCK_CODE, CN_S_START_AREA = start_location.CN_S_AREA_CODE, CN_S_START_BIT = start_location.CN_S_LOCATION_CODE, CN_S_END_AREA = end_location.CN_S_AREA_CODE, CN_S_END_BIT = end_location.CN_S_LOCATION_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_ZG, }; UseTransaction(trans => { // 增加WMS主任务 OperateResult re = CreateDapperDAL().Add(taskEntity); if (!re.Success) throw new Exception(re.Msg); // 更新TN_MES_TASK状态 CreateDapperDAL().Update(new { NeedTrig = "N" }, new { task_no = task.task_no }, trans); if (!re.Success) throw new Exception(re.Msg); }); ors.Add(OperateResult.Succeed("生成成功")); } catch (Exception ex) { ors.Add(OperateResult.Error(ex.Message)); } Log.DomainInfo("ExecTransferTask", JsonConvert.SerializeObject(ors)); } } } }