using HH.Redis.ReisModel;
|
using HH.WMS.BLL.Basic;
|
using HH.WMS.Common;
|
using HH.WMS.DAL;
|
using HH.WMS.DAL.Basic;
|
using HH.WMS.DAL.InStock;
|
using HH.WMS.DAL.SysMgr;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Entitys;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HH.WMS.BLL.Pda
|
{
|
public class HsBLL : DapperBaseBLL
|
{
|
#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(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));
|
}
|
|
if (!string.IsNullOrEmpty(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));
|
}
|
//检查该托盘是否绑定了其他货位
|
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
|
string _trayCode = trayCode;
|
if (string.IsNullOrEmpty(_trayCode))
|
{
|
//生成虚拟托盘
|
var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
|
_trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(_trayCode))
|
{
|
return OperateResult.Error("生成虚拟托盘失败");
|
}
|
}
|
|
//拼接托盘货位实体
|
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 && !string.IsNullOrEmpty(trayCode))
|
{
|
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
|
}
|
}
|