using HH.Redis.ReisModel;
|
using HH.WMS.BLL.Algorithm;
|
using HH.WMS.BLL.Basic;
|
using HH.WMS.BLL.External;
|
using HH.WMS.BLL.InStock;
|
using HH.WMS.BLL.Interface;
|
using HH.WMS.BLL.MoveStock;
|
using HH.WMS.Common;
|
using HH.WMS.Common.Algorithm;
|
using HH.WMS.Common.External;
|
using HH.WMS.DAL;
|
using HH.WMS.DAL.Basic;
|
using HH.WMS.DAL.ERP;
|
using HH.WMS.DAL.InStock;
|
using HH.WMS.DAL.Pda;
|
using HH.WMS.DAL.SysMgr;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Dto;
|
using HH.WMS.Entitys.Entitys;
|
using HH.WMS.Entitys.ERP;
|
using HH.WMS.Entitys.External;
|
using HH.WMS.Entitys.MoveStock;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HH.WMS.BLL.Pda
|
{
|
public class NtApiBLL : DapperBaseBLL
|
{
|
#region 根据卸货区获取车牌号磅单号
|
/// <summary>
|
/// 根据卸货区获取车牌号磅单号
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <returns></returns>
|
public OperateResult GetPoundInfoByArea(string areaCode)
|
{
|
DataTable dt = DALCreator.Create<NtApiDAL>().GetPoundInfoByArea(areaCode);
|
if (dt.Rows.Count == 0)
|
{
|
return OperateResult.Error("当前卸货区不存在待卸货车辆");
|
}
|
else if (dt.Rows.Count == 1)
|
{
|
//根据库区获取所有的卸货货位托盘信息
|
List<TrayEncodeInfo> lstEntity = DALCreator.Create<NtApiDAL>().GetEncodeTrayByArea(areaCode);
|
PoundTrayEntity poundTray = new PoundTrayEntity();
|
poundTray.CN_S_POUND_NO = dt.Rows[0]["CN_S_POUND_NO"].ToString();
|
poundTray.CN_S_CAR_NO = dt.Rows[0]["CN_S_CAR_NO"].ToString();
|
poundTray.CN_S_ITEM_TYPE = dt.Rows[0]["CN_S_ITEM_TYPE"].ToString();
|
poundTray.lstTrayEncode = lstEntity;
|
return OperateResult.Succeed("", poundTray);
|
|
}
|
else
|
{
|
return OperateResult.Error("异常数据:当前卸货区存在两辆待卸货车辆");
|
}
|
}
|
#endregion
|
|
#region 批量下达卸货区到称重点的任务
|
/// <summary>
|
/// 批量下达卸货区到称重点的任务
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <returns></returns>
|
public OperateResult CallAGVCarry(List<TrayOnShelfEntity> lstNeedCarray, RedisUserEntity userEntity)
|
{
|
StringBuilder sbError = new StringBuilder();
|
OperateResult result = new OperateResult();
|
foreach (TrayOnShelfEntity entity in lstNeedCarray)
|
{
|
result = ZTShelfAutoCZ(entity, userEntity);
|
if (!result.Success)
|
{
|
sbError.Append("货位" + entity.CN_S_DEVICE_NO + "绑定的笼箱下达呼叫任务失败,详细原因为:" + result.Msg + ";");
|
}
|
}
|
if (sbError.Length > 0)
|
{
|
sbError.Length = sbError.Length - 1;
|
return OperateResult.Error(sbError.ToString());
|
}
|
else
|
{
|
return OperateResult.Succeed("");
|
}
|
}
|
#endregion
|
|
#region (PDA接口) 下达搬运任务
|
/// <summary>
|
/// 下达搬运任务 称重
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult ZTShelfAutoCZ(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE; //终点
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo));
|
}
|
|
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<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode));
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
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_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "卸货区转运到称重点";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
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;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
}
|
re = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "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"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 笼箱与货位解绑
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult DeleteTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
OperateResult operateResult = new OperateResult();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString());
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : mstEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
}
|
|
}
|
|
});
|
return operateResult;
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(locationCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO);
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : mstEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = locationCode;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
|
});
|
|
}
|
return operateResult;
|
|
|
}
|
#endregion
|
|
#region (PDA接口)托盘货位绑定
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
List<TN_WM_B_STOCK_QTYEntity> addStockQty = new List<TN_WM_B_STOCK_QTYEntity>();
|
List<TN_WM_B_AREA_QTYEntity> addAreaQty = new List<TN_WM_B_AREA_QTYEntity>();
|
#region 检查托盘与货位是否满足绑定条件
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检查该托盘是否绑定了其他货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
|
}
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
|
#endregion
|
//拼接托盘货位实体
|
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
};
|
|
trayLocationList.Add(trayLocation);
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接上架记录表
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = 0,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = dltEntity.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = mstEntity.CN_S_MODEL,
|
CN_S_MODIFY = userEntity.CN_S_NAME,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_S_OWNER = mstEntity.CN_S_OWNER,
|
CN_S_PACKING_UNIT = "",
|
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
|
CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "PDA绑定上架",
|
});
|
#endregion
|
}
|
}
|
|
#region 仓库量表
|
addStockQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
};
|
}).ToList();
|
#endregion
|
#region 库区量表
|
addAreaQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
}
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//写入托盘货位关联表
|
if (trayLocationList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(trayLocationList, trans);
|
}
|
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态及货位状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
}
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
//更新仓库量表
|
if (addStockQty.Any())
|
BLLCreator.Create<TN_WM_B_STOCK_QTYBLL>().AddList(addStockQty, trans);
|
//CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddList(addStockQty, trans);
|
//更新库区量表
|
if (addAreaQty.Any())
|
BLLCreator.Create<TN_WM_B_AREA_QTYBLL>().AddList(addAreaQty, trans);
|
//CreateDAL<TN_WM_B_AREA_QTYDAL>().AddList(addAreaQty, trans);
|
}
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 检查托盘是否可用并返回托盘中物料信息
|
public OperateResult CheckMpTray(string trayCode, string itemClass)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断托盘是否在容器管理表中维护
|
// List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL<TN_WM_B_TRAY_INFODAL>().GetModel(trayCode);
|
if (trayModel == null)
|
{
|
return OperateResult.Error(string.Format("请在容器管理表(tn_wm_tray_info)表中维护托盘号{0}信息!", trayCode));
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许码盘!", lstInTask[0].CN_S_TASK_NO));
|
}
|
if (lstStartTray.Count > 0)
|
{
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许在该货位码盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
List<TrayEncodeInfo> lstTrayItem = CreateDAL<NtApiDAL>().GetTrayDetail(trayCode);
|
//CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料
|
List<string> lstItemClass = new List<string>(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries));
|
List<AutoBomItemEntity> lstItem = DALCreator.Create<NtApiDAL>().GetItemByItemClass(lstItemClass);
|
if (lstTrayItem.Count > 0)
|
{
|
lstTrayItem[0].CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString())
|
{
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
}
|
}
|
}
|
else
|
{
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
|
}
|
}
|
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, lstTrayItem);
|
}
|
else
|
{
|
List<TrayEncodeInfo> lstTrayItem = CreateDAL<NtApiDAL>().GetTrayDetail(trayCode);
|
//CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料
|
List<string> lstItemClass = new List<string>(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries));
|
List<AutoBomItemEntity> lstItem = DALCreator.Create<NtApiDAL>().GetItemByItemClass(lstItemClass);
|
if (lstTrayItem.Count > 0)
|
{
|
lstTrayItem[0].CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString())
|
{
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
}
|
}
|
}
|
else
|
{
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE;
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
|
}
|
}
|
return OperateResult.Succeed("", lstTrayItem);
|
}
|
}
|
#endregion
|
|
#region 检查托盘是否可用并返回托盘中物料信息
|
public OperateResult CheckMpLocation(string locationCode, string itemClass)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count > 0)
|
{
|
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复码盘!", lstInTask[0].CN_S_TASK_NO));
|
}
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许在该位置码盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
List<TrayEncodeInfo> lstTrayItem = CreateDAL<NtApiDAL>().GetTrayDetail(strTrayCode);
|
//CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料
|
List<string> lstItemClass = new List<string>(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries));
|
List<AutoBomItemEntity> lstItem = DALCreator.Create<NtApiDAL>().GetItemByItemClass(lstItemClass);
|
if (lstTrayItem.Count > 0)
|
{
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString())
|
{
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
}
|
}
|
}
|
else
|
{
|
foreach (AutoBomItemEntity entity in lstItem)
|
{
|
|
TrayEncodeInfo info = new TrayEncodeInfo();
|
info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE;
|
info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME;
|
info.CN_F_QUANTITY = 0;
|
info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT;
|
lstTrayItem.Add(info);
|
|
}
|
}
|
return OperateResult.Succeed(strTrayCode, lstTrayItem);
|
}
|
#endregion
|
|
#region 码盘保存
|
/// <summary>
|
/// 码盘
|
/// </summary>
|
/// <param name="jsonData">数据Json</param>
|
/// <param name="userEntity">登陆信息实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-17</History>
|
public OperateResult SaveSimPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity)
|
{
|
OperateResult operateResult = new OperateResult();
|
string trayNo = entity.CN_S_TRAY_CODE;
|
try
|
{
|
List<TN_WM_B_TRAY_INFOEntity> trayInfoList = new List<TN_WM_B_TRAY_INFOEntity>();
|
//删除托盘物料关联主子表
|
//拼接托盘物料关联主子表
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> TrayItemMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> TrayItemDtllst = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
|
Log.Info("SaveSimPalletItemRelation===>传参:====>", JsonConvert.SerializeObject(entity));
|
|
var Group_List = entity.row.GroupBy(x => new
|
{
|
x.CN_S_TRAY_CODE,
|
x.CN_S_TRAY_GRID,
|
x.CN_S_ITEM_CODE,
|
x.CN_S_ITEM_STATE,
|
x.CN_S_LOT_NO,
|
x.CN_S_OWNER
|
}).Select(g => new TrayItemRow
|
{
|
CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(),
|
CN_S_TRAY_GRID = string.IsNullOrEmpty(g.FirstOrDefault().CN_S_TRAY_GRID.Trim()) ? "1" : g.FirstOrDefault().CN_S_TRAY_GRID.Trim(),
|
CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(),
|
CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(),
|
CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO.Trim(),
|
CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(),
|
CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY)
|
}).ToList();
|
|
Log.Info("SaveSimPalletItemRelation===>Group_List:====>", JsonConvert.SerializeObject(Group_List));
|
|
for (int i = 0; i < Group_List.Count; i++)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString());
|
//拼接托盘物料关联主表实体
|
#region 拼接托盘物料关联主表实体
|
var mstGuid = Guid.NewGuid().ToString().ToUpper();
|
var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(),
|
CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(),
|
CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(),
|
CN_S_LOT_NO = Group_List[i].CN_S_LOT_NO.ToString(),
|
CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = entity.CN_S_POUND_NO,
|
CN_S_MODEL = itemenity.CN_S_MODEL,
|
CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(),
|
CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT,
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
};
|
#endregion
|
Log.Info("SaveSimPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity));
|
#region 拼接托盘物料关联子表实体
|
|
TrayItemMstlst.Add(trayItemMstEntity);
|
var parentGuid = trayItemMstEntity.CN_GUID;
|
|
var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_LOT_NO.Trim() == Group_List[i].CN_S_LOT_NO.Trim()
|
&& o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
|
|
Log.Info("===>dtl_List:====>", JsonConvert.SerializeObject(dtl_List));
|
|
for (int j = 0; j < dtl_List.Count; j++)
|
{
|
var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity();
|
dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper();
|
dtlentity.CN_PARENT_GUID = parentGuid;
|
dtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString();
|
dtlentity.CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString();
|
dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY);
|
dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString();
|
dtlentity.CN_S_NOTE = "";
|
dtlentity.CN_S_EXT1 = "";
|
dtlentity.CN_S_EXT2 = "";
|
dtlentity.CN_S_EXT3 = "";
|
dtlentity.CN_S_EXT4 = "";
|
dtlentity.CN_S_EXT5 = "";
|
dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
dtlentity.CN_T_CREATE = DateTime.Now;
|
dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
dtlentity.CN_T_MODIFY = DateTime.Now;
|
TrayItemDtllst.Add(dtlentity);
|
Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst));
|
}
|
#endregion
|
}
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayNo });
|
|
|
|
operateResult = UseTransaction(trans =>
|
{
|
//删除主表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = trayNo }, trans);
|
//删除子表
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
|
}
|
if (TrayItemMstlst.Any())
|
{
|
//新增托盘物料关联主表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(TrayItemMstlst, trans);
|
}
|
if (TrayItemDtllst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(TrayItemDtllst, trans);
|
}
|
//更新托盘贮存状态
|
if (!string.IsNullOrEmpty(entity.CN_S_USE_STATE))
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
{
|
CN_S_USE_STATE = entity.CN_S_USE_STATE
|
}, new
|
{
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE
|
}, trans);
|
}
|
|
});
|
|
|
|
}
|
catch (Exception ex)
|
{
|
return OperateResult.Error(ex.Message.ToString());
|
}
|
//成功后,赋值托盘编码
|
if (operateResult.Success)
|
{
|
operateResult.Data = trayNo;
|
}
|
return operateResult;
|
}
|
#endregion
|
|
#region 根据卸货区判断库区中是否有执行中的任务
|
/// <summary>
|
/// 根据卸货区获取车牌号磅单号
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <returns></returns>
|
public OperateResult CheckTaskInArea(string areaCode)
|
{
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByAreaCode(areaCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error("当前卸货区存在未执行或执行中的任务");
|
}
|
|
else
|
{
|
return OperateResult.Succeed("");
|
}
|
}
|
#endregion
|
|
#region (PDA接口)检查入库起点是否可用
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckInStockLocation(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count > 0)
|
{
|
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstMst = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + lstStartTray[0].CN_S_TRAY_CODE + "'");
|
if (lstMst.Count == 0)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}绑定的托盘没有物料信息,不允许入库!", locationCode));
|
}
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
List<TrayEncodeInfo> lstEntity = DALCreator.Create<NtApiDAL>().GetGoodByTrayCode(strTrayCode);
|
return OperateResult.Succeed(strTrayCode, lstEntity);
|
}
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckInStockTray(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstMst = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + trayCode + "'");
|
if (lstMst.Count == 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘{0}没有物料信息,不允许入库!", trayCode));
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
if (lstStartTray.Count > 0)
|
{
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE));
|
}
|
List<TrayEncodeInfo> lstEntity = DALCreator.Create<NtApiDAL>().GetGoodByTrayCode(trayCode);
|
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, lstEntity);
|
}
|
else
|
{
|
List<TrayEncodeInfo> lstEntity = DALCreator.Create<NtApiDAL>().GetGoodByTrayCode(trayCode);
|
return OperateResult.Succeed("", lstEntity);
|
}
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托上架(自动)
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
//调用算法计算终点货位
|
List<areaPriorClass> lstTmpArea = new List<areaPriorClass>();
|
lstTmpArea.Add(new areaPriorClass { areaCode = entity.CN_S_END_AREA_CODE, Prior = 1 });
|
InAssignEntity iAe = new InAssignEntity()
|
{
|
lstAreaPrior = lstTmpArea,
|
logicAreaCode = "",
|
objectCode = trayCode,
|
projectCode = "ntsd",
|
lockLocation = false,//是否需要锁定货位
|
needCalLock = false
|
};
|
iAe.lstDevice = null;
|
InAssignResultEntity irEresult = BLLCreator.Create<In_AlgorBLL>().InAssign(iAe);
|
if (!irEresult.Success)
|
{
|
return OperateResult.Error(irEresult.Msg);//货位获取失败!
|
}
|
else
|
{
|
locationCode = irEresult.locationCode.ToString();
|
}
|
}
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo));
|
}
|
|
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<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode));
|
}
|
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<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"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_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托上架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
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;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
}
|
re = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "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"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)叫料检查货位
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckLocation(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
//检查该托盘是否绑定了其他货位
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
//检查该货位外层是否有阻挡
|
if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR))
|
{
|
var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR);
|
var locations = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR);
|
if (locations.Count() > 0)
|
{
|
foreach (var location in locations)
|
{
|
|
if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常"))
|
{
|
return OperateResult.Error(string.Format("当前货位的外层货位{0}状态为{1},存储状态为{2},导致当前货位不可用!", location.CN_S_LOCATION_CODE, location.CN_S_LOCATION_STATE, location.CN_S_USE_STATE));
|
}
|
}
|
}
|
}
|
return OperateResult.Succeed("");
|
}
|
|
|
public OperateResult SimZTDownShelfCallMaterialYS(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string endLocationCode = entity.CN_S_DEVICE_NO;//分拣台
|
string startLocationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'");
|
|
if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
//锁定起点货位
|
BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = startLocationCode });
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(startLocationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode));
|
}
|
|
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));
|
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(startLocationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + endLocationCode + "'");
|
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},不允许往该位置卸料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(endLocationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode));
|
}
|
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<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(endLocationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"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_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = startLocationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = endLocationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
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;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "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"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, "", "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 并筐相关接口
|
/// <summary>
|
/// 获取并筐区货位物料托盘信息
|
/// </summary>
|
/// <param name="locationCode"></param>
|
/// <returns></returns>
|
public OperateResult GetMergeTrayInfo(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
//寻找该货位所在的并笼区的其他货位
|
AutoBomLocationEntity locationModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetModel(locationCode);
|
if (locationModel == null)
|
{
|
return OperateResult.Error("在TN_AB_STOCK_LOCATION表中找不到该货位!");
|
}
|
List<AutoBomLocationEntity> lstLocation = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaLocations(locationModel.CN_S_AREA_CODE);
|
if (lstLocation.Count != 2)
|
{
|
return OperateResult.Error("并笼区的货位数量不等于2!");
|
}
|
lstLocation.RemoveAll(o => o.CN_S_LOCATION_CODE == locationCode);
|
List<TrayEncodeInfo> lstTrayE = new List<TrayEncodeInfo>();
|
|
#region 查询主笼数据
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
TrayEncodeInfo trayE = new TrayEncodeInfo();
|
if (lstOriginalMST.Count > 0)
|
{
|
trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE;
|
trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME;
|
trayE.CN_S_LOCATION_CODE = locationCode;
|
trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE;
|
trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT;
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
trayE.CN_S_TRAY_FLAG = "主笼";
|
trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY;
|
//记录笼箱的重量
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (lstLocationExt.Count > 0)
|
{
|
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock)
|
{
|
trayE.CN_S_TRAY_REMARK = "预出库锁定,并笼托盘即将搬离该货位";
|
}
|
else
|
{
|
trayE.CN_S_TRAY_REMARK = "";
|
}
|
|
}
|
lstTrayE.Add(trayE);
|
}
|
}
|
else
|
{
|
//查询该货位的状态
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
TrayEncodeInfo trayE = new TrayEncodeInfo();
|
trayE.CN_S_TRAY_FLAG = "主笼";
|
if (lstLocationExt.Count > 0)
|
{
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock)
|
{
|
trayE.CN_S_TRAY_REMARK = "预入库锁定,并笼托盘即将搬运到该货位";
|
//查询即将入库的托盘物料信息
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByEndLocation(locationCode);
|
if (lstInTask.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstInTask[0].CN_S_TRAY_CODE });
|
if (lstOriginalMST.Count > 0)
|
{
|
trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE;
|
trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME;
|
trayE.CN_S_LOCATION_CODE = locationCode;
|
trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE;
|
trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT;
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY;
|
//记录笼箱的重量
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
}
|
}
|
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
trayE.CN_S_TRAY_REMARK = "发呆中,请呼叫托盘做并笼操作";
|
}
|
lstTrayE.Add(trayE);
|
}
|
}
|
#endregion
|
|
#region 查询并筐区另一个笼子数据
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(lstLocation[0].CN_S_LOCATION_CODE.ToString());
|
if (lstEntity.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
TrayEncodeInfo trayE = new TrayEncodeInfo();
|
if (lstOriginalMST.Count > 0)
|
{
|
trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE;
|
trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME;
|
trayE.CN_S_LOCATION_CODE = lstLocation[0].CN_S_LOCATION_CODE.ToString();
|
trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE;
|
trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT;
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
trayE.CN_S_TRAY_FLAG = "副笼";
|
trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY;
|
//记录笼箱的重量
|
trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE;
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'");
|
if (lstLocationExt.Count > 0)
|
{
|
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock)
|
{
|
trayE.CN_S_TRAY_REMARK = "预出库锁定,并笼托盘即将搬离该货位";
|
|
}
|
else
|
{
|
trayE.CN_S_TRAY_REMARK = "";
|
}
|
|
}
|
lstTrayE.Add(trayE);
|
}
|
}
|
else
|
{
|
//查询该货位的状态
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'");
|
TrayEncodeInfo trayE = new TrayEncodeInfo();
|
trayE.CN_S_TRAY_FLAG = "副笼";
|
if (lstLocationExt.Count > 0)
|
{
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock)
|
{
|
trayE.CN_S_TRAY_REMARK = "预入库锁定,并笼托盘即将搬运到该货位";
|
//查询即将入库的托盘物料信息
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByEndLocation(lstLocation[0].CN_S_LOCATION_CODE.ToString());
|
if (lstInTask.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstSubMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstInTask[0].CN_S_TRAY_CODE });
|
if (lstSubMST.Count > 0)
|
{
|
trayE.CN_S_ITEM_CODE = lstSubMST[0].CN_S_ITEM_CODE;
|
trayE.CN_S_ITEM_NAME = lstSubMST[0].CN_S_ITEM_NAME;
|
trayE.CN_S_LOCATION_CODE = lstLocation[0].CN_S_LOCATION_CODE.ToString();
|
trayE.CN_S_TRAY_CODE = lstSubMST[0].CN_S_TRAY_CODE;
|
trayE.CN_S_MEASURE_UNIT = lstSubMST[0].CN_S_MEASURE_UNIT;
|
trayE.CN_S_IN_AREA_CODE = lstSubMST[0].CN_S_IN_AREA_CODE;
|
trayE.CN_F_QUANTITY = lstSubMST[0].CN_F_QUANTITY;
|
//记录笼箱的重量
|
trayE.CN_S_IN_AREA_CODE = lstSubMST[0].CN_S_IN_AREA_CODE;
|
}
|
}
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
trayE.CN_S_TRAY_REMARK = "发呆中,请呼叫托盘做并笼操作";
|
}
|
lstTrayE.Add(trayE);
|
}
|
}
|
#endregion
|
|
return OperateResult.Succeed("", lstTrayE);
|
}
|
public OperateResult GetNeedMergeTray(string areaCode)
|
{
|
//根据库区获取所有的卸货货位托盘信息
|
List<TrayEncodeInfo> lstEntity = DALCreator.Create<NtApiDAL>().GetEncodeTrayByArea(areaCode);
|
return OperateResult.Succeed("", lstEntity);
|
}
|
/// <summary>
|
/// 整托执行下架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTDownShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//分拣台
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", locationCode));
|
}
|
|
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));
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", deviceNo));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"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_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托下架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = locationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = deviceNo;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
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;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "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"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
});
|
return operateResult;
|
}
|
|
public OperateResult SaveMergeTray(string locationCode, string isCreate, string inAreaCode, string trayUseState, RedisUserEntity userEntity)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
//寻找该货位所在的并笼区的其他货位
|
AutoBomLocationEntity locationModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetModel(locationCode);
|
if (locationModel == null)
|
{
|
return OperateResult.Error("在TN_AB_STOCK_LOCATION表中找不到该货位!");
|
}
|
List<AutoBomLocationEntity> lstLocation = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaLocations(locationModel.CN_S_AREA_CODE);
|
if (lstLocation.Count != 2)
|
{
|
return OperateResult.Error("并筐区的货位数量不等于2!");
|
}
|
lstLocation.RemoveAll(o => o.CN_S_LOCATION_CODE == locationCode);
|
List<TrayEncodeInfo> lstTrayE = new List<TrayEncodeInfo>();
|
TN_WM_B_TRAY_ITEM_MSTEntity mainMst = new TN_WM_B_TRAY_ITEM_MSTEntity();
|
TN_WM_B_TRAY_ITEM_MSTEntity subMst = new TN_WM_B_TRAY_ITEM_MSTEntity();
|
#region 查询主笼数据
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
if (lstOriginalMST.Count > 0)
|
{
|
mainMst = lstOriginalMST[0];
|
}
|
else
|
{
|
return OperateResult.Error("主笼货位对应的托盘没有物料信息,不允许并笼!");
|
}
|
}
|
else
|
{
|
//查询该货位的状态
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (lstLocationExt.Count > 0)
|
{
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock)
|
{
|
return OperateResult.Error("主笼货位" + locationCode + "为预入库状态,不允许并笼!");
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock)
|
{
|
return OperateResult.Error("主笼货位" + locationCode + "为预出库状态,不允许并笼!");
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
return OperateResult.Error("主笼货位" + locationCode + "没有绑定托盘,不允许并笼!");
|
}
|
}
|
}
|
#endregion
|
|
#region 查询并筐区另一个笼子数据
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(lstLocation[0].CN_S_LOCATION_CODE.ToString());
|
if (lstEntity.Count > 0)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
if (lstOriginalMST.Count > 0)
|
{
|
subMst = lstOriginalMST[0];
|
}
|
else
|
{
|
return OperateResult.Error("副笼货位对应的托盘没有物料信息,不允许并笼!");
|
}
|
}
|
else
|
{
|
//查询该货位的状态
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExt = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'");
|
if (lstLocationExt.Count > 0)
|
{
|
if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock)
|
{
|
return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "为预入库状态,不能并笼!");
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock)
|
{
|
return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "为预出库状态,不能并笼!");
|
}
|
else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "没有绑定托盘,不能并笼!");
|
}
|
}
|
}
|
#endregion
|
if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE)
|
{
|
return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!");
|
}
|
//if (mainMst.CN_S_IN_AREA_CODE == null)
|
//{
|
// return OperateResult.Error("主笼没有称重数据,不允许并笼!");
|
//}
|
//if (subMst.CN_S_IN_AREA_CODE == null)
|
//{
|
// return OperateResult.Error("副笼没有称重数据,不允许并笼!");
|
//}
|
|
mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + subMst.CN_F_QUANTITY;
|
// mainMst.CN_S_IN_AREA_CODE = (decimal.Parse(mainMst.CN_S_IN_AREA_CODE) + decimal.Parse(subMst.CN_S_IN_AREA_CODE)).ToString();
|
|
OperateResult operateResult = new OperateResult();
|
operateResult = UseTransaction(trans =>
|
{
|
|
//更新托盘物料关联主表
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY, CN_S_IN_AREA_CODE = mainMst.CN_S_IN_AREA_CODE }, new { CN_GUID = mainMst.CN_GUID }, trans);
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans);
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans);
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_GUID = subMst.CN_GUID }, trans);
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans);
|
//更新托盘贮存状态
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
{
|
CN_S_USE_STATE = trayUseState
|
}, new
|
{
|
CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE
|
}, trans);
|
|
});
|
if (operateResult.Success)
|
{
|
var result = BLLCreator.Create<NtApiBLL>().DeleteTrayLocationRelation(subMst.CN_S_TRAY_CODE, lstLocation[0].ToString(), userEntity, "");
|
|
if (result.Success)
|
{
|
if (isCreate == "Y")
|
{
|
TrayOnShelfEntity entity = new TrayOnShelfEntity();
|
entity.CN_S_DEVICE_NO = locationCode; //起点货位码
|
entity.CN_S_LOCATION_CODE = ""; //建议货位码 货位
|
entity.CN_S_END_AREA_CODE = inAreaCode;//目标库区
|
entity.CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE; //起始托盘码
|
entity.CN_S_TASK_TYPE = "上架"; //任务类型
|
result = BLLCreator.Create<NtApiBLL>().SimZTShelfAuto(entity, userEntity);
|
if (result.Success)
|
{
|
return OperateResult.Succeed("");
|
}
|
else
|
{
|
return OperateResult.Error("并笼成功但主笼入库失败,原因为:" + result.Msg);
|
}
|
}
|
else
|
{
|
return OperateResult.Succeed("");
|
}
|
}
|
else
|
{
|
|
return OperateResult.Error("并笼成功但副笼解绑货位失败,原因为:" + result.Msg);
|
}
|
|
}
|
else
|
{
|
return OperateResult.Error("并笼失败");
|
}
|
|
}
|
|
public OperateResult SaveMergeTrayNew(ItemOnTrayEntity entity, RedisUserEntity userEntity)
|
{
|
|
TN_WM_B_TRAY_ITEM_MSTEntity mainMst = null;
|
TN_WM_B_TRAY_ITEM_MSTEntity subMst = null;
|
|
List<TN_ER_COMBINE_CAGE_HISTORYEntity> lstMergeHis = new List<TN_ER_COMBINE_CAGE_HISTORYEntity>();
|
bool mainCombineFlag = false;
|
bool subCombineFlag = false;
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE });
|
if (lstOriginalMST.Count > 0)
|
{
|
mainMst = lstOriginalMST[0];
|
}
|
else
|
{
|
return OperateResult.Error("主笼中没有物料信息,不允许并笼!");
|
}
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalSUB = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB });
|
if (lstOriginalSUB.Count > 0)
|
{
|
subMst = lstOriginalSUB[0];
|
}
|
else
|
{
|
return OperateResult.Error("副笼中没有物料信息,不允许并笼!");
|
}
|
Log.Info("SaveMergeTrayNew===>subMst:", JsonConvert.SerializeObject(subMst));
|
if (lstOriginalMST.Count > 0 && lstOriginalSUB.Count > 0)
|
{
|
if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE)
|
{
|
return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!");
|
}
|
}
|
//查询是否有并笼记录
|
List<TN_ER_COMBINE_CAGE_HISTORYEntity> lstMainMergeHis = BLLCreator.Create<DapperBLL<TN_ER_COMBINE_CAGE_HISTORYEntity>>().GetList(new { CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_N_SYNC = "新建" });
|
List<TN_ER_COMBINE_CAGE_HISTORYEntity> lstSubMergeHis = BLLCreator.Create<DapperBLL<TN_ER_COMBINE_CAGE_HISTORYEntity>>().GetList(new { CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB, CN_N_SYNC = "新建" });
|
if (lstMainMergeHis.Count > 0)
|
{
|
//将主笼中已经并笼过的数据添加到新主笼中
|
mainCombineFlag = true;
|
foreach (TN_ER_COMBINE_CAGE_HISTORYEntity combine in lstMainMergeHis)
|
{
|
TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity();
|
mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE;
|
mergeHis.CN_S_TRAY_CODE = combine.CN_S_TRAY_CODE;
|
mergeHis.CN_S_POUND_NO = combine.CN_S_POUND_NO;
|
|
mergeHis.CN_GUID = Guid.NewGuid().ToString();
|
mergeHis.CN_N_SYNC = "新建";
|
mergeHis.CN_S_LOT_NO = combine.CN_S_LOT_NO;
|
mergeHis.CN_F_QTY = combine.CN_F_QTY;
|
mergeHis.CN_T_CREATE = DateTime.Now;
|
lstMergeHis.Add(mergeHis);
|
}
|
}
|
else
|
{
|
List<TN_ER_ITEM_POUNDEntity> lstItemPound = BLLCreator.Create<DapperBLL<TN_ER_ITEM_POUNDEntity>>().GetList(new { CN_S_POUND_NO = mainMst.CN_S_FIGURE_NO, CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE });
|
|
if (lstItemPound.Count == 0)
|
{
|
return OperateResult.Error("未查询到主笼的小磅号数据!");
|
}
|
TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity();
|
mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE;
|
mergeHis.CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE;
|
mergeHis.CN_S_POUND_NO = mainMst.CN_S_FIGURE_NO;
|
|
mergeHis.CN_GUID = Guid.NewGuid().ToString();
|
mergeHis.CN_N_SYNC = "新建";
|
mergeHis.CN_T_CREATE = DateTime.Now;
|
mergeHis.CN_S_LOT_NO = lstItemPound[0].CN_S_LOT_NO;
|
mergeHis.CN_F_QTY = mainMst.CN_F_QUANTITY;
|
lstMergeHis.Add(mergeHis);
|
}
|
|
if (lstSubMergeHis.Count > 0)
|
{
|
//将副笼之前的并笼数据添加到新主笼中
|
subCombineFlag = true;
|
foreach (TN_ER_COMBINE_CAGE_HISTORYEntity combine in lstSubMergeHis)
|
{
|
TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity();
|
mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE;
|
mergeHis.CN_S_TRAY_CODE = combine.CN_S_TRAY_CODE;
|
mergeHis.CN_S_POUND_NO = combine.CN_S_POUND_NO;
|
mergeHis.CN_GUID = Guid.NewGuid().ToString();
|
mergeHis.CN_N_SYNC = "新建";
|
mergeHis.CN_S_LOT_NO = combine.CN_S_LOT_NO;
|
mergeHis.CN_F_QTY = combine.CN_F_QTY;
|
mergeHis.CN_T_CREATE = DateTime.Now;
|
lstMergeHis.Add(mergeHis);
|
}
|
}
|
else
|
{
|
Log.Info("SaveMergeTrayNew===>subMst(CN_S_POUND_NO,CN_S_TRAY_CODE):", subMst.CN_S_FIGURE_NO.ToString() +"," +subMst.CN_S_TRAY_CODE.ToString());
|
List<TN_ER_ITEM_POUNDEntity> lstItemPound = BLLCreator.Create<DapperBLL<TN_ER_ITEM_POUNDEntity>>().GetList(new { CN_S_POUND_NO = subMst.CN_S_FIGURE_NO, CN_S_TRAY_CODE = subMst.CN_S_TRAY_CODE });
|
Log.Info("SaveMergeTrayNew===>lstItemPound:", JsonConvert.SerializeObject(lstItemPound));
|
if (lstItemPound.Count == 0)
|
{
|
return OperateResult.Error("未查询到副笼的小磅号数据!");
|
}
|
TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity();
|
mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE;
|
mergeHis.CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB;
|
mergeHis.CN_S_POUND_NO = subMst.CN_S_FIGURE_NO;
|
mergeHis.CN_GUID = Guid.NewGuid().ToString();
|
mergeHis.CN_N_SYNC = "新建";
|
mergeHis.CN_S_LOT_NO = lstItemPound[0].CN_S_LOT_NO;
|
mergeHis.CN_F_QTY = subMst.CN_F_QUANTITY;
|
mergeHis.CN_T_CREATE = DateTime.Now;
|
lstMergeHis.Add(mergeHis);
|
}
|
|
//if (mainMst == null)
|
//{
|
// //插入
|
// mainInsert = true;
|
//}
|
//else
|
//{
|
//更新
|
mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + subMst.CN_F_QUANTITY;
|
|
// }
|
OperateResult operateResult = new OperateResult();
|
operateResult = UseTransaction(trans =>
|
{
|
//更新托盘物料关联主表
|
//if (mainInsert)
|
//{
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE }, new { CN_GUID = subMst.CN_GUID }, trans);
|
//}
|
//else
|
//{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans);
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans);
|
// }
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_GUID = subMst.CN_GUID }, trans);
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans);
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = subMst.CN_S_TRAY_CODE }, trans);
|
|
//处理并笼历史记录业务
|
if (mainCombineFlag)
|
{
|
CreateDAL<TN_ER_COMBINE_CAGE_HISTORYDAL>().UpdateCombineStatus(entity.CN_S_TRAY_CODE, "删除", "新建", trans);
|
}
|
if (subCombineFlag)
|
{
|
CreateDAL<TN_ER_COMBINE_CAGE_HISTORYDAL>().UpdateCombineStatus(entity.CN_S_TRAY_CODE_SUB, "删除", "新建", trans);
|
}
|
|
CreateDAL<DapperDAL<TN_ER_COMBINE_CAGE_HISTORYEntity>>().AddRange(lstMergeHis, trans);
|
|
|
//更新托盘贮存状态
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
{
|
CN_S_USE_STATE = entity.CN_S_USE_STATE
|
}, new
|
{
|
CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE
|
}, trans);
|
|
});
|
if (operateResult.Success)
|
{
|
return OperateResult.Succeed("");
|
}
|
else
|
{
|
return OperateResult.Error("并笼失败" + operateResult.Msg);
|
}
|
|
}
|
|
|
//public OperateResult SaveMergeTrayNew(ItemOnTrayEntity entity, RedisUserEntity userEntity)
|
//{
|
|
// TN_WM_B_TRAY_ITEM_MSTEntity mainMst = null;
|
// TN_WM_B_TRAY_ITEM_DTLEntity mainDtlentity = null;
|
// TN_WM_B_TRAY_ITEM_MSTEntity subMst = null;
|
|
// bool mainInsert = false;
|
// bool subDelete = false;
|
|
// List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE });
|
// if (lstOriginalMST.Count > 0)
|
// {
|
// mainMst = lstOriginalMST[0];
|
// }
|
// List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalSUB = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB });
|
// if (lstOriginalSUB.Count > 0)
|
// {
|
// subMst = lstOriginalMST[0];
|
// }
|
|
// if (lstOriginalMST.Count > 0 && lstOriginalSUB.Count > 0)
|
// {
|
// if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE)
|
// {
|
// return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!");
|
// }
|
// }
|
|
// if (mainMst == null)
|
// {
|
// //插入
|
// mainInsert = true;
|
// string mstGuid = Guid.NewGuid().ToString().ToUpper();
|
// mainMst = new TN_WM_B_TRAY_ITEM_MSTEntity
|
// {
|
// CN_GUID = mstGuid,
|
// CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
// CN_S_TRAY_GRID = "1",
|
// CN_S_OWNER = "",
|
// CN_S_ITEM_CODE = entity.row[0].CN_S_ITEM_CODE.ToString(),
|
// CN_S_LOT_NO = "",
|
// CN_S_ITEM_NAME = entity.row[0].CN_S_ITEM_NAME,
|
// CN_S_FIGURE_NO = "",
|
// CN_S_MODEL = "",
|
// CN_S_ITEM_STATE = "",
|
// CN_F_QUANTITY = entity.row[0].CN_F_QUANTITY,
|
// CN_S_MEASURE_UNIT = entity.row[0].CN_S_MEASURE_UNIT,
|
// CN_F_ALLOC_QTY = 0,
|
// CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
// CN_F_INQTY = entity.row[0].CN_F_QUANTITY,
|
// };
|
// mainDtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity();
|
// mainDtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper();
|
// mainDtlentity.CN_PARENT_GUID = mstGuid;
|
// mainDtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString();
|
// mainDtlentity.CN_S_LOT_NO = "";
|
// mainDtlentity.CN_F_QUANTITY = entity.row[0].CN_F_QUANTITY;
|
// mainDtlentity.CN_S_PRODUCTION_BATCH = "";
|
// mainDtlentity.CN_S_NOTE = "";
|
// mainDtlentity.CN_S_EXT1 = "";
|
// mainDtlentity.CN_S_EXT2 = "";
|
// mainDtlentity.CN_S_EXT3 = "";
|
// mainDtlentity.CN_S_EXT4 = "";
|
// mainDtlentity.CN_S_EXT5 = "";
|
// mainDtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
// mainDtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
// mainDtlentity.CN_T_CREATE = DateTime.Now;
|
// mainDtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
// mainDtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
// mainDtlentity.CN_T_MODIFY = DateTime.Now;
|
|
// }
|
// else
|
// {
|
// //更新
|
// mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + entity.row[0].CN_F_QUANTITY;
|
|
// }
|
// decimal remainQty = subMst.CN_F_QUANTITY - entity.row[0].CN_F_QUANTITY;
|
// if (remainQty > 0)
|
// {
|
// //更新
|
// subMst.CN_F_QUANTITY = remainQty;
|
// }
|
// else
|
// {
|
// subDelete = true;
|
// }
|
|
|
|
|
// // mainMst.CN_S_IN_AREA_CODE = (decimal.Parse(mainMst.CN_S_IN_AREA_CODE) + decimal.Parse(subMst.CN_S_IN_AREA_CODE)).ToString();
|
|
// OperateResult operateResult = new OperateResult();
|
// operateResult = UseTransaction(trans =>
|
// {
|
|
// //更新托盘物料关联主表
|
// // CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY, CN_S_IN_AREA_CODE = mainMst.CN_S_IN_AREA_CODE }, new { CN_GUID = mainMst.CN_GUID }, trans);
|
// if (mainInsert)
|
// {
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Add(mainMst, trans);
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Add(mainDtlentity, trans);
|
// }
|
// else
|
// {
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans);
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans);
|
// }
|
// if (subDelete)
|
// {
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_GUID = subMst.CN_GUID }, trans);
|
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans);
|
// }
|
// else
|
// {
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = remainQty }, new { CN_GUID = subMst.CN_GUID }, trans);
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Update(new { CN_F_QUANTITY = remainQty }, new { CN_PARENT_GUID = subMst.CN_GUID }, trans);
|
// }
|
// //更新托盘贮存状态
|
|
// CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
// {
|
// CN_S_USE_STATE = entity.CN_S_USE_STATE,
|
// CN_S_TRAY_CODE_EXT = 'Y'
|
// }, new
|
// {
|
// CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE
|
// }, trans);
|
|
// });
|
// if (operateResult.Success)
|
// {
|
// return OperateResult.Succeed("");
|
// }
|
// else
|
// {
|
// return OperateResult.Error("并笼失败");
|
// }
|
|
//}
|
|
#endregion
|
|
#region PDA专用 生成任务
|
/// <summary>
|
/// PDA专用 生成任务
|
/// </summary>
|
/// <param name="startPosition"></param>
|
/// <param name="endPosition"></param>
|
/// <param name="taskPriority"></param>
|
/// <param name="objLocationEntity"></param>
|
/// <param name="taskNo"></param>
|
/// <param name="SendAms"></param>
|
/// <returns></returns>
|
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<TN_WM_LOCATION_EXTBLL>().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<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(startPosition);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startPosition));
|
}
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
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));
|
|
}
|
//判断货位是否绑定托盘
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(startPosition);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
|
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().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<TN_AB_STOCK_LOCATIONDAL>().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"))
|
{
|
if (endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().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;
|
if (lstStartTray.Count > 0)
|
{
|
taskEntity.CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE;
|
}
|
else
|
{
|
postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("虚拟托盘号生成失败,请检查autobom中是否配置了虚拟托盘号生成规则!");
|
}
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
}
|
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 事务
|
|
//新增任务
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
|
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
result = CreateDAL<TN_WM_LOCATION_EXTDAL>().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<TN_WM_B_LOCATION_CHANGEBLL>().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<TN_WM_LOCATION_EXTDAL>().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<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(startPosition, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
}
|
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
#endregion
|
});
|
return result;
|
|
}
|
#endregion
|
#region 检查并获取托盘信息
|
public OperateResult GetTrayInfo(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断托盘是否在容器管理表中维护
|
TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL<TN_WM_B_TRAY_INFODAL>().GetModel(trayCode);
|
if (trayModel == null)
|
{
|
trayModel = new TN_WM_B_TRAY_INFOEntity();
|
trayModel.CN_S_TRAY_CODE = trayCode;
|
}
|
|
return OperateResult.Succeed("", trayModel);
|
}
|
#endregion
|
#region 新增或更新托盘信息
|
public OperateResult UpdateTrayInfo(TN_WM_B_TRAY_INFOEntity trayM, RedisUserEntity user)
|
{
|
|
//判断托盘是否在容器管理表中维护
|
TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL<TN_WM_B_TRAY_INFODAL>().GetModel(trayM.CN_S_TRAY_CODE);
|
OperateResult result = new OperateResult();
|
if (trayModel == null)
|
{
|
//新增容器表
|
trayM.CN_N_COLUMN_NUM = 1;
|
trayM.CN_N_GOODUPLINE = 1;
|
trayM.CN_N_LATTICE_NUM = 1;
|
trayM.CN_N_ROW_NUM = 1;
|
trayM.CN_S_CREATOR = user.CN_S_LOGIN;
|
trayM.CN_S_CREATOR_BY = user.CN_S_NAME;
|
trayM.CN_S_MODIFY = user.CN_S_LOGIN;
|
trayM.CN_S_MODIFY_BY = user.CN_S_NAME;
|
trayM.CN_S_STATE = Constants.State_New;
|
trayM.CN_S_TRAY_TYPE = "托盘";
|
trayM.CN_S_USE_STATE = Constants.TrayState_NotUse;
|
trayM.CN_T_CREATE = DateTime.Now;
|
trayM.CN_T_MODIFY = DateTime.Now;
|
result = CreateDAL<TN_WM_B_TRAY_INFODAL>().Add(trayM, null);
|
}
|
else
|
{
|
//更新托盘实际重量、规格信息
|
result = CreateDAL<TN_WM_B_TRAY_INFODAL>().updateTrayInfo(trayM.CN_S_TRAY_CODE, trayM.CN_F_GROSSWEIGHT,trayM.CN_S_USE_STATE, trayM.CN_S_SPEC, null);
|
}
|
return result;
|
}
|
#endregion
|
|
#region 根据巷道获取巷道内的货位状态
|
|
public DataTable ViewState(string stockCode, string areaCodes, string roadway)
|
{
|
var dt = CreateDAL<TN_WM_LOCATION_EXTDAL>().ViewStateByAreaCode(stockCode, areaCodes, roadway);
|
dt.Columns["VIEW_STATE"].ReadOnly = false;
|
foreach (DataRow row in dt.Rows)
|
{
|
if (row["VIEW_STATE"].ToString().Equals("满"))
|
{
|
var trayLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = row["CN_S_LOCATION_CODE"].ToString() });
|
if (trayLocation != null)
|
{
|
var trayInfo = CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().GetSingleEntity(new { CN_S_TRAY_CODE = trayLocation.CN_S_TRAY_CODE });
|
if (trayInfo != null)
|
{
|
if (!string.IsNullOrEmpty(trayInfo.CN_S_USE_STATE) && trayInfo.CN_S_USE_STATE.Trim() != "空")
|
row["VIEW_STATE"] = trayInfo.CN_S_USE_STATE;
|
}
|
}
|
}
|
}
|
return dt;
|
}
|
|
#endregion
|
}
|
}
|