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