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.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.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 ProdBLL : DapperBaseBLL
{
#region (PDA接口)检查码盘起点是否可用
///
///
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult CheckMpLocation(string locationCode)
{
if (string.IsNullOrEmpty(locationCode))
{
return OperateResult.Error("请传入货位号参数!");
}
string strTrayCode = "";
//判断货位是否绑定托盘
List lstStartTray = CreateDAL().GetListByLocationCode(locationCode);
if (lstStartTray.Count > 0)
{
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复码盘!", lstInTask[0].CN_S_TASK_NO));
}
}
List GetModel = BLLCreator.Create(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().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));
}
DataTable dt = BLLCreator.Create().GetTrayDetail(strTrayCode);
return OperateResult.Succeed(strTrayCode, dt);
}
///
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult CheckMpTray(string trayCode)
{
if (string.IsNullOrEmpty(trayCode))
{
return OperateResult.Error("请传入托盘号参数!");
}
//判断货位是否绑定托盘
List lstStartTray = CreateDAL().GetListByTrayCode(trayCode);
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(trayCode);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许码盘!", lstInTask[0].CN_S_TASK_NO));
}
if (lstStartTray.Count > 0)
{
List GetModel = BLLCreator.Create(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().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));
}
DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode);
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt);
}
else
{
DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode);
return OperateResult.Succeed("", dt);
}
}
#endregion
#region 简易码盘保存
///
/// 码盘
///
/// 数据Json
/// 登陆信息实体
///
/// [HANHE(XDL)] CREATED BY 2018-11-17
public OperateResult SaveSimPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity)
{
OperateResult operateResult = new OperateResult();
string trayNo = entity.CN_S_TRAY_CODE;
try
{
List trayInfoList = new List();
//删除托盘物料关联主子表
//拼接托盘物料关联主子表
List TrayItemMstlst = new List();
List TrayItemDtllst = new List();
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().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_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_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 lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayNo });
operateResult = UseTransaction(trans =>
{
//删除主表
CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayNo }, trans);
//删除子表
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
{
CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
}
if (TrayItemMstlst.Any())
{
//新增托盘物料关联主表
CreateDAL>().AddRange(TrayItemMstlst, trans);
}
if (TrayItemDtllst.Any())
{
CreateDAL>().AddRange(TrayItemDtllst, trans);
}
});
}
catch (Exception ex)
{
return OperateResult.Error(ex.Message.ToString());
}
//成功后,赋值托盘编码
if (operateResult.Success)
{
operateResult.Data = trayNo;
}
return operateResult;
}
#endregion
#region 唯一码码盘保存
///
/// 码盘
///
/// 数据Json
/// 登陆信息实体
///
/// [HANHE(XDL)] CREATED BY 2018-11-17
public OperateResult SaveUniPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity)
{
OperateResult operateResult = new OperateResult();
string trayNo = entity.CN_S_TRAY_CODE;
try
{
List trayInfoList = new List();
//删除托盘物料关联主子表
//拼接托盘物料关联主子表
List TrayItemMstlst = new List();
List TrayItemUpdateMstlst = new List();
List TrayItemDtllst = new List();
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_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_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().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_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_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
//判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行
var result = CreateDAL().CheckExists(trayItemMstEntity);
var parentGuid = "";
if (result.Any())
{
trayItemMstEntity.CN_GUID = result[0].CN_GUID;
TrayItemUpdateMstlst.Add(trayItemMstEntity);
parentGuid = result[0].CN_GUID;
}
else
{
TrayItemMstlst.Add(trayItemMstEntity);
parentGuid = trayItemMstEntity.CN_GUID;
}
Log.Info("SaveSimPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity));
#region 拼接托盘物料关联子表实体
var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_ITEM_STATE.Trim() == Group_List[i].CN_S_ITEM_STATE.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_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString();
dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY);
dtlentity.CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString();
dtlentity.CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString();
dtlentity.CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION;
dtlentity.CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION;
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
}
operateResult = UseTransaction(trans =>
{
if (TrayItemMstlst.Any())
{
//新增托盘物料关联主表
CreateDAL>().AddRange(TrayItemMstlst, trans);
}
if (TrayItemUpdateMstlst.Any())
{
//更新托盘物料关联主表
var aa = CreateDAL().UpdateMstQty(TrayItemUpdateMstlst, trans);
Log.Info("===>更新托盘物料关联主表", "");
Log.Info("===>影响行数", aa.AffectedRows.ToString());
}
if (TrayItemDtllst.Any())
{
CreateDAL>().AddRange(TrayItemDtllst, trans);
}
});
}
catch (Exception ex)
{
return OperateResult.Error(ex.Message.ToString());
}
//成功后,赋值托盘编码
if (operateResult.Success)
{
operateResult.Data = trayNo;
}
return operateResult;
}
#endregion
#region 根据入库单码盘保存
///
/// 码盘
///
/// 数据Json
/// 登陆信息实体
///
/// [HANHE(XDL)] CREATED BY 2018-11-17
public OperateResult SaveRkdPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity)
{
OperateResult operateResult = new OperateResult();
string trayNo = entity.CN_S_TRAY_CODE;
try
{
List trayInfoList = new List();
//删除托盘物料关联主子表
//拼接托盘物料关联主子表
List TrayItemMstlst = new List();
List TrayItemUpdateMstlst = new List();
List TrayItemDtllst = new List();
Log.Info("SaveRkdPalletItemRelation===>传参:====>", 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_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_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(),
CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY)
}).ToList();
Log.Info("SaveRkdPalletItemRelation===>Group_List:====>", JsonConvert.SerializeObject(Group_List));
for (int i = 0; i < Group_List.Count; i++)
{
AutoBomItemEntity itemenity = CreateDAL().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_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_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
//判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行
var result = CreateDAL().CheckExists(trayItemMstEntity);
var parentGuid = "";
if (result.Any())
{
trayItemMstEntity.CN_GUID = result[0].CN_GUID;
TrayItemUpdateMstlst.Add(trayItemMstEntity);
parentGuid = result[0].CN_GUID;
}
else
{
TrayItemMstlst.Add(trayItemMstEntity);
parentGuid = trayItemMstEntity.CN_GUID;
}
Log.Info("SaveRkdPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity));
#region 拼接托盘物料关联子表实体
var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_ITEM_STATE.Trim() == Group_List[i].CN_S_ITEM_STATE.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 = "";
dtlentity.CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString();
dtlentity.CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString();
dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY);
dtlentity.CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString();
dtlentity.CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString();
dtlentity.CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION;
dtlentity.CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION;
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
}
operateResult = UseTransaction(trans =>
{
if (TrayItemMstlst.Any())
{
//新增托盘物料关联主表
CreateDAL>().AddRange(TrayItemMstlst, trans);
}
if (TrayItemUpdateMstlst.Any())
{
//更新托盘物料关联主表
var aa = CreateDAL().UpdateMstQty(TrayItemUpdateMstlst, trans);
Log.Info("===>更新托盘物料关联主表", "");
Log.Info("===>影响行数", aa.AffectedRows.ToString());
}
if (TrayItemDtllst.Any())
{
CreateDAL>().AddRange(TrayItemDtllst, trans);
}
//根据单号和物料编码更新累积码盘数
CreateDAL().updateOntrayQty(entity.row, trans);
Log.Info("===>根据单号和物料编码更新累积码盘数", "");
});
}
catch (Exception ex)
{
return OperateResult.Error(ex.Message.ToString());
}
//成功后,赋值托盘编码
if (operateResult.Success)
{
operateResult.Data = trayNo;
}
return operateResult;
}
#endregion
#region 托盘货位绑定
///
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
{
if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode))
{
return OperateResult.Error("参数不全!");
}
List upHis = new List();
List addStockQty = new List();
List addAreaQty = new List();
#region 检查托盘与货位是否满足绑定条件
List trayLocationList = new List();
List GetModel = BLLCreator.Create(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().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 lstInTask = CreateDAL().GetTaskByTray(trayCode);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
}
//检查该托盘是否绑定了其他货位
List lstEntity = CreateDAL().GetListByTrayCode(trayCode);
if (lstEntity.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
}
lstEntity = CreateDAL().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 lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 == null ? "" : mstEntity.CN_S_ITEM_STATE,
CN_S_LOCATION_CODE = locationCode,
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : 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 == null ? "" : mstEntity.CN_S_OWNER,
CN_S_PACKING_UNIT = "",
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : 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>().AddRange(trayLocationList, trans);
}
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
//更新货位贮存状态及货位状态
operateResult = CreateDAL>().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>().AddRange(upHis, trans);
//更新仓库量表
if (addStockQty.Any())
BLLCreator.Create().AddList(addStockQty, trans);
//CreateDAL().AddList(addStockQty, trans);
//更新库区量表
if (addAreaQty.Any())
BLLCreator.Create().AddList(addAreaQty, trans);
//CreateDAL().AddList(addAreaQty, trans);
}
}
});
return operateResult;
}
#endregion
#region (PDA接口)托盘货位解绑
///
/// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
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 downHis = new List();
List reduceStockQty = new List();
List reduceAreaQty = new List();
//根据托盘码删除
if (!string.IsNullOrEmpty(trayCode))
{
#region 判断托盘与货位是否满足解绑条件
//判断托盘是否绑定货位
List lstEntity = CreateDAL().GetListByTrayCode(trayCode);
if (lstEntity.Count == 0)
{
return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!");
}
List GetModel = BLLCreator.Create(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().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
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//获取原托盘中的数据
List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 ? "" : dltEntity.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_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
down.CN_S_TRAY_CODE = trayCode;
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 仓库量表
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 库区量表
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>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
//更新货位贮存状态
operateResult = CreateDAL>().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().ReduceStockQty(reduceStockQty, trans);
//更新库区量表
if (reduceAreaQty.Any())
CreateDAL().ReduceAreaQty(reduceAreaQty, trans);
//下架记录
if (downHis.Any())
CreateDAL>().AddRange(downHis, trans);
}
}
});
return operateResult;
}
//根据货位码删除
if (!string.IsNullOrEmpty(locationCode))
{
#region 判断托盘与货位是否满足解绑条件
//判断货位是否绑定托盘
List lstEntity = CreateDAL().GetListByLocationCode(locationCode);
if (lstEntity.Count == 0)
{
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
}
List GetModel = BLLCreator.Create(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().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
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//获取原托盘中的数据
List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 = dltEntity.CN_F_QUANTITY;
down.CN_S_LOT_NO = dltEntity.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;
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;
down.CN_S_PACKING_UNIT = "";
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
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 仓库量表
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 库区量表
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>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//更新货位贮存状态
operateResult = CreateDAL>().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 (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//下架记录
if (downHis.Any())
CreateDAL>().AddRange(downHis, trans);
//更新仓库量表
if (reduceStockQty.Any())
CreateDAL().ReduceStockQty(reduceStockQty, trans);
//更新库区量表
if (reduceAreaQty.Any())
CreateDAL().ReduceAreaQty(reduceAreaQty, trans);
}
}
});
}
return operateResult;
}
#endregion
#region 整托上架
///
/// 整托执行上架
///
/// Json集合
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2018-12-12
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 lstTmpArea = new List();
lstTmpArea.Add(new areaPriorClass { areaCode = endAreaCode, Prior = 1 });
InAssignEntity iAe = new InAssignEntity()
{
lstAreaPrior = lstTmpArea,
logicAreaCode = "",
objectCode = trayCode,
lockLocation = false,//是否需要锁定货位
needCalLock = false
};
iAe.lstDevice = null;
InAssignResultEntity irEresult = BLLCreator.Create().InAssign(iAe);
if (!irEresult.Success)
{
return OperateResult.Error(irEresult.Msg);//货位获取失败!
}
else
{
locationCode = irEresult.locationCode.ToString();
}
}
#region 货位逻辑判断检测
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().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().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 lstStartTray = CreateDAL().GetListByLocationCode(deviceNo);
if (lstStartTray.Count == 0)
{
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
}
}
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().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().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().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 lstEndTray = CreateDAL().GetListByLocationCode(locationCode);
if (lstEndTray.Count > 0)
{
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
}
#endregion
List TrayLocationlst = new List();
List Group_List = new List();
//生成入库任务
List taskEntityList = new List();
//生成入库任务
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 = CreateDAL>().Add(taskEntity, trans);
//锁定目的位置货位-预入库锁定
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
operateResult = CreateDAL().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().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().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().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
}
re = new OtherSysApi().SendAmsCreateTask(taskEntity);
if (!re.Success)
{
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
}
});
return operateResult;
}
#endregion
#region (PDA接口)检查入库起点是否可用
///
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult CheckInStockLocation(string locationCode)
{
if (string.IsNullOrEmpty(locationCode))
{
return OperateResult.Error("请传入货位号参数!");
}
string strTrayCode = "";
//判断货位是否绑定托盘
List lstStartTray = CreateDAL().GetListByLocationCode(locationCode);
if (lstStartTray.Count > 0)
{
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
}
List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + lstStartTray[0].CN_S_TRAY_CODE + "'");
if (lstMst.Count == 0)
{
return OperateResult.Error(string.Format("当前货位{0}绑定的托盘没有物料信息,不允许入库!", locationCode));
}
}
List GetModel = BLLCreator.Create(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().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));
}
DataTable dt = BLLCreator.Create().GetTrayItemDetail(strTrayCode);
return OperateResult.Succeed(strTrayCode, dt);
}
///
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult CheckInStockTray(string trayCode)
{
if (string.IsNullOrEmpty(trayCode))
{
return OperateResult.Error("请传入托盘号参数!");
}
List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + trayCode + "'");
if (lstMst.Count == 0)
{
return OperateResult.Error(string.Format("当前托盘{0}没有物料信息,不允许入库!", trayCode));
}
//判断货位是否绑定托盘
List lstStartTray = CreateDAL().GetListByTrayCode(trayCode);
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(trayCode);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
}
if (lstStartTray.Count > 0)
{
List GetModel = BLLCreator.Create(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().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));
}
DataTable dt = BLLCreator.Create().GetTrayItemDetail(trayCode);
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt);
}
else
{
DataTable dt = BLLCreator.Create().GetTrayItemDetail(trayCode);
return OperateResult.Succeed("", dt);
}
}
#endregion
#region(PDA接口)托盘货位绑定带码盘
///
/// 加生成任务接口模拟AMS接口调用出入库,
///
///
///
///
public OperateResult LoadAndUnload(HH.WMS.Entitys.Basic.LocationTrayItmRelEntity entity, RedisUserEntity userEntity)
{
OperateResult result = new OperateResult();
List upHis = new List();
List downHis = new List();
if (entity.type == 1)
{
#region 绑定
#region 检验货位是否可用
List trayLocationList = new List();
List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'");
if (GetModel.Count == 0)
{
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
}
//货位存储状态:非空
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 lstEntity = CreateDAL().GetListByLocationCode(entity.location);
if (lstEntity.Count > 0)
{
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
}
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
areaModel = CreateDAL().GetAreaModelByLocation(entity.location);
if (areaModel == null)
{
//非法的目的货位
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location));
}
#endregion
#region 检验托盘是否可用
if (!string.IsNullOrEmpty(entity.trayCode))
{
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(entity.trayCode);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
}
//检查该托盘是否绑定了其他货位
lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode);
if (lstEntity.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
}
}
else
{
var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
entity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
if (string.IsNullOrEmpty(entity.trayCode))
{
return OperateResult.Error("获取Autobom托盘号异常,请检查是否配置虚拟托盘生成规则");
}
}
#endregion
#region 拼接处理数据
//拼接托盘物料关联主子表
List TrayItemMstlst = new List();
List TrayItemDtllst = new List();
var Group_List = entity.itemData.GroupBy(x => new
{
x.itemCode,
x.itemState,
x.owner
}).Select(g => new TrayItemRow
{
CN_S_TRAY_CODE = entity.trayCode,
CN_S_TRAY_GRID = "1",
CN_S_ITEM_CODE = g.FirstOrDefault().itemCode.Trim(),
CN_S_ITEM_STATE = g.FirstOrDefault().itemState.Trim(),
CN_S_OWNER = g.FirstOrDefault().owner.Trim(),
CN_F_QUANTITY = g.Sum(p => p.qty)
}).ToList();
for (int i = 0; i < Group_List.Count; i++)
{
AutoBomItemEntity itemenity = CreateDAL().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.trayCode,
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_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_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
#region 拼接托盘物料关联子表实体
TrayItemMstlst.Add(trayItemMstEntity);
var parentGuid = trayItemMstEntity.CN_GUID;
var dtl_List = entity.itemData.Where(o => o.owner.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.itemCode.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
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].lotNo.ToString();
dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].qty);
dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].batchNo.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);
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 = trayItemMstEntity.CN_S_FIGURE_NO,
CN_S_ITEM_CODE = trayItemMstEntity.CN_S_ITEM_CODE,
CN_F_QUANTITY = dtlentity.CN_F_QUANTITY,
CN_S_ITEM_NAME = trayItemMstEntity.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = trayItemMstEntity.CN_S_ITEM_STATE,
CN_S_LOCATION_CODE = entity.location,
CN_S_LOT_NO = dtlentity.CN_S_LOT_NO,
CN_S_MEASURE_UNIT = trayItemMstEntity.CN_S_MEASURE_UNIT,
CN_S_MODEL = trayItemMstEntity.CN_S_MODEL,
CN_S_MODIFY = userEntity.CN_S_NAME,
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
CN_S_OWNER = trayItemMstEntity.CN_S_OWNER,
CN_S_PACKING_UNIT = "",
CN_S_PRODUCTION_BATCH = dtlentity.CN_S_PRODUCTION_BATCH,
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = entity.trayCode,
CN_S_TRAY_GRID = "1",
CN_T_CREATE = DateTime.Now,
CN_T_MODIFY = DateTime.Now,
CN_S_OP_FROM = "PDA绑定上架",
CN_S_EXT1 = ""
});
}
#endregion
}
//获取原托盘中的数据
List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.trayCode });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 = dltEntity.CN_F_QUANTITY;
down.CN_S_LOT_NO = dltEntity.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;
down.CN_S_LOCATION_CODE = entity.location;
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;
down.CN_S_PACKING_UNIT = "";
down.CN_S_PRODUCTION_BATCH = dltEntity.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 = entity.trayCode;
down.CN_S_TRAY_GRID = "1";
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
down.CN_S_OP_FROM = "PDA解绑下架";
down.CN_S_EXT1 = "";
downHis.Add(down);
#endregion
}
}
#region 仓库量表
List 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();
List 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 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();
List 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
//拼接托盘货位实体
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
CN_S_TRAY_CODE = entity.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 = entity.location,
CN_N_INDEX = 1,
CN_S_CREATOR = userEntity.CN_S_LOGIN,
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
CN_T_CREATE = DateTime.Now
};
#endregion
result = UseTransaction(trans =>
{
#region 事务
//删除原托盘中绑定的物料
CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
//删除子表
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
{
CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
}
if (TrayItemMstlst.Any())
{
//新增托盘物料关联主表
CreateDAL>().AddRange(TrayItemMstlst, trans);
}
if (TrayItemDtllst.Any())
{
CreateDAL>().AddRange(TrayItemDtllst, trans);
}
//Log.Info("LoadAndUnload", "7");
CreateDAL>().Add(trayLocation, trans);
//更新货位贮存状态及货位状态
result = CreateDAL>().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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
if (result.AffectedRows == 0)
{
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
}
//上架记录
if (upHis.Any())
CreateDAL>().AddRange(upHis, trans);
//下架记录
if (downHis.Any())
CreateDAL>().AddRange(downHis, trans);
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//更新仓库量表
if (addStockQty.Any())
CreateDAL().AddStockQty(addStockQty, trans);
if (reduceStockQty.Any())
CreateDAL().ReduceStockQty(reduceStockQty, trans);
//更新库区量表
if (addAreaQty.Any())
CreateDAL().AddAreaQty(addAreaQty, trans);
if (reduceAreaQty.Any())
CreateDAL().ReduceAreaQty(reduceAreaQty, trans);
}
}
#endregion
});
#endregion
}
else if (entity.type == 2)
{
//根据托盘码删除
if (!string.IsNullOrEmpty(entity.trayCode))
{
#region 根据托盘解除绑定
#region 判断托盘货位是否满足解绑条件
//判断托盘是否绑定货位
List lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode);
if (lstEntity.Count == 0)
{
return OperateResult.Error("当前托盘没有绑定货位,不需要绑定!");
}
List GetModel = BLLCreator.Create(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()));
}
//货位存储状态:非空
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));
}
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
areaModel = CreateDAL().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()));
}
#endregion
//获取原托盘中的数据
List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.trayCode });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 = dltEntity.CN_F_QUANTITY;
down.CN_S_LOT_NO = dltEntity.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;
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;
down.CN_S_PACKING_UNIT = "";
down.CN_S_PRODUCTION_BATCH = dltEntity.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 = entity.trayCode;
down.CN_S_TRAY_GRID = "1";
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
down.CN_S_OP_FROM = "PDA解绑下架";
down.CN_S_EXT1 = "";
downHis.Add(down);
#endregion
}
}
#region 仓库量表
List 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 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
result = UseTransaction(trans =>
{
string waitlocationCode = lstEntity[0].CN_S_LOCATION_CODE.ToString();
//根据托盘删除关联
CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
//删除托盘物料关联
//删除原托盘中绑定的物料
CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
//删除子表
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
{
CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
}
//更新货位贮存状态
result = CreateDAL>().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 (result.AffectedRows == 0)
{
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
}
//下架记录
if (downHis.Any())
CreateDAL>().AddRange(downHis, trans);
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//更新仓库量表
if (reduceStockQty.Any())
CreateDAL().ReduceStockQty(reduceStockQty, trans);
//更新库区量表
if (reduceAreaQty.Any())
CreateDAL().ReduceAreaQty(reduceAreaQty, trans);
}
}
});
return result;
#endregion
}
//根据货位码删除
if (!string.IsNullOrEmpty(entity.location))
{
#region 根据货位解除绑定
#region 判断托盘与货位是否满足解绑条件
//判断货位是否绑定托盘
List lstEntity = CreateDAL().GetListByLocationCode(entity.location);
if (lstEntity.Count == 0)
{
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
}
List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'");
if (GetModel.Count == 0)
{
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", entity.location));
}
//货位存储状态:非空
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
{
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_USE_STATE));
}
//货位状态:正常
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
{
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_LOCATION_STATE));
}
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
areaModel = CreateDAL().GetAreaModelByLocation(entity.location);
if (areaModel == null)
{
//非法的目的货位
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location));
}
#endregion
//获取原托盘中的数据
List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().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 = dltEntity.CN_F_QUANTITY;
down.CN_S_LOT_NO = dltEntity.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;
down.CN_S_LOCATION_CODE = entity.location;
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;
down.CN_S_PACKING_UNIT = "";
down.CN_S_PRODUCTION_BATCH = dltEntity.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解绑下架";
down.CN_S_EXT1 = "";
downHis.Add(down);
#endregion
}
}
#region 仓库量表
List 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 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
result = UseTransaction(trans =>
{
# region 执行事务
string waitlocationCode = entity.location;
//根据货位删除关联
CreateDAL>().Delete(new { CN_S_LOCATION_CODE = entity.location }, trans);
//删除托盘物料关联
//删除原托盘中绑定的物料
result = CreateDAL>().Delete(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }, trans);
//删除子表
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
{
CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
}
//更新货位贮存状态
result = CreateDAL>().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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
if (result.AffectedRows == 0)
{
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
}
//下架记录
if (downHis.Any())
CreateDAL>().AddRange(downHis, trans);
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//更新仓库量表
if (reduceStockQty.Any())
CreateDAL().ReduceStockQty(reduceStockQty, trans);
//更新库区量表
if (reduceAreaQty.Any())
CreateDAL().ReduceAreaQty(reduceAreaQty, trans);
}
}
#endregion
});
return result;
#endregion
}
}
return result;
}
#endregion
#region PDA专用 生成任务
///
/// PDA专用 生成任务
///
///
///
///
///
///
///
///
public OperateResult CreateTransTask(string startPosition, string endPosition, string taskPriority, string tranType, string projectCode, RedisUserEntity userEntity)
{
OperateResult result = new OperateResult();
#region 货位逻辑判断检测
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startPosition + "'");
if (startlocation == null)
{
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!");
}
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
{
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
}
AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startPosition);
if (startArea == null)
{
//非法的目的货位
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startPosition));
}
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
{
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
}
}
//判断货位是否绑定托盘
List lstStartTray = CreateDAL().GetListByLocationCode(startPosition);
if (lstStartTray.Count == 0)
{
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
}
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + endPosition + "'");
if (endlocation == null)
{
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
}
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
{
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
}
AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endPosition);
if (endArea == null)
{
//非法的目的货位
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", startPosition));
}
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
{
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
}
//判断货位是否绑定托盘
List lstEndTray = CreateDAL().GetListByLocationCode(endPosition);
if (lstEndTray.Count > 0)
{
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
}
#endregion
//生成入库任务
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_TransTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
if (string.IsNullOrEmpty(taskNo))
{
return OperateResult.Error("任务号生成失败,请检查autobom中是否配置了转运任务号生成规则!");
}
taskEntity.CN_S_TASK_NO = taskNo;
taskEntity.CN_S_STATE = Constants.TaskStateList[Constants.TaskExecState_NoExec];
taskEntity.CN_T_CREATE = DateTime.Now;
taskEntity.CN_S_TASK_TYPE = tranType;
taskEntity.CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE;
taskEntity.CN_S_START_BIT = startPosition;
taskEntity.CN_S_END_BIT = endPosition;
taskEntity.CN_N_PRIORITY = int.Parse(taskPriority);
taskEntity.CN_S_PROJECT_CODE = projectCode;
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
taskEntity.CN_T_CREATE = DateTime.Now;
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
taskEntity.CN_T_MODIFY = DateTime.Now;
result = UseTransaction(trans =>
{
#region 事务
//新增任务
CreateDAL>().Add(taskEntity, trans);
//锁定目的位置货位-预入库锁定
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
result = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
if (result.AffectedRows == 0)
{
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
}
BLLCreator.Create