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.Common.Response;
|
using HH.WMS.DAL;
|
using HH.WMS.DAL.Algorithm;
|
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.Algorithm;
|
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 YmBLL : DapperBaseBLL
|
{
|
#region (PDA接口)检查码盘起点是否可用
|
/// <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 CheckMpLocation(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_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));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(strTrayCode);
|
return OperateResult.Succeed(strTrayCode, dt);
|
}
|
/// <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 CheckMpTray(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断货位是否绑定托盘
|
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));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(trayCode);
|
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt);
|
}
|
else
|
{
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(trayCode);
|
return OperateResult.Succeed("", dt);
|
}
|
}
|
#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_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<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);
|
}
|
|
});
|
|
|
|
}
|
catch (Exception ex)
|
{
|
return OperateResult.Error(ex.Message.ToString());
|
}
|
//成功后,赋值托盘编码
|
if (operateResult.Success)
|
{
|
operateResult.Data = trayNo;
|
}
|
return operateResult;
|
}
|
#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 SaveUniPalletItemRelation(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_MSTEntity> TrayItemUpdateMstlst = 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_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<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_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<TN_WM_B_TRAY_ITEM_RELDAL>().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<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(TrayItemMstlst, trans);
|
}
|
if (TrayItemUpdateMstlst.Any())
|
{
|
//更新托盘物料关联主表
|
var aa = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMstQty(TrayItemUpdateMstlst, trans);
|
Log.Info("===>更新托盘物料关联主表", "");
|
Log.Info("===>影响行数", aa.AffectedRows.ToString());
|
}
|
if (TrayItemDtllst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(TrayItemDtllst, trans);
|
}
|
|
|
});
|
}
|
catch (Exception ex)
|
{
|
return OperateResult.Error(ex.Message.ToString());
|
}
|
//成功后,赋值托盘编码
|
if (operateResult.Success)
|
{
|
operateResult.Data = trayNo;
|
}
|
return operateResult;
|
}
|
#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 SaveRkdPalletItemRelation(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_MSTEntity> TrayItemUpdateMstlst = 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("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<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_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<TN_WM_B_TRAY_ITEM_RELDAL>().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<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(TrayItemMstlst, trans);
|
}
|
if (TrayItemUpdateMstlst.Any())
|
{
|
//更新托盘物料关联主表
|
var aa = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMstQty(TrayItemUpdateMstlst, trans);
|
Log.Info("===>更新托盘物料关联主表", "");
|
Log.Info("===>影响行数", aa.AffectedRows.ToString());
|
}
|
if (TrayItemDtllst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(TrayItemDtllst, trans);
|
}
|
//根据单号和物料编码更新累积码盘数
|
CreateDAL<TN_WM_INCREASE_INVENTORYDAL>().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 托盘货位绑定
|
/// <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 == 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<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 (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 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>();
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = new List<TN_WM_B_STOCK_QTYEntity>();
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = new List<TN_WM_B_AREA_QTYEntity>();
|
//根据托盘码删除
|
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
|
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 拼接下架记录表
|
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<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
|
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 = 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 = 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<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 (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
//更新仓库量表
|
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 整托上架
|
/// <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 = endAreaCode, Prior = 1 });
|
|
InAssignEntity iAe = new InAssignEntity()
|
{
|
lstAreaPrior = lstTmpArea,
|
logicAreaCode = "",
|
objectCode = trayCode,
|
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 = 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);
|
|
}
|
re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
}
|
});
|
|
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 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));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemDetail(strTrayCode);
|
return OperateResult.Succeed(strTrayCode, dt);
|
}
|
/// <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));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemDetail(trayCode);
|
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt);
|
}
|
else
|
{
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemDetail(trayCode);
|
return OperateResult.Succeed("", dt);
|
}
|
}
|
#endregion
|
|
#region(PDA接口)托盘货位绑定带码盘
|
/// <summary>
|
/// 加生成任务接口模拟AMS接口调用出入库,
|
/// </summary>
|
/// <param name="entity"></param>
|
/// <param name="userEntity"></param>
|
/// <returns></returns>
|
public OperateResult LoadAndUnload(HH.WMS.Entitys.Basic.LocationTrayItmRelEntity entity, RedisUserEntity userEntity)
|
{
|
OperateResult result = new OperateResult();
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
|
if (entity.type == 1)
|
{
|
#region 绑定
|
#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='" + 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<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().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<TN_AB_STOCK_LOCATIONDAL>().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<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(entity.trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检查该托盘是否绑定了其他货位
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().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<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>();
|
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<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.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<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.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_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<TN_WM_B_STOCK_QTYEntity> 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<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> 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<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
|
|
//拼接托盘货位实体
|
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<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, 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);
|
}
|
|
|
//Log.Info("LoadAndUnload", "7");
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Add(trayLocation, trans);
|
|
|
//更新货位贮存状态及货位状态
|
result = 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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (result.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
//下架记录
|
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 (addStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddStockQty(addStockQty, trans);
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (addAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(addAreaQty, trans);
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
#endregion
|
});
|
#endregion
|
}
|
else if (entity.type == 2)
|
{
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(entity.trayCode))
|
{
|
#region 根据托盘解除绑定
|
#region 判断托盘货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(entity.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()));
|
}
|
|
//货位存储状态:非空
|
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<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()));
|
}
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.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_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<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
|
result = UseTransaction(trans =>
|
{
|
string waitlocationCode = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
|
|
//删除托盘物料关联
|
//删除原托盘中绑定的物料
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, 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);
|
}
|
|
//更新货位贮存状态
|
result = 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 (result.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 result;
|
#endregion
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(entity.location))
|
{
|
#region 根据货位解除绑定
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(entity.location);
|
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='" + 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<TN_AB_STOCK_LOCATIONDAL>().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<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 = 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<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
|
result = UseTransaction(trans =>
|
{
|
# region 执行事务
|
string waitlocationCode = entity.location;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = entity.location }, trans);
|
|
//删除托盘物料关联
|
//删除原托盘中绑定的物料
|
result = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }, 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);
|
}
|
//更新货位贮存状态
|
result = 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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
if (result.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);
|
}
|
|
}
|
#endregion
|
|
});
|
return result;
|
#endregion
|
}
|
}
|
return result;
|
|
}
|
#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));
|
}
|
|
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(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") && 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;
|
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<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(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 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>();
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
//调用算法计算起点货位
|
List<areaPriorClass> lstArea = new List<areaPriorClass>();
|
areaPriorClass areaClass = new areaPriorClass();
|
areaClass.areaCode = endAreaCode;
|
areaClass.Prior = 1;
|
lstArea.Add(areaClass);
|
//调用出库算法,获取出库货位
|
OutAssignEnitty oAe = new OutAssignEnitty()
|
{
|
lstAreaPrior = lstArea,
|
stockCode = entity.CN_S_STOCK_CODE,
|
itemCode = entity.CN_S_ITEM_CODE,
|
traySpec = entity.CN_S_TRAY_SPEC,
|
lockLocation = false,//是否需要锁定货位
|
needCalLock = false
|
};
|
OutAssignResultEntity oaEresult = BLLCreator.Create<Out_AlgorBLL>().OutAssign(oAe);
|
if (!oaEresult.Success)
|
{
|
return OperateResult.Error(oaEresult.Msg);//货位获取失败!
|
}
|
else
|
{
|
locationCode = oaEresult.locationCode.ToString();
|
}
|
}
|
|
|
#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") && 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 =>
|
{
|
|
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);
|
|
}
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 验证料箱码是否属于当前托盘
|
public bool CheckUniqueIsCurTray(string tryaCode, string uniqueCode)
|
{
|
return CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().CheckUniqueIsCurTray(tryaCode, uniqueCode);
|
}
|
#endregion
|
|
#region 上料确认(整托、部分)
|
|
public OperateResult UpMaterialSure(string trayCode, string type, string uniqueCodes, LogPara logPara)
|
{
|
try
|
{
|
var trayItemMstList = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
var trayItemDtlList = type == "all"
|
? BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemDtlByTrayCode(trayCode)
|
: DALCreator.Create<TN_WM_B_TRAY_ITEM_RELDAL>().GetDtlByUniques(uniqueCodes);
|
var trayLocaiton = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_TRAY_CODE = trayCode });
|
|
var transResult = UseTransaction(trans =>
|
{
|
//删除托盘货位关联
|
var result = DALCreator.Create<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
|
Log.Detail(logPara, "删除托盘货位关联结果:" + (result.Success ? "成功!" : ("失败" + result.Msg)));
|
if (!result.Success) return;
|
|
//删除料箱托盘关联
|
if (type.Equals("all"))
|
{
|
//删除托盘产品关联主表、子表
|
result = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().Delete(" CN_S_TRAY_CODE='" + trayCode + "' ", trans, logPara);
|
if (!result.Success) return;
|
|
//修改托盘状态为空
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
{
|
CN_S_USE_STATE = "空"
|
}, new
|
{
|
CN_S_TRAY_CODE = trayCode
|
}, trans);
|
Log.Detail(logPara, "修改托盘状态为空!");
|
}
|
else if (type.Equals("part"))
|
{
|
var useState = "空";
|
|
foreach (var trayItemMst in trayItemMstList)
|
{
|
var curTrayItemDtls = trayItemDtlList.Where(e => e.CN_PARENT_GUID.Equals(trayItemMst.CN_GUID));
|
if (curTrayItemDtls.Count() > 0)
|
{
|
trayItemMst.CN_F_QUANTITY -= curTrayItemDtls.Count();
|
if (trayItemMst.CN_F_QUANTITY > 0)
|
{
|
useState = "不满";
|
result = DALCreator.Create<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { trayItemMst.CN_F_QUANTITY }, new { CN_GUID = trayItemMst.CN_GUID }, trans);
|
}
|
else
|
{
|
result = DALCreator.Create<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_GUID = trayItemMst.CN_GUID }, trans);
|
}
|
Log.Detail(logPara, "主表" + trayItemMst.CN_GUID + "降量结果:" + (result.Success ? "成功!" : ("失败" + result.Msg)));
|
}
|
}
|
|
foreach (var trayItemDtl in trayItemDtlList)
|
{
|
//删除托盘物料关联子表
|
result = DALCreator.Create<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_GUID = trayItemDtl.CN_GUID }, trans);
|
Log.Detail(logPara, "删除托盘物料关联子表结果:" + (result.Success ? "成功!" : ("失败" + result.Msg)));
|
if (!result.Success) return;
|
}
|
|
//修改托盘状态为空
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().Update(new
|
{
|
CN_S_USE_STATE = useState
|
}, new
|
{
|
CN_S_TRAY_CODE = trayCode
|
}, trans);
|
}
|
|
//修改货位扩展表
|
result = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().UpdateLocationExtState(trayLocaiton.CN_S_LOCATION_CODE, "", "空", "", trans);
|
Log.Detail(logPara, "货位扩展表的状态置为空结果:" + JsonConvert.SerializeObject(result));
|
});
|
|
//if (transResult.Success)
|
//{
|
// foreach (var trayItemDtl in trayItemDtlList)
|
// {
|
// //更新BARCODE表使用状态
|
// var resultCur = BLLCreator.Create<MONGO_PRINT_BARCODEBLL>().UpdateUpMetarialState(trayItemDtl.CN_S_UNIQUE_CODE, "N");
|
// Log.Detail(logPara, "唯一码:" + trayItemDtl.CN_S_UNIQUE_CODE + ",更新BARCODE表使用状态结果:" + (resultCur ? "成功!" : "失败"));
|
// }
|
//}
|
return transResult;
|
}
|
catch (Exception ex)
|
{
|
Log.Detail(logPara, "上料失败!" + ex.Message);
|
return new OperateResult { Success = false, Msg = ex.Message };
|
}
|
}
|
|
#endregion
|
|
#region 检查托盘(上料)
|
|
public OperateResult CheckTrayByUpMaterial(string trayCode)
|
{
|
try
|
{
|
bool result = DALCreator.Create<TN_WM_B_TRAY_LOCATIONDAL>().CheckTrayBindLoc(trayCode);
|
if (!result)
|
{
|
return OperateResult.Error("托盘未绑定货位!");
|
}
|
result = DALCreator.Create<TN_WM_B_TRAY_ITEM_RELDAL>().CheckCurTrayIsHasItem(trayCode);
|
if (!result)
|
{
|
return OperateResult.Error("当前是空托盘!");
|
}
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
return OperateResult.Error(ex.Message);
|
}
|
}
|
|
#endregion
|
|
#region 检查叫料货位是否可用
|
|
|
public OperateResult CheckLocationJL(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));
|
}
|
|
return OperateResult.Succeed("");
|
}
|
#endregion
|
|
#region 增加库区分配量
|
|
public void AddAllocQty(string trayCode, string stockCode, string areaCode, LogPara logPara)
|
{
|
Log.Detail(logPara, "升起始库区分配量");
|
var trayItemMsts = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
if (trayItemMsts != null)
|
{
|
if (trayItemMsts.Count > 0)
|
{
|
foreach (var trayItemMst in trayItemMsts)
|
{
|
trayItemMst.CN_F_QUANTITY = 0;
|
trayItemMst.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID });
|
foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
|
{
|
trayItemMst.CN_F_QUANTITY += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO);
|
}
|
Log.Detail(logPara, "库区:" + areaCode + "," + LogDescribe.Content(trayItemMst));
|
|
var curReuslt = CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAllocQty(new TN_WM_B_AREA_QTYEntity
|
{
|
CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,
|
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = areaCode,
|
CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO,
|
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH
|
}, null, logPara);
|
Log.Detail(logPara, LogDescribe.Content(trayItemMst) + " 库区量表执行结果:" + LogDescribe.Content(curReuslt));
|
curReuslt = CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddAllocQty(new TN_WM_B_STOCK_QTYEntity
|
{
|
CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,
|
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = stockCode,
|
CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO,
|
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH
|
}, null, logPara);
|
Log.Detail(logPara, LogDescribe.Content(trayItemMst) + " 仓库量表执行结果:" + LogDescribe.Content(curReuslt));
|
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
#region 空托回库检测托盘码
|
/// <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 CheckTrayCodeKT(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断货位是否绑定托盘
|
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<TN_WM_B_TRAY_ITEM_MSTEntity> ITEMMSTLIST = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
if (ITEMMSTLIST.Any())
|
{
|
return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME));
|
}
|
////货位存储状态:非空
|
//if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
//{
|
// return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE));
|
//}
|
return OperateResult.Succeed("", lstStartTray[0].CN_S_LOCATION_CODE);
|
}
|
else
|
{
|
return OperateResult.Succeed("", "");
|
}
|
}
|
#endregion
|
|
#region 空托回库检测货位码
|
/// <summary>
|
/// 空托回库检测货位码和托盘码
|
/// </summary>
|
/// <param name="locationCode"></param>
|
/// <returns></returns>
|
public OperateResult CheckLocationCodeKT(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
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<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> ITEMMSTLIST = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE });
|
if (ITEMMSTLIST.Any())
|
{
|
return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME));
|
}
|
}
|
return OperateResult.Succeed("", strTrayCode);
|
}
|
#endregion
|
|
|
|
|
|
#region 粤美PDA-整排解绑
|
/// <summary>
|
/// 整排解绑
|
/// </summary>
|
/// <param name="rowCode">排号</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(XDL)] created 2020-9-4</History>
|
public OperateResult RowUnBind(string rowCode, RedisUserEntity userEntity)
|
{
|
|
Log.Info("RowUnBind===>传参:====>", "rowCode:" + rowCode);
|
|
//判断货位是否绑定托盘
|
List<TN_WM_LOCATION_EXTEntity> lstLocationExtList = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetModel(" where CN_S_ROW='" + rowCode + "'");
|
if (!lstLocationExtList.Any())
|
{
|
return OperateResult.Error("排解绑失败,未找到排 " + rowCode + " 下辖货位信息!");
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
foreach (TN_WM_LOCATION_EXTEntity item in lstLocationExtList)
|
{
|
//删除托盘货位关联表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = item.CN_S_LOCATION_CODE }, trans);
|
|
//货位状态置成正常 贮存状态空
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_Normal, CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = item.CN_S_LOCATION_CODE }, trans);
|
}
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 粤美PDA-成品空筐绑定
|
/// <summary>
|
/// PDA-成品空筐绑定
|
/// </summary>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(XDL)] created 2020-9-4</History>
|
public OperateResult EndproductkkBind(string locationCode, RedisUserEntity userEntity)
|
{
|
Log.Info("EndproductkkBind===>传参:====>", "locationCode:" + locationCode);
|
|
//判断货位是否合法
|
TN_WM_LOCATION_EXTEntity LocationExtModel = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (LocationExtModel == null)
|
{
|
return OperateResult.Error("货位码 " + locationCode + " 不存在!");
|
}
|
else
|
{
|
//货位状态必须是正常+空
|
if (LocationExtModel.CN_S_LOCATION_STATE != Constants.Location_State_Normal || LocationExtModel.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error("当前货位状态:" + LocationExtModel.CN_S_LOCATION_STATE + ",贮存状态:" + LocationExtModel.CN_S_USE_STATE + "!");
|
}
|
}
|
|
//判断货位是否绑定托盘
|
TN_WM_B_TRAY_LOCATIONEntity trayLocationModel = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (trayLocationModel != null)
|
{
|
return OperateResult.Error("货位 " + locationCode + " 上已经存在容器:" + trayLocationModel.CN_S_TRAY_CODE + "!");
|
}
|
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + userEntity.CN_S_ORG_GUID + "\",\"orgFlag\":\"" + userEntity.CN_S_ORGFLAG + "\"}";
|
string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(trayNo))
|
{
|
return OperateResult.Error("生成虚拟托盘编码失败!");
|
}
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = LocationExtModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = LocationExtModel.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayNo,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
|
Log.Info("TrayLocationlst", JsonConvert.SerializeObject(TrayLocationlst));
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//新增托盘货位关联表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(TrayLocationlst, trans);
|
|
//货位状态置成正常 贮存状态满
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_Normal, CN_S_USE_STATE = Constants.Use_State_Full }, new { CN_S_LOCATION_CODE = locationCode }, trans);
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 粤美PDA-成品解绑
|
/// <summary>
|
/// 成品解绑
|
/// </summary>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(XDL)] created 2020-9-7</History>
|
public OperateResult EndProductUnbind(string locationCode, RedisUserEntity userEntity)
|
{
|
Log.Info("EndProductUnbind===>传参:====>", "locationCode:" + locationCode);
|
|
//判断货位是否合法
|
TN_WM_LOCATION_EXTEntity LocationExtModel = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (LocationExtModel == null)
|
{
|
return OperateResult.Error("货位码 " + locationCode + " 不存在!");
|
}
|
else
|
{
|
//货位状态必须是空
|
if (LocationExtModel.CN_S_USE_STATE == Constants.Use_State_Empty)
|
{
|
return OperateResult.Error("当前货位贮存状态:" + LocationExtModel.CN_S_USE_STATE + "!");
|
}
|
}
|
|
//判断货位是否绑定托盘
|
TN_WM_B_TRAY_LOCATIONEntity trayLocationModel = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (trayLocationModel == null)
|
{
|
return OperateResult.Error("货位 " + locationCode + " 上没有容器!");
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//删除托盘货位关联表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
|
|
//货位状态置成正常 贮存状态空
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_Normal, CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = locationCode }, trans);
|
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 粤美PDA-原料扫码反馈入库
|
/// <summary>
|
/// 原料扫码反馈入库-根据货位找到对应物料
|
/// </summary>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(XDL)] created 2020-9-7</History>
|
public OperateResult GetLocationWithItem(string locationCode, RedisUserEntity userEntity)
|
{
|
Log.Info("GetLocationWithItem===>传参:====>", "locationCode:" + locationCode);
|
|
//判断货位是否合法
|
TN_WM_LOCATION_EXTEntity LocationExtModel = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (LocationExtModel == null)
|
{
|
return OperateResult.Error("货位码 " + locationCode + " 不存在!");
|
}
|
|
//货位不为空的情况下,需要找货位所在逻辑分区,找到逻辑分区所对应的物料
|
if (!string.IsNullOrEmpty(locationCode))
|
{
|
List<AutoBomPartition_Item_REntity> Pie = CreateDAL<TN_WMS_AREADAL>().GetitemListByLocation(locationCode);
|
List<AutoBomItemEntity> itemList = new List<AutoBomItemEntity>();
|
|
if (Pie.Any())
|
{
|
foreach (var item in Pie)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_NAME);
|
if (itemenity != null)
|
{
|
itemList.Add(itemenity);
|
}
|
}
|
}
|
|
if (itemList.Any())
|
{
|
return OperateResult.Succeed("", itemList);
|
}
|
else
|
return OperateResult.Error("货位:" + locationCode + "未设置逻辑分区,或者已设置逻辑分区但未关联物料!");
|
}
|
else
|
{
|
return OperateResult.Error("货位码不可为空!");
|
}
|
|
}
|
|
/// <summary>
|
/// 原料扫码反馈入库-保存
|
/// </summary>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="itemCode">物料编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(XDL)] created 2020-9-7</History>
|
public OperateResult MaterialScanStockIn(string locationCode, string itemCode, RedisUserEntity userEntity)
|
{
|
Log.Info("MaterialScanStockIn===>传参:====>", "locationCode:" + locationCode + ",itemCode:" + itemCode);
|
|
if (string.IsNullOrEmpty(locationCode) || string.IsNullOrEmpty(itemCode))
|
{
|
return OperateResult.Error("参数缺失!");
|
}
|
|
//判断货位是否合法
|
TN_WM_LOCATION_EXTEntity LocationExtModel = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (LocationExtModel == null)
|
{
|
return OperateResult.Error("货位码 " + locationCode + " 不存在!");
|
}
|
|
AutoBomItemEntity itemEnity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(itemCode);
|
if (itemEnity == null)
|
{
|
return OperateResult.Error("物料 " + itemCode + " 不存在!");
|
}
|
|
//判断货位是否绑定托盘
|
TN_WM_B_TRAY_LOCATIONEntity trayLocationModel = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (trayLocationModel != null)
|
{
|
return OperateResult.Error("货位 " + locationCode + " 上已经存在容器:" + trayLocationModel.CN_S_TRAY_CODE + "!");
|
}
|
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + userEntity.CN_S_ORG_GUID + "\",\"orgFlag\":\"" + userEntity.CN_S_ORGFLAG + "\"}";
|
string trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("生成虚拟托盘编码失败!");
|
}
|
|
#region 组织托盘货位关联
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = LocationExtModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = LocationExtModel.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
|
Log.Info("TrayLocationlst", JsonConvert.SerializeObject(TrayLocationlst));
|
#endregion
|
|
#region 组织托盘物料关联
|
//拼接托盘物料关联主表实体
|
var mstGuid = Guid.NewGuid().ToString().ToUpper();
|
TN_WM_B_TRAY_ITEM_MSTEntity trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_S_OWNER = Constants.DefaultOwner,
|
CN_S_ITEM_CODE = itemEnity.CN_S_ITEM_CODE,
|
CN_S_LOT_NO = "",
|
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_MEASURE_UNIT = itemEnity.CN_S_MEASURE_UNIT,
|
CN_S_ITEM_STATE = Constants.ItemState_Qualified,
|
CN_F_QUANTITY = 1,
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = 1
|
};
|
Log.Info("===>trayItemMstEntity:", JsonConvert.SerializeObject(trayItemMstEntity));
|
|
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>();
|
|
trayItemMstlst.Add(trayItemMstEntity);
|
|
TrayItemDtllst.Add(new TN_WM_B_TRAY_ITEM_DTLEntity
|
{
|
CN_GUID = Guid.NewGuid().ToString().ToUpper(),
|
CN_PARENT_GUID = mstGuid,
|
CN_S_UNIQUE_CODE = "",
|
CN_S_LOT_NO = "",
|
CN_S_SERIAL_NO = "",
|
CN_S_PACKING_UNIT = itemEnity.CN_S_PACK_UNIT,
|
CN_F_PACKING_QTY = itemEnity.CN_F_MIN_PACK_QTY,
|
CN_F_QUANTITY = 1,
|
CN_S_VENDOR_NO = "",
|
CN_S_VENDOR_NAME = "",
|
CN_F_PURCHASE_PRICE = 0,
|
CN_F_RETAIL_PRICE = 0,
|
//CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION,
|
//CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION,
|
CN_S_PRODUCTION_BATCH = "",
|
CN_S_NOTE = "",
|
CN_S_EXT1 = "",
|
CN_S_EXT2 = "",
|
CN_S_EXT3 = "",
|
CN_S_EXT4 = "",
|
CN_S_EXT5 = "",
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now
|
});
|
|
Log.Info("===>TrayItemDtllst:==>", JsonConvert.SerializeObject(TrayItemDtllst));
|
|
#endregion
|
|
#region 拼接还料上架记录实体
|
|
List<TN_WM_UP_HISTORYEntity> upHistoryList = new List<TN_WM_UP_HISTORYEntity>();
|
|
if (trayItemMstEntity != null)
|
{
|
var entity = (from left in trayItemMstlst
|
join right in TrayItemDtllst on left.CN_GUID equals right.CN_PARENT_GUID
|
select new TN_WM_UP_HISTORYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = left.CN_S_TRAY_GRID,
|
CN_S_OWNER = left.CN_S_OWNER,
|
CN_S_ITEM_CODE = left.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = left.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = left.CN_S_FIGURE_NO,
|
CN_S_MODEL = left.CN_S_MODEL,
|
CN_S_ITEM_STATE = left.CN_S_ITEM_STATE,
|
CN_F_QUANTITY = right.CN_F_QUANTITY,
|
CN_S_MEASURE_UNIT = left.CN_S_MEASURE_UNIT,
|
CN_S_LOT_NO = right.CN_S_LOT_NO,
|
CN_S_PACKING_UNIT = right.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = right.CN_F_PACKING_QTY,
|
CN_S_PRODUCTION_BATCH = right.CN_S_PRODUCTION_BATCH,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "原料扫码反馈入库",
|
CN_S_FROM_NO = "",
|
CN_S_STOCK_CODE = LocationExtModel.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = LocationExtModel.CN_S_AREA_CODE
|
}).ToList();
|
Log.Info("===>开始反馈入库记录:====>", JsonConvert.SerializeObject(entity));
|
upHistoryList.AddRange(entity);
|
}
|
|
Log.Info("===>upHistoryList", JsonConvert.SerializeObject(upHistoryList));
|
|
#endregion
|
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//绑定托盘货位关联表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(TrayLocationlst, trans);
|
Log.Info("===>新增TN_WM_B_TRAY_LOCATION", "");
|
|
//影响托盘物料关联主子表
|
if (trayItemMstlst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(trayItemMstlst, trans);
|
}
|
Log.Info("===>新增TN_WM_B_TRAY_ITEM_MST", "");
|
|
if (TrayItemDtllst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(TrayItemDtllst, trans);
|
}
|
Log.Info("===>新增TN_WM_B_TRAY_ITEM_DTL", "");
|
|
//新增入库记录
|
if (upHistoryList.Any())
|
{
|
//新增入库记录
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHistoryList, trans);
|
Log.Info("===>新增入库记录", "");
|
}
|
|
//货位状态置成正常 贮存状态满
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = Constants.Location_State_Normal, CN_S_USE_STATE = Constants.Use_State_Full }, new { CN_S_LOCATION_CODE = locationCode }, trans);
|
|
|
});
|
return operateResult;
|
|
}
|
|
#endregion
|
|
#region 粤美 生成原料呼叫任务
|
/// <summary>
|
/// 生成原料呼叫任务
|
/// </summary>
|
/// <param name="existsEmpty"></param>
|
/// <param name="current"></param>
|
/// <param name="exec"></param>
|
/// <returns></returns>
|
public OperateResult GenerateRawmateriaCall(bool existsEmpty, YmLocationMapDto current, ref TN_WM_PRODUCTLINE_EXECEntity exec)
|
{
|
exec = exec ?? new TN_WM_PRODUCTLINE_EXECEntity();
|
try
|
{
|
//存在空托,先生成空托入库的任务
|
if (existsEmpty)
|
{
|
//存在空托
|
exec.CN_B_EXISTS_EMPTY = true;
|
//调用空托入作业区
|
InWorkAreaEntity inWorkArea = new InWorkAreaEntity()
|
{
|
startBit = current.location[0],
|
needCreateAMSTask = Constants.Y,
|
isTransport = Constants.Y
|
};
|
var inWorkAreaList = new List<InWorkAreaEntity>() { inWorkArea };
|
//调用
|
ExternalResponse inResponse = BLLCreator.Create<WmsApiForMasymBLL>().InWorkArea(inWorkAreaList);
|
if (!inResponse.success)
|
{
|
//记录最后一次失败消息
|
exec.CN_S_EMPTY_LASTMSG = inResponse.errMsg;
|
return OperateResult.Error("生成空框入库失败:" + inResponse.errMsg);
|
}
|
//空托入生成成功
|
exec.CN_B_EMPTY_COMPLETE = true;
|
}
|
//调用满托出作业区
|
OutWorkAreaEntity outWorkArea = new OutWorkAreaEntity()
|
{
|
Data = new List<OutWorkDataEntity>()
|
{
|
new OutWorkDataEntity(){
|
ItemCode = current.itemCode
|
}
|
},
|
endBit = current.location[0],
|
startArea = current.itemArea,
|
needCreateAMSTask = Constants.Y,
|
IsTransport = Constants.Y
|
};
|
var outWorkAreaList = new List<OutWorkAreaEntity>() { outWorkArea };
|
//调用
|
ExternalResponse outResponse = BLLCreator.Create<WmsApiForMasymBLL>().OutWorkArea(outWorkAreaList);
|
if (!outResponse.success)
|
{
|
//记录最后一次失败消息
|
exec.CN_S_FULL_LASTMSG = outResponse.errMsg;
|
return OperateResult.Error("生成满框出库失败:" + outResponse.errMsg);
|
}
|
//满托出生成成功
|
exec.CN_B_FULL_COMPLETE = true;
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
return OperateResult.Error(ex.Message);
|
}
|
}
|
#endregion
|
|
#region 粤美PDA-检验区按排下达任务
|
/// <summary>
|
/// 根据库区查询排信息
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <returns></returns>
|
/// <History>[Hanhe(LY)] created 2020-9-7</History>
|
public OperateResult GetRowByArea(string areaCode)
|
{
|
//判断库区编码是否合法
|
List<TN_WM_LOCATION_EXTEntity> lstRow = DALCreator.Create<TN_WM_LOCATION_EXTDAL>().GetLocationByArea(areaCode);
|
if (lstRow.Count == 0)
|
{
|
return OperateResult.Error("根据库区编码" + areaCode + " 查询不到所属排信息!");
|
}
|
OperateResult operateResult = OperateResult.Succeed("", lstRow);
|
return operateResult;
|
}
|
/// <summary>
|
/// 根据排号获取货位信息
|
/// </summary>
|
/// <param name="rowNo"></param>
|
/// <returns></returns>
|
/// <History>[Hanhe(LY)] created 2020-9-7</History>
|
public OperateResult GetLocationByRow(string rowNo)
|
{
|
//判断排号是否合法
|
List<TN_WM_LOCATION_EXTEntity> lstLocation = DALCreator.Create<TN_WM_LOCATION_EXTDAL>().GetLocationByRow(rowNo);
|
if (lstLocation.Count == 0)
|
{
|
return OperateResult.Error("根据排号 " + rowNo + " 查询不到所属货位!");
|
}
|
OperateResult operateResult = OperateResult.Succeed("", lstLocation);
|
return operateResult;
|
}
|
|
/// <summary>
|
/// 检验区按排下达出库任务
|
/// </summary>
|
/// <param name="rowNo">排号</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[Hanhe(LY)] created 2020-9-7</History>
|
public OperateResult CreateTaskByRow(string rowNo, RedisUserEntity userEntity)
|
{
|
Log.Info("CreateTaskByRow===>传参:====>", "rowNo:" + rowNo);
|
|
|
if (string.IsNullOrEmpty(rowNo))
|
{
|
return OperateResult.Error("参数缺失!");
|
}
|
//判断排号是否合法
|
List<TN_WM_LOCATION_EXTEntity> lstLocation = DALCreator.Create<TN_WM_LOCATION_EXTDAL>().GetLocationByRow(rowNo);
|
if (lstLocation.Count == 0)
|
{
|
return OperateResult.Error("根据排号 " + rowNo + " 查询不到所属货位!");
|
}
|
lstLocation.RemoveAll(o => o.CN_S_LOCATION_STATE == Constants.Location_State_OutLock);
|
|
if (lstLocation.Where(o => o.CN_S_LOCATION_STATE == Constants.Location_State_InLock).Count() > 0)
|
{
|
return OperateResult.Error("排" + rowNo + "中有预入库锁定的货位,不能下达出库任务!");
|
}
|
if (lstLocation.Where(o => o.CN_S_USE_STATE == Constants.Use_State_Full).Count() == 0)
|
{
|
return OperateResult.Error("排" + rowNo + "中没有可出库货位,不能下达出库任务!");
|
}
|
lstLocation.RemoveAll(o => o.CN_S_USE_STATE == Constants.Use_State_Empty);
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCodeList(lstLocation.Select(o => o.CN_S_LOCATION_CODE).ToList());
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstFilter = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
OperateResult operateResult = new OperateResult();
|
List<InWorkAreaEntity> inWorkAreaList = new List<InWorkAreaEntity>();
|
foreach (TN_WM_LOCATION_EXTEntity model in lstLocation)
|
{
|
InWorkAreaEntity inEntity = new InWorkAreaEntity();
|
inEntity.startBit = model.CN_S_LOCATION_CODE;
|
inEntity.isTransport = "Y";
|
inEntity.needCreateAMSTask = "Y";
|
lstFilter = lstEntity.Where(o => o.CN_S_LOCATION_CODE == model.CN_S_LOCATION_CODE).ToList();
|
if (lstFilter.Count > 0)
|
{
|
inEntity.trayCode = lstFilter[0].CN_S_TRAY_CODE;
|
}
|
inWorkAreaList.Add(inEntity);
|
}
|
|
ExternalResponse eResponse = BLLCreator.Create<WmsApiForMasymBLL>().InWorkArea(inWorkAreaList);
|
if (eResponse.success)
|
{
|
operateResult = OperateResult.Succeed("下达任务成功");
|
}
|
else
|
{
|
operateResult = OperateResult.Error("下达任务失败,其中成功" + eResponse.okList.Count.ToString() + "个,失败" + eResponse.failList.Count.ToString() + "个,失败原因为:" + eResponse.errMsg);
|
}
|
return operateResult;
|
|
}
|
|
#endregion
|
|
#region 删除托盘物料
|
/// <summary>
|
/// 删除托盘物料
|
/// </summary>
|
/// <param name="trayCode"></param>
|
/// <returns></returns>
|
public OperateResult DeleteTrayItem(string trayCode)
|
{
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
var trayItems = BLLCreator.CreateDapper<TN_WM_B_TRAY_ITEM_MSTEntity>().GetList(new
|
{
|
CN_S_TRAY_CODE = trayCode
|
});
|
if (trayItems.Any())
|
{
|
return UseTransaction(trans =>
|
{
|
trayItems.ForEach(m =>
|
{
|
CreateDapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>().Delete(new
|
{
|
CN_GUID = m.CN_GUID
|
}, trans);
|
CreateDapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>().Delete(new
|
{
|
CN_PARENT_GUID = m.CN_GUID
|
}, trans);
|
});
|
});
|
}
|
}
|
return OperateResult.Succeed();
|
}
|
#endregion
|
|
}
|
}
|