using HH.Redis.ReisModel; using HH.WMS.BLL.Basic; using HH.WMS.BLL.External; using HH.WMS.BLL.Interface; using HH.WMS.Common; using HH.WMS.Common.External; using HH.WMS.DAL; using HH.WMS.DAL.Basic; using HH.WMS.DAL.InStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace HH.WMS.BLL.SysMgr { public class TN_WM_TASKBLL : DapperBaseBLL { #region GET public OperateResult GetList(SearchModel searchModel) { StringBuilder sqlWhere = new StringBuilder(); sqlWhere.Append(" WHERE 1=1 "); var stockCode = Util.ToString(searchModel.SearchCondition.CN_S_STOCK_CODE); var taskNo = Util.ToString(searchModel.SearchCondition.CN_S_TASK_NO); var taskType = Util.ToString(searchModel.SearchCondition.CN_S_TASK_TYPE); var trayCode = Util.ToString(searchModel.SearchCondition.CN_S_TRAY_CODE); var state = Util.ToString(searchModel.SearchCondition.CN_S_TASK_STATE); var startArea = Util.ToString(searchModel.SearchCondition.CN_S_START_AREA); var endArea = Util.ToString(searchModel.SearchCondition.CN_S_END_AREA); var startTime = Util.ToString(searchModel.SearchCondition.CN_T_START); var endTime = Util.ToString(searchModel.SearchCondition.CN_T_END); if (!string.IsNullOrEmpty(stockCode)) { sqlWhere.Append(" AND CN_S_STOCK_CODE = '" + stockCode + "'"); } if (!string.IsNullOrEmpty(taskNo)) { sqlWhere.Append(" AND CN_S_TASK_NO = '" + taskNo + "'"); } if (!string.IsNullOrEmpty(taskType)) { sqlWhere.Append(" AND CN_S_TASK_TYPE = '" + taskType + "'"); } if (!string.IsNullOrEmpty(trayCode)) { sqlWhere.Append(" AND CN_S_TRAY_CODE = '" + trayCode + "'"); } if (!string.IsNullOrEmpty(state)) { sqlWhere.Append(" AND CN_S_STATE = '" + state + "'"); } if (!string.IsNullOrEmpty(startArea)) { sqlWhere.Append(" AND CN_S_START_AREA = '" + startArea + "'"); } if (!string.IsNullOrEmpty(endArea)) { sqlWhere.Append(" AND CN_S_END_AREA = '" + endArea + "'"); } if (!string.IsNullOrEmpty(startTime)) { sqlWhere.Append(" AND CN_T_CREATE >= '" + Convert.ToDateTime(startTime.ToString()).ToString("yyyy-MM-dd") + "' "); } if (!string.IsNullOrEmpty(endTime)) { sqlWhere.Append(" AND CN_T_CREATE <= '" + Convert.ToDateTime(endTime).ToString("yyyy-MM-dd") + "' "); } var orderBy = " order by CN_T_CREATE desc"; long total = 0; var dt = CreateDAL().GetList(searchModel.PageIndex, searchModel.PageSize, out total, sqlWhere.ToString(), orderBy); dt.Columns["CN_S_START_AREA"].ReadOnly = false; dt.Columns["CN_S_END_AREA"].ReadOnly = false; foreach (DataRow dr in dt.Rows) { var startAreaEntity = BLLCreator.Create().GetStockAreaEntity(dr["CN_S_START_AREA"].ToString().Trim()); if (startAreaEntity != null) { dr["CN_S_START_AREA"] = startAreaEntity.CN_S_AREA_NAME; } var endAreaEntity = BLLCreator.Create().GetStockAreaEntity(dr["CN_S_END_AREA"].ToString().Trim()); if (endAreaEntity != null) { dr["CN_S_END_AREA"] = endAreaEntity.CN_S_AREA_NAME; } } //IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); //timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; return OperateResult.Succeed(null, new { rows = dt, total = total }); } public List GetTaskByAreaCode(string areaCode) { return DALCreator.Create().GetTaskByAreaCode(areaCode); } public List GetTaskByAreaCodeList(string areaCode) { return DALCreator.Create().GetTaskByAreaCodeList(areaCode); } #endregion #region ADD #endregion #region UPDATE public OperateResult UpdateState(string locationCode, string afterLocationSate, string useState, string beforeLocationState, IDbTransaction trans, LogPara logPara = null) { var result = DALCreator.Create() .UpdateState(locationCode, afterLocationSate, useState, beforeLocationState, trans); if (logPara != null) Log.Detail(logPara, "更新货位" + locationCode + "且状态是" + beforeLocationState + "为:" + afterLocationSate + "," + useState + result.Describe()); return result; } public OperateResult UpdateWay(TN_WM_TASKEntity task, AutoBomLocationEntity locationModel, AutoBomStockAreaEntity locationArea, string type) { var oldLocationCode = type.Equals("start") ? task.CN_S_START_BIT : task.CN_S_END_BIT; return UseTransaction(trans => { //锁定改道后的货位使用状态和锁定状态 if (locationArea.CN_C_IS_CONTROL_QTY.Equals("Y")) CreateDAL().UpdateStateAndTaskNo(task.CN_S_TASK_NO, locationModel.CN_S_LOCATION_CODE, Constants.Location_State_InLock, "", null, ""); if (type.Equals("start")) { //修改任务库区和货位 CreateDAL>().Update(new { CN_S_START_BIT = locationModel.CN_S_LOCATION_CODE, CN_S_START_AREA = locationModel.CN_S_AREA_CODE, CN_C_START_IS_CONTROL_QTY = locationArea.CN_C_IS_CONTROL_QTY, CN_S_START_CONTROL_INV = locationArea.CN_C_IS_INVENTORY, CN_S_TASK_TYPE = "改道" }, new { CN_S_TASK_NO = task.CN_S_TASK_NO }); } else { CreateDAL>().Update(new { CN_S_END_BIT = locationModel.CN_S_LOCATION_CODE, CN_S_END_AREA = locationModel.CN_S_AREA_CODE, CN_C_END_IS_CONTROL_QTY = locationArea.CN_C_IS_CONTROL_QTY, CN_S_END_CONTROL_INV = locationArea.CN_C_IS_INVENTORY, CN_S_TASK_TYPE = "改道" }, new { CN_S_TASK_NO = task.CN_S_TASK_NO }); } //将原来的货位置为正常 CreateDAL>().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_Normal }, new { CN_S_LOCATION_CODE = oldLocationCode }, trans); }); } #endregion #region DELETE #endregion #region 启动任务 /// /// 启动任务 /// /// /// /// [HANHE(dbs)] CREATED BY 2019-3-13 public OperateResult StartTask(string taskNo, RedisUserEntity user) { var model = CreateDAL>().GetSingleEntity(new { CN_S_TASK_NO = taskNo }); if (!model.CN_S_STATE.Equals(Constants.TaskState_NoExecuted)) { return OperateResult.Error("请启动未执行的任务!"); } return CreateDAL>().Update(new { CN_S_MODIFY = user.CN_S_LOGIN, CN_S_MODIFY_BY = user.CN_S_NAME, CN_T_START = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = Constants.TaskState_Executing }, new { CN_S_TASK_NO = taskNo }); } #endregion #region 完成任务 /// /// 完成任务 /// /// /// /// /// [HANHE(dbs)] CREATED BY 2019-3-13 public OperateResult EndTask(string taskNo, RedisUserEntity user) { TN_WM_TASKEntity model = CreateDAL>().GetSingleEntity(new { CN_S_TASK_NO = taskNo }); AutoBomStockAreaEntity startArea = CreateDAL().GetStockAreaEntity(model.CN_S_START_AREA.Trim()); AutoBomStockAreaEntity endArea = CreateDAL().GetStockAreaEntity(model.CN_S_END_AREA.Trim()); //获取上架量=总量-分配量 DataTable trayInventory = CreateDAL().GetTrayInventoryQty(model.CN_S_TRAY_CODE); #region 组装库区增加量 List addAreaQty = new List(); trayInventory.AsEnumerable().ToList().ForEach(x => { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_ITEM_CODE = x.Field("CN_S_ITEM_CODE"), CN_S_ITEM_NAME = x.Field("CN_S_ITEM_NAME"), CN_S_ITEM_STATE = x.Field("CN_S_ITEM_STATE"), CN_S_OWNER = x.Field("CN_S_OWNER"), CN_S_PRODUCTION_BATCH = x.Field("CN_S_PRODUCTION_BATCH"), CN_S_LOT_NO = x.Field("CN_S_LOT_NO"), CN_F_QUANTITY = x.Field("CN_F_QUANTITY"), CN_S_STOCK_CODE = model.CN_S_STOCK_CODE, CN_S_STOCK_AREA = model.CN_S_END_AREA }); }); #endregion #region 组织托盘与货位关系 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = user.CN_S_LOGIN, CN_S_CREATOR_BY = user.CN_S_NAME, CN_S_LOCATION_CODE = model.CN_S_END_BIT, CN_S_STOCK_AREA = model.CN_S_END_AREA, CN_S_STOCK_CODE = model.CN_S_STOCK_CODE, CN_S_TRAY_CODE = model.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; #endregion return UseTransaction(trans => { #region 更新任务状态为“完成” CreateDAL>().Update(new { CN_S_MODIFY = user.CN_S_LOGIN, CN_S_MODIFY_BY = user.CN_S_NAME, CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = Constants.TaskState_Complete }, new { CN_S_TASK_NO = taskNo }, trans); #endregion #region 释放起点、结束点货位 if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) CreateDAL().UnLockTaskStartBit(model.CN_S_TASK_NO, model.CN_S_START_BIT, trans); if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) CreateDAL().UnLockTaskEndBit(model.CN_S_TASK_NO, model.CN_S_END_BIT, trans); #endregion switch (model.CN_S_TASK_TYPE) { case "上架": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); //降低起点库区量 addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = model.CN_S_START_AREA; }); CreateDAL().ReduceAreaQty(addAreaQty, trans); break; case "分拣回": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); //降低起点库区量 addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = model.CN_S_END_AREA; }); CreateDAL().ReduceAreaQty(addAreaQty, trans); break; case "盘点回": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = model.CN_S_END_AREA; }); //降低起点库区量 CreateDAL().ReduceAreaQty(addAreaQty, trans); break; case "入库": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); break; case "分拣出": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); //降低起点库区量 addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = model.CN_S_END_AREA; }); CreateDAL().ReduceAreaQty(addAreaQty, trans); break; case "盘点出": //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, trans); //降低起点库区量 addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = model.CN_S_END_AREA; }); CreateDAL().ReduceAreaQty(addAreaQty, trans); break; case "移库": //ToDo 判断起点库区和终点库区是否一致 break; } //解绑起点货位 if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) CreateDAL>().Delete(new { CN_S_LOCATION_CODE = model.CN_S_START_BIT, CN_S_TRAY_CODE = model.CN_S_TRAY_CODE }, trans); //绑定终点货位与托盘关系 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) CreateDAL>().Add(trayLocation, trans); }); } #endregion #region 上架记录(完成任务) private void UpHistoryByEndTaskQzhk(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var upHis = new List(); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID == null ? "" : trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = "" }); } } } else { upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = "", CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = "", CN_S_ITEM_NAME = "", CN_S_PRODUCTION_BATCH = "", CN_F_QUANTITY = 1,//CN_S_WEIGHT CN_S_MODEL = "", CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = "", CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = "", CN_S_FIGURE_NO = "" }); } //上架记录 if (upHis.Any()) { CreateDAL>().AddRange(upHis, trans); Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); } } #endregion #region 上架记录(完成任务)隆基 private void UpHistoryByEndTaskLJ(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var upHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { var uniqueCode = ""; if (trayItemMst.TrayItemDtlList != null) { if (trayItemMst.TrayItemDtlList.Count > 0) { trayItemMst.TrayItemDtlList.ForEach(e => { uniqueCode += (e.CN_S_UNIQUE_CODE + ","); }); } if (!string.IsNullOrEmpty(uniqueCode)) { uniqueCode = uniqueCode.Substring(0, uniqueCode.Length - 1); } } upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID == null ? "" : trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = uniqueCode }); } //上架记录 if (upHis.Any()) { CreateDAL>().AddRange(upHis, trans); Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); } } #endregion #region 上架记录(完成任务) private void UpHistoryByEndTask(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var upHis = new List(); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var uniqueCode = ""; if (trayItemMst.TrayItemDtlList != null) { if (trayItemMst.TrayItemDtlList.Count > 0) { trayItemMst.TrayItemDtlList.ForEach(e => { uniqueCode += (e.CN_S_UNIQUE_CODE + ","); }); } if (!string.IsNullOrEmpty(uniqueCode)) { uniqueCode = uniqueCode.Substring(0, uniqueCode.Length - 1); } } upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID == null ? "" : trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = uniqueCode }); } } else { upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = "", CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = "", CN_S_ITEM_NAME = "", CN_S_PRODUCTION_BATCH = "", CN_F_QUANTITY = 1,//CN_S_WEIGHT CN_S_MODEL = "", CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = "", CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = "", CN_S_FIGURE_NO = "" }); } //上架记录 if (upHis.Any()) { CreateDAL>().AddRange(upHis, trans); Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); } } #endregion #region 下架记录(完成任务)隆基 private void DownHistoryByEndTaskLJ(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { var uniqueCode = ""; if (trayItemMst.TrayItemDtlList != null) { if (trayItemMst.TrayItemDtlList.Count > 0) { trayItemMst.TrayItemDtlList.ForEach(e => { uniqueCode += (e.CN_S_UNIQUE_CODE + ","); }); //uniqueCode = trayItemMst.TrayItemDtlList.Where(e => e.CN_S_ITEM_CODE.Equals(trayItemMst.CN_S_ITEM_CODE)).FirstOrDefault().CN_S_UNIQUE_CODE; } if (!string.IsNullOrEmpty(uniqueCode)) { uniqueCode = uniqueCode.Substring(0, uniqueCode.Length - 1); } } downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = uniqueCode //executeStatePara.uniqueCodes }); } //下架记录 if (downHis.Any()) { CreateDAL>().AddRange(downHis, trans); Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis)); } } #endregion #region 下架记录(完成任务) private void DownHistoryByEndTask(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var uniqueCode = ""; if (trayItemMst.TrayItemDtlList != null) { if (trayItemMst.TrayItemDtlList.Count > 0) { trayItemMst.TrayItemDtlList.ForEach(e => { uniqueCode += (e.CN_S_UNIQUE_CODE + ","); }); //uniqueCode = trayItemMst.TrayItemDtlList.Where(e => e.CN_S_ITEM_CODE.Equals(trayItemMst.CN_S_ITEM_CODE)).FirstOrDefault().CN_S_UNIQUE_CODE; } if (!string.IsNullOrEmpty(uniqueCode)) { uniqueCode = uniqueCode.Substring(0, uniqueCode.Length - 1); } } downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = uniqueCode //executeStatePara.uniqueCodes }); } } else { downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = "", CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = "", CN_S_ITEM_NAME = "", CN_S_PRODUCTION_BATCH = "", CN_F_QUANTITY = 1,//CN_S_WEIGHT,//.CN_F_QUANTITY, CN_S_MODEL = "", CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = "", CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = "", CN_S_FIGURE_NO = "" }); } //下架记录 if (downHis.Any()) { CreateDAL>().AddRange(downHis, trans); Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis)); } } #endregion #region 根据上架指引组装搬运任务 /// /// 根据上架指引组装搬运任务 /// /// 指引数据 /// 目的位置 /// /// [HANHE(dbs)] CREATED BY 2019-3-13 public List InstallTasks(List lstAllocQuery, string endBit) { List tasks = new List(); List trays = lstAllocQuery.GroupBy(x => x.CN_S_TRAY_CODE).Select(x => x.Key).ToList(); foreach (string m in trays) { string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.TaskNo_Out + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { Log.Info("===>出库任务号生成失败!", ""); return null; } TN_WM_B_TRAY_LOCATIONEntity trayLocationRel = CreateDAL>().GetSingleEntity(new { CN_S_TRAY_CODE = m }); TN_WM_LOCATION_EXTEntity locationModel = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = endBit }); tasks.Add(new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo, CN_N_PRIORITY = 1, CN_S_TASK_TYPE = "指引出库", CN_S_FROM_OP = "出库", CN_S_STOCK_CODE = trayLocationRel.CN_S_STOCK_CODE, CN_S_START_AREA = trayLocationRel.CN_S_STOCK_AREA, CN_S_START_BIT = trayLocationRel.CN_S_LOCATION_CODE, CN_S_END_AREA = locationModel.CN_S_AREA_CODE,//分拣台所在库区 CN_S_END_BIT = locationModel.CN_S_LOCATION_CODE,//分拣台所在位置 CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_TRAY_CODE = m, CN_S_CREATOR = lstAllocQuery[0].CN_S_CREATOR, CN_S_CREATOR_BY = lstAllocQuery[0].CN_S_CREATOR_BY, CN_T_CREATE = DateTime.Now, CN_S_MODIFY = lstAllocQuery[0].CN_S_CREATOR, CN_S_MODIFY_BY = lstAllocQuery[0].CN_S_CREATOR_BY, CN_T_MODIFY = DateTime.Now }); } return tasks; } #endregion #region 创建任务 /// /// 创建任务 /// /// /// /// [HANHE(dbs)] CREATED BY 2019-3-13 public OperateResult CreateTask(TN_WM_TASKEntity task) { return UseTransaction(trans => { //生成任务 CreateDAL>().Add(task, trans); //删除预分配 CreateDAL>().Delete(new { CN_S_TRAY_CODE = task.CN_S_TRAY_CODE }, trans); //锁定货位 CreateDAL>().Update(new { CN_S_LOCATION_STATE = "预入库锁定", CN_S_TASK_NO = task.CN_S_TASK_NO, CN_T_MODIFY = DateTime.Now, CN_S_MODIFY = task.CN_S_CREATOR, CN_S_MODIFY_BY = task.CN_S_CREATOR_BY }, new { CN_S_USE_STATE = "空", CN_S_LOCATION_CODE = task.CN_S_END_BIT }, trans); }); } #endregion #region 取货完成 /// /// 取货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult PickSucc(ExecuteStateParaDto executeStatePara, LogPara logPara) { //if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库")) // return new OperateResult { Success = false, Msg = "当前任务类型为入库,不允许执行取货完成!" }; var locationExt = BLLCreator.Create>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); if (locationExt == null) { return OperateResult.Error("当前任务起点未找到货位扩展记录!"); } return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState); if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); //添加下架记录 DownHistoryByEndTask(executeStatePara, logPara, trans); } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { //删除托盘产品关联 CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans); } //起点是否属于当前任务 if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { if (locationExt.CN_S_LOCATION_STATE.Equals("预出库锁定")) { CreateDAL>().Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "空" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); } //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报取货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } }); } #endregion #region 取货完成 - 隆基 /// /// 取货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult PickSuccLJ(ExecuteStateParaDto executeStatePara, LogPara logPara) { //if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库")) // return new OperateResult { Success = false, Msg = "当前任务类型为入库,不允许执行取货完成!" }; var locationExt = BLLCreator.Create>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); if (locationExt == null) { return OperateResult.Error("当前任务起点未找到货位扩展记录!"); } return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState); if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); //添加下架记录 DownHistoryByEndTaskLJ(executeStatePara, logPara, trans); } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { //删除托盘产品关联 CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans); } //起点是否属于当前任务 if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { if (locationExt.CN_S_LOCATION_STATE.Equals("预出库锁定")) { CreateDAL>().Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "空" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); } //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报取货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } }); } #endregion #region 卸货完成 /// /// 卸货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult UnloadingSucc(ExecuteStateParaDto executeStatePara, RedisUserEntity user, LogPara logPara) { if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) return new OperateResult { Success = false, Msg = "当前任务类型为出库,不允许执行卸货完成!" }; return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { Log.Detail(logPara, "恢复终点货位状态为正常!"); CreateDAL>() .Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "满" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报卸货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.endTrayLocation == null) { if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("改道")) { //添加托盘与货位的关系 CreateDAL>().Add(new TN_WM_B_TRAY_LOCATIONEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_N_INDEX = 0, CN_T_CREATE = DateTime.Now }, trans); //添加上架记录 UpHistoryByEndTask(executeStatePara, logPara, trans); } } }); } #endregion #region 卸货完成 - 隆基 /// /// 卸货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult UnloadingSuccLJ(ExecuteStateParaDto executeStatePara, RedisUserEntity user, LogPara logPara) { if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) return new OperateResult { Success = false, Msg = "当前任务类型为出库,不允许执行卸货完成!" }; return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { Log.Detail(logPara, "恢复终点货位状态为正常!"); CreateDAL>() .Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "满" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报卸货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.endTrayLocation == null) { if (executeStatePara.transportTask.CN_S_EXT2 == "Y") { //添加托盘与货位的关系 CreateDAL>().Add(new TN_WM_B_TRAY_LOCATIONEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_N_INDEX = 0, CN_T_CREATE = DateTime.Now }, trans); //添加上架记录 UpHistoryByEndTaskLJ(executeStatePara, logPara, trans); } } }); } #endregion #region 卸货完成 - 华凯科技 /// /// 卸货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult UnloadingSuccQzhk(ExecuteStateParaDto executeStatePara, RedisUserEntity user, LogPara logPara) { if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("分拣回")) return new OperateResult { Success = false, Msg = "当前任务类型为分拣回,不允许执行卸货完成!" }; var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; Log.Detail(logPara, "UnloadingSuccQzhk-isControlStockQty: " + isControlStockQty); #region 组合量表参数 var addAreaQty = new List(); var addStockQty = new List(); if (isControlStockQty) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,//.CN_S_WEIGHT,//重量 Convert.ToDecimal(trayItemMst.CN_F_INQTY),//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,//CN_S_WEIGHT,//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } Log.Detail(logPara, LogDescribe.Content(addAreaQty)); Log.Detail(logPara, LogDescribe.Content(addStockQty)); } #endregion return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { Log.Detail(logPara, "恢复终点货位状态为正常!"); CreateDAL>() .Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "满" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报卸货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.endTrayLocation == null) { if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("改道")) { //添加托盘与货位的关系 CreateDAL>().Add(new TN_WM_B_TRAY_LOCATIONEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_N_INDEX = 0, CN_T_CREATE = DateTime.Now }, trans); } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //添加上架记录 UpHistoryByEndTaskQzhk(executeStatePara, logPara, trans); //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库库存!"); } } }); } #endregion #region 取消 public OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState); //终点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "预入库锁定", null); //更新终点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库取消", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, null); } } //起点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "预出库锁定", null); //更新起点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报" + executeStatePara.transportTask.CN_S_TASK_TYPE + "取消", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, null); } } }); } #endregion #region 空取 public OperateResult EmptyFetchTask(ExecuteStateParaDto executeStatePara) { return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("调拨")) { if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>() .Update(new { CN_S_LOCATION_STATE = "正常" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库空取", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>() .Update(new { CN_S_LOCATION_STATE = "空取异常" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预出库锁定", "空取异常", "状态回报出库空取", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } }); } #endregion #region 获取正在执行中或者未执行的任务 /// /// 获取正在执行中或者未执行的任务 /// /// /// public List GetTaskByTray(string trayCode) { return CreateDAL().GetTaskByTray(trayCode); } #endregion #region PDA专用 生成任务 /// /// PDA专用 生成任务 /// /// /// /// /// /// /// /// public OperateResult CreateTransTask(string startPosition, string endPosition, string taskPriority, string tranType, string projectCode, RedisUserEntity userEntity) { OperateResult result = new OperateResult(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startPosition + "'"); if (startlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!"); } if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startPosition); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startPosition)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(startPosition); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + endPosition + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endPosition); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", startPosition)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(endPosition); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); 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)) { return OperateResult.Error("任务号生成失败,请检查autobom中是否配置了转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_STATE = Constants.TaskStateList[Constants.TaskExecState_NoExec]; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_TASK_TYPE = tranType; taskEntity.CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE; taskEntity.CN_S_START_BIT = startPosition; taskEntity.CN_S_END_BIT = endPosition; taskEntity.CN_N_PRIORITY = int.Parse(taskPriority); taskEntity.CN_S_PROJECT_CODE = projectCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; result = UseTransaction(trans => { #region 事务 OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } //新增任务 CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { result = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (result.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(endPosition, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 result = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (result.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(startPosition, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } #endregion }); return result; } #endregion #region 改道(起点) public OperateResult UpdateStartWay(string taskNo, string oldLocation, string newLocation, string area, string reasonCode) { return UseTransaction(trans => { //更新任务起点货位 CreateDAL>().Update(new { CN_S_START_BIT = newLocation, CN_S_START_AREA = area }, new { CN_S_TASK_NO = taskNo }, trans); if (string.IsNullOrEmpty(reasonCode)) return; if (reasonCode.Equals("2001")) //处理重入异常 { //更新货位状态 CreateDAL>().Update(new { CN_S_LOCATION_STATE = "重入异常" }, new { CN_S_LOCATION_CODE = oldLocation }, trans); var locationModel = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = oldLocation }); BLLCreator.Create().AddStateChange(oldLocation, "", "重入异常", "因重入异常AMS调用改道接口成功后将原货位设置为重入异常", "AMS", "", taskNo, locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, trans); } }); } #endregion #region 改道(终点) public OperateResult UpdateEndWay(string taskNo, string oldLocation, string newLocation, string area, string reasonCode) { return UseTransaction(trans => { //更新任务起点货位 CreateDAL>().Update(new { CN_S_END_BIT = newLocation, CN_S_START_AREA = area }, new { CN_S_TASK_NO = taskNo }, trans); if (string.IsNullOrEmpty(reasonCode)) return; if (reasonCode.Equals("2001")) //处理重入异常 { //更新货位状态 CreateDAL>().Update(new { CN_S_LOCATION_STATE = "重入异常" }, new { CN_S_LOCATION_CODE = oldLocation }, trans); var locationModel = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = oldLocation }); BLLCreator.Create().AddStateChange(oldLocation, "", "重入异常", "因重入异常AMS调用改道接口成功后将原货位设置为重入异常", "AMS", "", taskNo, locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, trans); } }); } #endregion #region 按条件查询任务 public List GetTask(string sqlWhere) { return DALCreator.Create().GetTask(sqlWhere); } #endregion #region 流转任务下达AMS指令 /// /// 下达任务给AMS /// /// /// /// [Hanhe(DBS)] 2018-5-5 public SqlExecuteResult SendTask(List list, string businessType) { try { string strTrayType = string.Empty; List sendParams = new List(); foreach (TN_WM_TRANSPORT_TASKEntity m in list) { JObject sendParam = new JObject(); sendParam.Add("businessType", businessType); sendParam.Add("whNoFrom", m.CN_S_STOCK_CODE); sendParam.Add("whNoTo", m.CN_S_STOCK_CODE); sendParam.Add("sysName", "WMS"); sendParam.Add("deviceName", "WMS"); sendParam.Add("taskNo", m.CN_S_TASK_NO); sendParam.Add("locationFrom", m.CN_S_START_BIT); sendParam.Add("locationTo", m.CN_S_END_BIT); sendParam.Add("priority", m.CN_N_PRIORITY); sendParam.Add("areaTo", JsonConvert.SerializeObject(m.END_AREAS)); sendParams.Add(sendParam); } return new InfRequest().SendTask(sendParams, ""); } catch (Exception ex) { return new SqlExecuteResult() { Exception = ex }; } } #endregion } }