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
}
}