using Hanhe.iWCS.Business; using HH.AMS.BLL.AdminUI.Task; using HH.AMS.BLL.MongoDB; using HH.AMS.Entitys.AdminUI.AutoBom; using HH.AMS.Entitys.AdminUI.Mongodb; using HH.AMS.Entitys.AdminUI.Task; using HH.AMS.Entitys.Common; using HH.AMS.Ex.Interface; using MongoDB.Driver.Builders; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.AMS.BLL { /// /// WebAPI统一入口 /// public class WebAPICommon { #region 生成单个任务 /// /// 生成单个任务 /// /// 生成任务参数 /// public InfResultEntity AddSingleTask(AddTaskEntity interfacePara) { //定制化模块 IDispatch _IDispatch = HH.AMS.Ex.Factroy.DataAccess.CreateDispatch(); InfResultEntity ier = new InfResultEntity() { success = true, failList=new List() }; //接口验证 ier = _IDispatch.InterfaceVerification(interfacePara); if (!ier.success) { Hanhe.iWCS.Common.CMMLog.Info("接口验证失败:" + ier.errMsg); //验证失败 return ier; } //货位计算 interfacePara = _IDispatch.AutoCalculate(interfacePara); //var eventWhere = Query.And(Query.EQ("CN_S_DEVICE_CODE", interfacePara.deviceName), Query.EQ("CN_S_EXT_PARAM", interfacePara.extParam == null ? "" : interfacePara.extParam)); var eventWhere = Query.EQ("CN_S_DEVICE_CODE", interfacePara.deviceName); MongodbTN_AM_DEVICE_EVENT eventEntity = MongoDBSingleton.Instance.FindOne(eventWhere); //TN_AM_DEVICE_EVENTEntity eventEntity = BLLCreator.Create().GetEntity(interfacePara.deviceName, interfacePara.extParam == null ? "" : interfacePara.extParam); if (eventEntity == null) { ier.success = false; ier.errCode = "1"; ier.errMsg = "未配置相关设备的事件解释!"; return ier; } else if (eventEntity.CN_S_EVENT_TYPE.Equals("自定义")) { #region Debugger100 Mongodb 获取系统对应编码格式 Hanhe.iWCS.Common.CMMLog.Info("Debugger100-1"); var externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.whNoFrom == null ? "" : interfacePara.whNoFrom)); var externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //起始仓库 interfacePara.whNoFrom = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger100-2"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.whNoTo == null ? "" : interfacePara.whNoTo)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //目的仓库 interfacePara.whNoTo = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger100-3"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.locationFrom == null ? "" : interfacePara.locationFrom)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //起始货位 interfacePara.locationFrom = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger100-4"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.locationTo == null ? "" : interfacePara.locationTo)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //目的货位 interfacePara.locationTo = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger100-5"); #endregion string stockCode = string.Empty; var locationInfo = StockInstance.Instance.GetLocationInfo(interfacePara.locationFrom); if (locationInfo != null) stockCode = locationInfo.CN_S_STOCK_CODE; interfacePara.whNoFrom = string.IsNullOrEmpty(interfacePara.whNoFrom) == true ? stockCode : interfacePara.whNoFrom; var where = Query.And(Query.EQ("CN_S_STOCK_CODE", interfacePara.whNoFrom), Query.EQ("CN_S_LOCATION_CODE", interfacePara.locationFrom)); MongoTN_AB_STOCK_LOCATION startModel = MongoDBSingleton.Instance.FindOne(where); Hanhe.iWCS.Common.CMMLog.Info("Debugger100-6"); locationInfo = StockInstance.Instance.GetLocationInfo(interfacePara.locationTo); if (locationInfo != null) stockCode = locationInfo.CN_S_STOCK_CODE; interfacePara.whNoTo = string.IsNullOrEmpty(interfacePara.whNoTo) == true ? stockCode : interfacePara.whNoTo; where = Query.And(Query.EQ("CN_S_STOCK_CODE", interfacePara.whNoTo), Query.EQ("CN_S_LOCATION_CODE", interfacePara.locationTo)); MongoTN_AB_STOCK_LOCATION endModel = MongoDBSingleton.Instance.FindOne(where); Hanhe.iWCS.Common.CMMLog.Info("Debugger100-7"); if (startModel == null || endModel == null) { string s = Newtonsoft.Json.JsonConvert.SerializeObject(eventEntity); ier.success = false; ier.errCode = "1"; ier.errMsg = "无法解释该编码!"; return ier; } //判断同一个货位是否可以重复叫料 where = Query.EQ("CN_S_PARAM_KEY", "OneTask"); MongoTN_AM_CONFIG config = MongoDBSingleton.Instance.FindOne(where); if (config != null && config.CN_S_PARAM_VALUE.Equals("是")) { //优化点,可以直接从Mongodb任务表来判断 where = Query.And(Query.EQ("CN_S_START_AREA", startModel.CN_S_STOCK_CODE), Query.EQ("CN_S_END_AREA", endModel.CN_S_STOCK_CODE), Query.EQ("CN_S_START_BIT", startModel.CN_S_LOCATION_CODE), Query.EQ("CN_S_END_BIT", endModel.CN_S_LOCATION_CODE)); Hanhe.iWCS.Model.TN_I_TASK_MST mongodbMstTask = MongoDBSingleton.Instance.FindOne(where); //if (BLLCreator.Create().IsBitUsing(startModel.CN_S_STOCK_CODE, startModel.CN_S_LOCATION_CODE, endModel.CN_S_STOCK_CODE, endModel.CN_S_LOCATION_CODE)) if (mongodbMstTask != null) { ier.success = false; ier.errCode = "1"; ier.errMsg = "货位被占用!"; return ier; } } //构造主任务模型 TN_AM_TASK_MSTEntity taskEntity = new TN_AM_TASK_MSTEntity() { CN_S_BATCH_NO = interfacePara.batchNo == null ? "" : interfacePara.batchNo, CN_S_ORDER_NO = interfacePara.orderNo, CN_S_BUSS_TYPE = interfacePara.businessType == null ? "叫料" : interfacePara.businessType, CN_S_TASK_TYPE = interfacePara.businessType == null ? "叫料" : interfacePara.businessType, CN_S_SOURCE_SYS = interfacePara.sysName, CN_S_SOURCE_NO = interfacePara.taskNo, CN_S_START_BIT = startModel.CN_S_LOCATION_CODE, CN_N_START_AGVBIT = startModel.CN_N_AGV_LOCATION, CN_S_END_BIT = endModel.CN_S_LOCATION_CODE, CN_N_END_AGVBIT = endModel.CN_N_AGV_LOCATION, CN_N_PRIORITY = interfacePara.priority, CN_S_START_AREA = startModel.CN_S_AREA_CODE, CN_S_END_AREA = endModel.CN_S_AREA_CODE, CN_S_CREATOR = interfacePara.sysName, CN_S_MENDER = interfacePara.sysName, CN_S_CREATOR_NAME = interfacePara.sysName, CN_S_MODIFY_NAME = interfacePara.sysName, CN_S_STATUS = "未执行", CN_S_EXT1 = interfacePara.ext1, CN_S_EXT2 = interfacePara.ext2, CN_S_EXT3 = interfacePara.ext3, CN_S_BEFORE_NO = interfacePara.joinTaskNo, CN_S_TRANSPORT_INFO = interfacePara.transportInfo }; taskEntity.CN_S_TASK_NO = CommonBLL.GenerateBillNoRuleEx("任务编号"); if (string.IsNullOrEmpty(taskEntity.CN_S_TASK_NO)) { taskEntity.CN_S_TASK_NO = DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds.ToString(); } string errInfo = ""; TN_AM_TASK_MSTEntity mstTaskEntity = BLLCreator.Create().GetTaskEntity(taskEntity, out errInfo); if (mstTaskEntity == null) { //未找到路径 string s = Newtonsoft.Json.JsonConvert.SerializeObject(eventEntity); ier.success = false; ier.errCode = "1"; ier.errMsg = errInfo + s; return ier; } else { //上游给的站点是什么就生成什么 mstTaskEntity.CN_S_START_AREA = taskEntity.CN_S_START_AREA; mstTaskEntity.CN_S_START_AREA_NAME = taskEntity.CN_S_START_AREA_NAME; mstTaskEntity.CN_S_START_BIT = taskEntity.CN_S_START_BIT; mstTaskEntity.CN_N_START_AGVBIT = taskEntity.CN_N_START_AGVBIT; mstTaskEntity.CN_S_END_AREA = taskEntity.CN_S_END_AREA; mstTaskEntity.CN_S_END_AREA_NAME = taskEntity.CN_S_END_AREA_NAME; mstTaskEntity.CN_S_END_BIT = taskEntity.CN_S_END_BIT; mstTaskEntity.CN_N_END_AGVBIT = taskEntity.CN_N_END_AGVBIT; foreach (var dtlTask in mstTaskEntity.ChildList) { dtlTask.CN_S_START_AREA = taskEntity.CN_S_START_AREA; dtlTask.CN_S_START_BIT = taskEntity.CN_S_START_BIT; dtlTask.CN_N_START_AGVBIT = taskEntity.CN_N_START_AGVBIT; dtlTask.CN_S_END_AREA = taskEntity.CN_S_END_AREA; dtlTask.CN_S_END_BIT = taskEntity.CN_S_END_BIT; dtlTask.CN_N_END_AGVBIT = taskEntity.CN_N_END_AGVBIT; } mstTaskEntity.CN_S_BEFORE_NO = interfacePara.joinTaskNo; SqlExecuteResult sqlRequest = BLLCreator.Create().AddTaskInfo(mstTaskEntity); if (!sqlRequest.Success) { string s = Newtonsoft.Json.JsonConvert.SerializeObject(eventEntity); ier.success = false; ier.errCode = "1"; ier.errMsg = sqlRequest.Exception.Message + "/" + sqlRequest.Exception.StackTrace + s; return ier; } } } else if (eventEntity.CN_S_EVENT_TYPE.Equals("默认")) { #region Debugger101 Mongodb 获取系统对应编码格式 Hanhe.iWCS.Common.CMMLog.Info("Debugger101-1"); var externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.whNoFrom == null ? "" : interfacePara.whNoFrom)); var externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //起始仓库 interfacePara.whNoFrom = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger101-2"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.whNoTo == null ? "" : interfacePara.whNoTo)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //目的仓库 interfacePara.whNoTo = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger101-3"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.locationFrom == null ? "" : interfacePara.locationFrom)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //起始货位 interfacePara.locationFrom = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger101-4"); externQuery = Query.And(Query.EQ("CN_S_EXTERN_SYSTEM", interfacePara.sysName), Query.EQ("CN_S_EXTERN_SYSTEM_CODE", interfacePara.locationTo == null ? "" : interfacePara.locationTo)); externModel = MongoDBSingleton.Instance.FindOne(externQuery, typeof(Hanhe.iWCS.Model.TN_SYS_EXTERN).Name); if (externModel != null) { //目的货位 interfacePara.locationTo = externModel.CN_S_CONVERT_CODE; } Hanhe.iWCS.Common.CMMLog.Info("Debugger101-5"); #endregion } else { //基础配置 interfacePara.whNoFrom = eventEntity.CN_S_START_STOCK; interfacePara.locationFrom = eventEntity.CN_S_START_BIT; interfacePara.whNoTo = eventEntity.CN_S_END_STOCK; interfacePara.locationTo = eventEntity.CN_S_END_BIT; } if (!eventEntity.CN_S_EVENT_TYPE.Equals("自定义")) { Hanhe.iWCS.Common.CMMLog.Info("Debugger101-6"); string stockCode = string.Empty; var locationInfo = StockInstance.Instance.GetLocationInfo(interfacePara.locationFrom); if (locationInfo != null) stockCode = locationInfo.CN_S_STOCK_CODE; interfacePara.whNoFrom = string.IsNullOrEmpty(interfacePara.whNoFrom) == true ? stockCode : interfacePara.whNoFrom; var where = Query.And(Query.EQ("CN_S_STOCK_CODE", interfacePara.whNoFrom), Query.EQ("CN_S_LOCATION_CODE", interfacePara.locationFrom)); MongoTN_AB_STOCK_LOCATION startModel = MongoDBSingleton.Instance.FindOne(where); Hanhe.iWCS.Common.CMMLog.Info("Debugger101-7"); locationInfo = StockInstance.Instance.GetLocationInfo(interfacePara.locationTo); if (locationInfo != null) stockCode = locationInfo.CN_S_STOCK_CODE; interfacePara.whNoTo = string.IsNullOrEmpty(interfacePara.whNoTo) == true ? stockCode : interfacePara.whNoTo; where = Query.And(Query.EQ("CN_S_STOCK_CODE", interfacePara.whNoTo), Query.EQ("CN_S_LOCATION_CODE", interfacePara.locationTo)); MongoTN_AB_STOCK_LOCATION endModel = MongoDBSingleton.Instance.FindOne(where); Hanhe.iWCS.Common.CMMLog.Info("Debugger101-8"); Hanhe.iWCS.Common.CMMLog.Info("whNoFrom=" + interfacePara.whNoFrom + ";locationFrom=" + interfacePara.locationFrom); Hanhe.iWCS.Common.CMMLog.Info("whNoTo=" + interfacePara.whNoTo + ";locationTo=" + interfacePara.locationTo); if (startModel == null || endModel == null) { //string s = Newtonsoft.Json.JsonConvert.SerializeObject(eventEntity); ier.success = false; ier.errCode = "1"; ier.errMsg = "无法解释该编码!"; } else { TN_AM_TASK_MSTEntity taskEntity = new TN_AM_TASK_MSTEntity() { CN_S_BATCH_NO = interfacePara.batchNo == null ? "" : interfacePara.batchNo, CN_S_ORDER_NO = interfacePara.orderNo, CN_S_BUSS_TYPE = interfacePara.businessType == null ? "叫料" : interfacePara.businessType, CN_S_TASK_TYPE = interfacePara.businessType == null ? "叫料" : interfacePara.businessType, CN_S_SOURCE_SYS = interfacePara.sysName, CN_S_SOURCE_NO = interfacePara.taskNo, CN_S_START_BIT = startModel.CN_S_LOCATION_CODE, CN_N_START_AGVBIT = StockInstance.Instance.GetAGVCodeForBussType(interfacePara.businessType, startModel.CN_S_LOCATION_CODE),// startModel.CN_N_AGV_LOCATION, CN_S_END_BIT = endModel.CN_S_LOCATION_CODE, CN_N_END_AGVBIT = StockInstance.Instance.GetAGVCodeForBussType(interfacePara.businessType, endModel.CN_S_LOCATION_CODE),//endModel.CN_N_AGV_LOCATION, CN_N_PRIORITY = interfacePara.priority, CN_S_START_AREA = startModel.CN_S_STOCK_CODE, CN_S_END_AREA = endModel.CN_S_STOCK_CODE, CN_S_CREATOR = interfacePara.sysName, CN_S_MENDER = interfacePara.sysName, CN_S_CREATOR_NAME = interfacePara.sysName, CN_S_MODIFY_NAME = interfacePara.sysName, CN_S_STATUS = "未执行", CN_S_EXT1 = interfacePara.ext1, CN_S_EXT2 = interfacePara.ext2, CN_S_EXT3 = interfacePara.ext3, CN_S_BEFORE_NO = interfacePara.joinTaskNo, CN_S_TRANSPORT_INFO = interfacePara.transportInfo }; #region 双起点和双终点 if (interfacePara.areaFrom != null && interfacePara.areaFrom.Count == 2) { taskEntity.ChildList.Add(new TN_AM_TASK_DTLEntity() { CN_S_START_BIT = interfacePara.areaFrom[0].areaCode }); taskEntity.ChildList.Add(new TN_AM_TASK_DTLEntity() { CN_S_START_BIT = interfacePara.areaFrom[1].areaCode }); } if (interfacePara.areaFrom != null && interfacePara.areaTo.Count == 2) { taskEntity.ChildList.Add(new TN_AM_TASK_DTLEntity() { CN_S_END_BIT = interfacePara.areaTo[0].areaCode }); taskEntity.ChildList.Add(new TN_AM_TASK_DTLEntity() { CN_S_END_BIT = interfacePara.areaTo[1].areaCode }); } #endregion ResponseResult rr = BLLCreator.Create().EcexuteAdd(taskEntity); Hanhe.iWCS.Common.CMMLog.Info("EcexuteAdd=" + rr.Success); ier.success = rr.Success; if (ier.success) { ier.success = true; ier.errCode = "0"; ier.failList.Add(new Result() { taskNo = rr.amsTaskNo }); } else { ier.success = false; if (string.IsNullOrEmpty(rr.Data)) ier.errCode = "3"; else ier.errCode = rr.Data; ier.errMsg = rr.Message; } } } return ier; } #endregion #region 追加子任务 /// /// 追加子任务 /// /// /// public InfResultEntity AddAppendSubTask(AppendSubTaskViewModel interfacePara) { InfResultEntity ier = new InfResultEntity() { success = true, failList = new List() }; TN_AM_TASK_MSTEntity mstTask = BLLCreator.Create().GetModel(interfacePara.taskNo); //当前工序任务的上一道工序任务 TN_AM_TASK_DTLEntity dtlTask = BLLCreator.Create().GetEntity(interfacePara.taskNo, interfacePara.orderNo - 1); if (dtlTask != null) { dtlTask.CN_N_END_AGVBIT = interfacePara.endAgvBit; dtlTask.CN_N_ORDER = interfacePara.orderNo; dtlTask.CN_N_START_AGVBIT = interfacePara.startAgvBit; dtlTask.CN_S_BEF_STATUS = ""; dtlTask.CN_S_CREATOR = "wcs"; dtlTask.CN_S_CREATOR_NAME = "wcs"; dtlTask.CN_S_END_AREA = interfacePara.endArea; dtlTask.CN_S_END_BIT = interfacePara.endBit; dtlTask.CN_S_EXT1 = interfacePara.ext1; dtlTask.CN_S_EXT2 = interfacePara.ext2; dtlTask.CN_S_MENDER = ""; dtlTask.CN_S_MODIFY_NAME = ""; dtlTask.CN_S_REMARK = ""; dtlTask.CN_S_START_AREA = interfacePara.startArea; dtlTask.CN_S_START_BIT = interfacePara.startBit; dtlTask.CN_S_STARTUP_COND = ""; dtlTask.CN_S_STATUS = "未执行"; dtlTask.CN_S_SUBTASK_NO = interfacePara.taskNo + "_" + interfacePara.orderNo; dtlTask.CN_S_TASK_NO = interfacePara.taskNo; dtlTask.CN_T_CREATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff"); dtlTask.CN_T_END_WORKING = ""; dtlTask.CN_T_MODIFY = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff"); dtlTask.CN_T_START_WORKING = ""; SqlExecuteResult result = BLLCreator.Create().AddAppendSubTask(mstTask, dtlTask); if(result.Success) { ier.errCode = "0"; ier.errMsg = ""; ier.success = true; } else { ier.errCode = "-1"; ier.errMsg = result.Exception.Message; ier.success = false; } } else { ier.errCode = "-1"; ier.success = false; ier.errMsg = "任务异常,无法追加"; } return ier; } #endregion } }