using HH.WMS.BLL.Basic; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.External; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.External; 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.Entitys; using HH.WMS.Entitys.External; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.External { /// /// 简易出入库对外提供的接口逻辑处理类 /// public class ExternalBLL : DapperBaseBLL { private static string _className = "ExternalBLL"; #region 入作业区批量 + InWorkArea /// /// 入作业区批量 /// /// /// public ExternalResponse InWorkArea(List inWorkAreaList) { _className += "_InWorkArea"; var response = new ExternalResponse(); if (inWorkAreaList == null) return response.Error(null, "参数不正确!"); for (var i = 0; i < inWorkAreaList.Count; i++) { if (string.IsNullOrEmpty(inWorkAreaList[i].sysName)) { inWorkAreaList[i].sysName = "AMS"; } var result = ExecuteInWorkArea(inWorkAreaList[i], i); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); } else { response.failList.Add(result.TaskExecuteState.Error(i, result.BasisResponse.Message).FailTask); //入库转运锁定起点的,如果执行不成功则解锁 if (result.RollbackLocations.Count > 0) { foreach (string sLocation in result.RollbackLocations) { BLLCreator.Create().UpdateState(sLocation, Constants.Location_State_Normal, ""); AutoBomLocationEntity locationModel = CreateDAL().GetModel(sLocation); BLLCreator.Create().AddStateChange(sLocation, "", "正常", "入库请求失败回滚过程中锁定的货位", inWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } //删除当前托盘的任务 CreateDAL>().Delete(new { CN_S_TRAY_CODE = result.InWorkAreaEntity.trayCode, CN_S_STATE = "未执行" }); } } return response.failList.Any() ? response.Error(null, string.Empty, inWorkAreaList) : response.Ok(null, inWorkAreaList); } #endregion #region 入作业区执行 + ExecuteInWorkArea /// /// 入作业区 /// /// /// 索引 /// private ExecuteInWorkAreaPara ExecuteInWorkArea(InWorkAreaEntity inWorkAreaEntity, int index) { var executeInWorkAreaPara = new ExecuteInWorkAreaPara { InWorkAreaEntity = inWorkAreaEntity }; try { #region 参数验证 executeInWorkAreaPara = ParameterVerifyBLL.VerifyInWorkArea(executeInWorkAreaPara); if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara; #endregion #region 参数处理 executeInWorkAreaPara = ParameterHandleBLL.HandleInWorkArea(executeInWorkAreaPara); if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara; #endregion if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.endBit)) { var endLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeInWorkAreaPara.InWorkAreaEntity.endBit }); if (endLocation == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束货位不正确!"); return executeInWorkAreaPara; } //结束库区实体 var endStockArea = DALCreator.Create().GetAreaModelByLocation(executeInWorkAreaPara.InWorkAreaEntity.startBit.Trim()); if (endStockArea == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前结束位置未找到对应的库区!", _className); return executeInWorkAreaPara; } #region 创建转运任务 executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO = executeInWorkAreaPara.InWorkAreaEntity.taskNo; executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ = "托盘"; executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode; executeInWorkAreaPara.TransportEntity.CN_S_START_BIT = executeInWorkAreaPara.InWorkAreaEntity.startBit; executeInWorkAreaPara.TransportEntity.CN_S_STATE = Constants.TaskStateList[0]; executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY = executeInWorkAreaPara.InWorkAreaEntity.priority; executeInWorkAreaPara.TransportEntity.CN_T_CREATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//DateTime.Now.ToString(); executeInWorkAreaPara.TransportEntity.CN_T_MODIFY = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//DateTime.Now.ToString(); executeInWorkAreaPara.TransportEntity.CN_S_REMARK = executeInWorkAreaPara.InWorkAreaEntity.remark; executeInWorkAreaPara.TransportEntity.CN_S_START_AREA = executeInWorkAreaPara.InWorkAreaEntity.startArea; executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE = executeInWorkAreaPara.InWorkAreaEntity.startStock; executeInWorkAreaPara.TransportEntity.CN_S_TASK_TYPE = executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y" ? "转运" : "入库"; executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE; executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY; executeInWorkAreaPara.TransportEntity.CN_S_START_CONTROL_INV = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY; executeInWorkAreaPara.TransportEntity.CN_S_END_BIT = endLocation.CN_S_LOCATION_CODE; executeInWorkAreaPara.TransportEntity.CN_S_END_AREA = endLocation.CN_S_AREA_CODE; executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY = endStockArea.CN_C_IS_CONTROL_QTY; executeInWorkAreaPara.TransportEntity.CN_S_END_CONTROL_INV = endStockArea.CN_C_IS_INVENTORY; executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE = endStockArea.CN_S_STRUCTURE; #endregion } else { #region 计算转运路径 executeInWorkAreaPara = ExternalInWorkAreaBLL.CalculateTransPath(executeInWorkAreaPara); if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara; #endregion #region 创建转运任务 executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO = executeInWorkAreaPara.InWorkAreaEntity.taskNo; executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ = "托盘"; executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode; executeInWorkAreaPara.TransportEntity.CN_S_START_BIT = executeInWorkAreaPara.InWorkAreaEntity.startBit; executeInWorkAreaPara.TransportEntity.CN_S_STATE = Constants.TaskStateList[0]; executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY = executeInWorkAreaPara.InWorkAreaEntity.priority; executeInWorkAreaPara.TransportEntity.CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture); executeInWorkAreaPara.TransportEntity.CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture); executeInWorkAreaPara.TransportEntity.CN_S_REMARK = executeInWorkAreaPara.InWorkAreaEntity.remark; executeInWorkAreaPara.TransportEntity.CN_S_START_AREA = executeInWorkAreaPara.InWorkAreaEntity.startArea; executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE = executeInWorkAreaPara.InWorkAreaEntity.startStock; executeInWorkAreaPara.TransportEntity.CN_S_TASK_TYPE = executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y" ? "转运" : "入库"; executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE; executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY; executeInWorkAreaPara.TransportEntity.CN_S_START_CONTROL_INV = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY; #endregion #region 算法计算终点货位 executeInWorkAreaPara = ExternalInWorkAreaBLL.InAss(executeInWorkAreaPara); Log.Detail("入作业区", "算法计算终点货位结果:" + JsonConvert.SerializeObject(executeInWorkAreaPara.BasisResponse) + "货位号:" + executeInWorkAreaPara.TransportEntity.CN_S_END_BIT); if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara; #endregion } #region 事务 执行存储过程(处理托盘、托盘产品关联、生成任务、设置任务号、更新货位状态) var result = UseTransaction(trans => { if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { if (executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0) { //删除托盘产品关联 CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans); foreach (var item in executeInWorkAreaPara.InWorkAreaEntity.data) { var trayItemMstGuid = Guid.NewGuid().ToString(); //添加托盘物料关联主表 var transResult = CreateDAL().AddMst(new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = trayItemMstGuid, CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode, CN_S_ITEM_CODE = item.itemCode, CN_S_ITEM_NAME = item.itemName, CN_S_ITEM_STATE = item.itemState == null ? "" : item.itemState, CN_F_QUANTITY = item.qty, CN_S_MEASURE_UNIT = item.itemPackUnit, CN_F_ALLOC_QTY = item.qty, CN_S_MODEL = item.itemModel }, trans); if (!transResult.Success) { trans.Rollback(); return; } //添加托盘物料关联子表 var curResult = CreateDAL().AddDtl(new List() { new TN_WM_B_TRAY_ITEM_DTLEntity{ CN_PARENT_GUID = trayItemMstGuid, CN_S_LOT_NO = item.lotNo, CN_S_UNIQUE_CODE = item.uniqueCode, CN_S_PACKING_UNIT = item.itemPackUnit, CN_F_PACKING_QTY = item.qty, CN_F_QUANTITY = item.qty, CN_T_PRODUCTION = item.productionDate, CN_S_CREATOR = "hh", CN_S_CREATOR_BY = "", CN_T_CREATE = DateTime.Now, CN_GUID = Guid.NewGuid().ToString(), sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' " } }, trans); transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message }; if (!transResult.Success) { trans.Rollback(); return; } } } } var transport = executeInWorkAreaPara.TransportEntity; //创建任务 var operateResult = BLLCreator.Create>().Add(new TN_WM_TASKEntity { CN_S_TASK_NO = transport.CN_S_TASK_NO, CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE, CN_S_START_BIT = transport.CN_S_START_BIT, CN_S_END_BIT = transport.CN_S_END_BIT, //CN_S_PRO_CODE = transport.CN_S_PRO_CODE, CN_S_STATE = transport.CN_S_STATE, CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO, CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO, CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE, CN_S_START_AREA = transport.CN_S_START_AREA, CN_S_END_AREA = transport.CN_S_END_AREA, CN_N_PRIORITY = transport.CN_N_PRIORITY, CN_S_CREATOR = transport.CN_S_CREATOR, CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY, CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE), CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY), CN_S_REMARK = transport.CN_S_REMARK, //CN_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE, 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, CN_S_FROM_OP = "入库/转运" //CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode }); //更新结束点的任务号 if (executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_END_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); } //if (executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("立库")){} //更新起点的任务号 if (executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y")) { CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); } //if (executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE.Equals("立库")){} }); #endregion #region 处理结果 if (!result.Success) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("执行存储过程失败!" + result.Msg, _className); return executeInWorkAreaPara; } if (executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE == Constants.Area_Struc_LiuLiStock || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE == Constants.Area_Struc_DuiDieStock) { executeInWorkAreaPara.TransportEntity.CN_S_END_BIT += "-" + executeInWorkAreaPara.TransportEntity.CN_S_QTY_INDEX; } executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask() { index = index, taskNo = executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, startStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE, startArea = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA, startBit = executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, endStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE, endArea = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA, endBit = executeInWorkAreaPara.TransportEntity.CN_S_END_BIT, priority = executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY, trayCode = executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE, startAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE, endAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE }); #endregion } catch (Exception ex) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } return executeInWorkAreaPara; } #endregion #region 出作业区 + OutWorkArea /// /// 出作业区批量 /// /// /// public ExternalResponse OutWorkArea(List outWorkAreaList) { var response = new ExternalResponse(); if (outWorkAreaList == null) return response.Error(null, "参数不正确!"); for (var i = 0; i < outWorkAreaList.Count; i++) { if (string.IsNullOrEmpty(outWorkAreaList[i].sysName)) { outWorkAreaList[i].sysName = "AMS"; } var result = ExecuteOutWorkArea(outWorkAreaList[i], i); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); } else { response.failList.Add(new TaskExecuteState().Error(i, result.BasisResponse.Message).FailTask); if (result.RollLocations.Count > 0) { foreach (string sLocation in result.RollLocations) { BLLCreator.Create().UpdateState(sLocation, Constants.Location_State_Normal, ""); AutoBomLocationEntity locationModel = CreateDAL().GetModel(sLocation); BLLCreator.Create().AddStateChange(sLocation, "", "正常", "出库请求失败回滚过程中锁定的货位", outWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } } return response.failList.Any() ? response.Error(null, string.Empty, outWorkAreaList) : response.Ok(null, outWorkAreaList); } #endregion #region 出作业区执行 + ExecuteOutWorkArea /// /// 出作业区执行 /// /// /// /// private ExecuteOutWorkAreaPara ExecuteOutWorkArea(OutWorkAreaEntity outWorkAreaEntity, int index) { _className += ".ExecuteOutWorkArea"; var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity }; try { #region 参数验证 executeOutWorkAreaPara = ParameterVerifyBLL.VerifyOutWorkArea(executeOutWorkAreaPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; #endregion #region 参数处理 executeOutWorkAreaPara = ParameterHandleBLL.HandleOutWorkArea(executeOutWorkAreaPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; #endregion #region 算法计算货位 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { executeOutWorkAreaPara = new ExternalOutWorkAreaBLL().CalculateLoaction(executeOutWorkAreaPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; } #endregion #region 事务 执行存储过程() //任务 var transport = executeOutWorkAreaPara.TransportList.FirstOrDefault(); //添加任务 var sqlResult = BLLCreator.Create>().Add(new TN_WM_TASKEntity { CN_S_TASK_NO = transport.CN_S_TASK_NO, CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE, CN_S_START_BIT = transport.CN_S_START_BIT, CN_S_END_BIT = transport.CN_S_END_BIT, //CN_S_PRO_CODE = transport.CN_S_PRO_CODE, CN_S_STATE = transport.CN_S_STATE, CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO, CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO, CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE, CN_S_START_AREA = transport.CN_S_START_AREA, CN_S_END_AREA = transport.CN_S_END_AREA, CN_N_PRIORITY = transport.CN_N_PRIORITY, CN_S_CREATOR = transport.CN_S_CREATOR, CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY, CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE), CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY), CN_S_REMARK = transport.CN_S_REMARK, //CN_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE, 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, //CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode }); //更新起点的任务号 if (transport.CN_S_START_AREA_TYPE.Equals("平库") || transport.CN_S_START_AREA_TYPE.Equals("立库")) { if (transport.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_START_BIT, "", "", transport.CN_S_TASK_NO, null); } } //更新结束点的任务号 if (transport.CN_S_END_AREA_TYPE.Equals("平库") || transport.CN_S_END_AREA_TYPE.Equals("立库")) { if (transport.CN_C_END_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y")) { sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_END_BIT, "", "", transport.CN_S_TASK_NO, null); } } #region 出库影响库存,已注释 ////托盘物料关联数据 //var trayItemMst = CreateDAL().ExecuteQuery(" SELECT * FROM TN_WM_B_TRAY_ITEM_MST WHERE CN_S_TRAY_CODE='" + transport.CN_S_CIR_OBJ_CODE + "' ").FirstOrDefault(); //var trayItemDtl = CreateDAL().ExecuteQuery(" SELECT * FROM TN_WM_B_TRAY_ITEM_DTL ", new { // CN_PARENT_GUID=trayItemMst.CN_GUID //}).FirstOrDefault(); //if (transport.CN_C_START_IS_CONTROL_QTY.Equals("Y") && transport.CN_S_START_CONTROL_INV.Equals("Y")) //{ // //仓库量表 // var stockQtys = CreateDAL().ExecuteQuery(" SELECT * FROM tn_wm_b_stock_qty ", new { // CN_S_STOCK_CODE = trayItemMst.CN_S_STOCK_CODE, // CN_S_ITEM_CODE=trayItemMst.CN_S_ITEM_CODE, // CN_S_ITEM_STATE=trayItemMst.CN_S_ITEM_STATE, // CN_S_LOT_NO=trayItemDtl.CN_S_LOT_NO // }); // if (stockQtys.Count > 0) // { // //升库存 // stockQtys.First().CN_F_ALLOC_QTY += (decimal) trayItemMst.CN_F_PACKING_QTY; // CreateDAL().UpdateStockAllocQty(stockQtys, null); // } // //库区量表 // var areaQtys = CreateDAL().ExecuteQuery(" SELECT * FROM tn_wm_b_stock_qty ", new // { // CN_S_STOCK_CODE = trayItemMst.CN_S_STOCK_CODE, // CN_S_STOCK_AREA = trayItemMst.CN_S_IN_AREA_CODE, // CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, // CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, // CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO // }); // if (areaQtys.Count > 0) // { // //升库存 // areaQtys.First().CN_F_ALLOC_QTY += (decimal)trayItemMst.CN_F_PACKING_QTY; // CreateDAL().UpdateAreaAlloc(areaQtys, null); // } //} #endregion if (!sqlResult.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("执行存储过程失败!" + sqlResult.Msg, _className); return executeOutWorkAreaPara; } #endregion #region 处理结果 executeOutWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(ParameterHandleBLL.HandleOutWorkAreaResponse(executeOutWorkAreaPara.TransportList[0], index), null); #endregion } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("executeOutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } return executeOutWorkAreaPara; } #endregion #region 完工回报 + ExecuteState public OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara) { //TODO 加项目编号 var executeStatePara = new ExecuteStateParaDto(); var result = new OperateResult(); //查询任务 executeStatePara.transportTask = CreateDAL>().GetSingleEntity(new { CN_S_TASK_NO = taskNo }); Log.Detail(logPara, LogDescribe.Content(executeStatePara.transportTask)); //起点货位是否绑定托盘 executeStatePara.startTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //终点货位是否绑定托盘 executeStatePara.endTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //起点货位是否绑定任务 executeStatePara.startIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_TASK_NO = taskNo }); //终点货位是否绑定任务 executeStatePara.endIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_TASK_NO = taskNo }); //托盘物料主表 executeStatePara.trayItemMsts = CreateDAL>().GetList(new { executeStatePara.transportTask.CN_S_TRAY_CODE }); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var item = CreateDAL().GetItemEntity(trayItemMst.CN_S_ITEM_CODE); trayItemMst.CN_F_INQTY = item.CN_F_NW; trayItemMst.CN_S_WEIGHT = trayItemMst.CN_F_QUANTITY;//= item.CN_F_NW; //trayItemMst.CN_F_INQTY = 0; trayItemMst.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }); //foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) //{ // trayItemMst.CN_S_WEIGHT += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO); //} } } //起点库区 executeStatePara.startStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_START_AREA.Trim()); //结束库区 executeStatePara.endStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_END_AREA.Trim()); //任务状态 executeStatePara.taskState = taskState; var t = new Redis.ReisModel.RedisUserEntity(); //完成 if (taskState.Equals(Constants.TaskState_Complete)) { result = BLLCreator.Create().EndTaskForAuto(executeStatePara, logPara); } //取消 else if (taskState.Equals("取消")) { result = BLLCreator.Create().CancelTask(executeStatePara, logPara); } //空取 else if (taskState.Equals("空取")) { result = BLLCreator.Create().EmptyFetchTask(executeStatePara); } //取货完成 else if (taskState.Equals("取货完成")) { result = BLLCreator.Create().PickSucc(executeStatePara); } //卸货完成 else if (taskState.Equals("卸货完成")) { result = BLLCreator.Create().UnloadingSucc(executeStatePara, t, logPara); } return result; } #endregion #region 完工回报(无锡宇寿) + ExecuteState public OperateResult ExecuteStateForWxys(string taskNo, string taskState, LogPara logPara) { //TODO 加项目编号 var executeStatePara = new ExecuteStateParaDto(); var result = new OperateResult(); //查询任务 executeStatePara.transportTask = CreateDAL>().GetSingleEntity(new { CN_S_TASK_NO = taskNo }); Log.Detail(logPara, LogDescribe.Content(executeStatePara.transportTask)); //起点货位是否绑定托盘 executeStatePara.startTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //终点货位是否绑定托盘 executeStatePara.endTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //起点货位是否绑定任务 executeStatePara.startIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_TASK_NO = taskNo }); //终点货位是否绑定任务 executeStatePara.endIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_TASK_NO = taskNo }); //托盘物料主表 executeStatePara.trayItemMsts = CreateDAL>().GetList(new { executeStatePara.transportTask.CN_S_TRAY_CODE }); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var item = CreateDAL().GetItemEntity(trayItemMst.CN_S_ITEM_CODE); trayItemMst.CN_F_INQTY = item.CN_F_NW; trayItemMst.CN_S_WEIGHT = 0;//= item.CN_F_NW; //trayItemMst.CN_F_INQTY = 0; trayItemMst.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }); foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { trayItemMst.CN_S_WEIGHT += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO); } } } Log.Detail(logPara, "托盘物料关联表数据:" + LogDescribe.Content(executeStatePara.trayItemMsts)); //起点库区 executeStatePara.startStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_START_AREA.Trim()); //结束库区 executeStatePara.endStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_END_AREA.Trim()); //任务状态 executeStatePara.taskState = taskState; var t = new Redis.ReisModel.RedisUserEntity(); //完成 if (taskState.Equals(Constants.TaskState_Complete)) { result = BLLCreator.Create().EndTaskForAuto(executeStatePara, logPara); } //取消 else if (taskState.Equals("取消")) { result = BLLCreator.Create().CancelTask(executeStatePara, logPara); } //空取 else if (taskState.Equals("空取")) { result = BLLCreator.Create().EmptyFetchTask(executeStatePara); } //取货完成 else if (taskState.Equals("取货完成")) { result = BLLCreator.Create().PickSucc(executeStatePara); } //卸货完成 else if (taskState.Equals("卸货完成")) { result = BLLCreator.Create().UnloadingSucc(executeStatePara, t, logPara); } return result; } #endregion #region 同步货位状态,货位状态不一致设为异常 /// /// 同步货位状态,货位状态不一致设为异常 /// /// /// /// [HanHe(zh)] CREATED 2018/5/3 public ExternalResponse SynchroLocation(List synchroLocationList) { ExternalResponse result = new ExternalResponse(); if (synchroLocationList == null || synchroLocationList.Count == 0) return result.Error(null, "接受同步货位数据为空!", synchroLocationList); foreach (var item in synchroLocationList) { result = ExecuteSynchroLocation(item); if (!result.success) { return result; } } return result; } public ExternalResponse ExecuteSynchroLocation(SynchroLocationEntity synchroLocationEntity) { ExternalResponse response = new ExternalResponse(); try { AutoBomLocationEntity location = BLLCreator.Create().GetModel(synchroLocationEntity.Location, synchroLocationEntity.StockCode); if (location != null) { //获取库区实体 AutoBomStockAreaEntity stockAreaEntity = CreateDAL().GetEntityByArea(location.CN_S_AREA_CODE); if (stockAreaEntity == null) return response.Error(synchroLocationEntity, "未找到库区"); TN_WM_LOCATION_EXTEntity locationExt = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = synchroLocationEntity.Location, CN_S_STOCK_CODE = synchroLocationEntity.StockCode });// CreateDAL().GetEntityByCode(synchroLocationEntity.Location, synchroLocationEntity.StockCode); if (locationExt == null) return response.Error(synchroLocationEntity, "货位在TN_WM_LOCATION_EXT表中不存在"); //是否没有故障 bool isNotFault = true; switch (synchroLocationEntity.State) { //有货 case 1: isNotFault = locationExt.CN_S_USE_STATE != "空"; break; //无货 case 2: isNotFault = locationExt.CN_S_USE_STATE == "空"; break; //故障 case 3: isNotFault = false; break; } if (!isNotFault) { string updateState = "全部故障"; //switch (synchroLocationEntity.Type) //{ // case 1: // updateState = "入库故障"; // break; // case 2: // updateState = "出库故障"; // break; //} if (locationExt.CN_S_LOCATION_STATE == Constants.Location_State_Normal) { var result = CreateDAL().UpdateLocationState(synchroLocationEntity.Location, updateState, "", null); if (!result.Success) { return response.Error(synchroLocationEntity, result.Exception.Message); } else { AutoBomLocationEntity locationModel = CreateDAL().GetModel(synchroLocationEntity.Location); BLLCreator.Create().AddStateChange(synchroLocationEntity.Location, "正常", updateState, "同步货位状态发现货位存储状态不一致时将货位设置为故障状态", "AMS", "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } else { if (locationExt.CN_S_LOCATION_STATE == Constants.Location_State_AllFault) { var result = CreateDAL().UpdateLocationState(synchroLocationEntity.Location, "正常", "", null); if (!result.Success) { return response.Error(synchroLocationEntity, result.Exception.Message); } else { AutoBomLocationEntity locationModel = CreateDAL().GetModel(synchroLocationEntity.Location); BLLCreator.Create().AddStateChange(synchroLocationEntity.Location, "全部故障", "正常", "同步货位状态发现货位存储状态一致时将货位设置为正常", "AMS", "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } return response.Ok(synchroLocationEntity); } else { return response.Error(synchroLocationEntity, "在仓库中未找到该货位"); } } catch (Exception ex) { return response.Error(synchroLocationEntity, "ExecuteSynchroLocation方法异常;" + ex.Message + ex.StackTrace); } } #endregion #region 外部请求本地 返回消息 public class UpdateWayResult { public bool success { get; set; } public string errCode { get; set; } public string errMsg { get; set; } public string location { get; set; } } #endregion } }