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 托盘货位绑定
///
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
///
/// 托盘编码
/// 货位编码
/// 用户实体
///
/// [HANHE(XDL)] CREATED BY 2019-04-17
public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
{
if (string.IsNullOrEmpty(locationCode))
{
return OperateResult.Error("货位不可为空!");
}
List upHis = new List();
List addStockQty = new List();
List addAreaQty = new List();
#region 检查托盘与货位是否满足绑定条件
List trayLocationList = new List();
List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
if (GetModel.Count == 0)
{
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
}
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
areaModel = CreateDAL().GetAreaModelByLocation(locationCode);
if (areaModel == null)
{
//非法的目的货位
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
}
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
//货位存储状态:非空
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
{
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
}
}
//货位状态:正常
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
{
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
}
if (!string.IsNullOrEmpty(trayCode))
{
//检查该托盘是否在(未执行或执行中的)任务中
List lstInTask = CreateDAL().GetTaskByTray(trayCode);
if (lstInTask.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
}
//检查该托盘是否绑定了其他货位
List lstEntity = CreateDAL().GetListByTrayCode(trayCode);
if (lstEntity.Count > 0)
{
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
}
lstEntity = CreateDAL().GetListByLocationCode(locationCode);
if (lstEntity.Count > 0)
{
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
}
}
#endregion
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 lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode });
List lstOriginalDTL = new List();
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
{
lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
{
#region 拼接上架记录表
upHis.Add(new TN_WM_UP_HISTORYEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_F_PACKING_QTY = 0,
CN_S_CREATOR = userEntity.CN_S_LOGIN,
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO,
CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE,
CN_F_QUANTITY = dltEntity.CN_F_QUANTITY,
CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE,
CN_S_LOCATION_CODE = locationCode,
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : dltEntity.CN_S_LOT_NO,
CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT,
CN_S_MODEL = mstEntity.CN_S_MODEL,
CN_S_MODIFY = userEntity.CN_S_NAME,
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER,
CN_S_PACKING_UNIT = "",
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : dltEntity.CN_S_PRODUCTION_BATCH,
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE,
CN_S_TRAY_CODE = trayCode,
CN_S_TRAY_GRID = "1",
CN_T_CREATE = DateTime.Now,
CN_T_MODIFY = DateTime.Now,
CN_S_OP_FROM = "PDA绑定上架",
});
#endregion
}
}
#region 仓库量表
addStockQty = upHis.GroupBy(x => new
{
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
CN_S_OWNER = x.CN_S_OWNER,
CN_S_MODEL = x.CN_S_MODEL,
CN_S_LOT_NO = x.CN_S_LOT_NO,
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
}).Select(y =>
{
return new TN_WM_B_STOCK_QTYEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
CN_S_OWNER = y.Key.CN_S_OWNER,
CN_S_MODEL = y.Key.CN_S_MODEL,
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
};
}).ToList();
#endregion
#region 库区量表
addAreaQty = upHis.GroupBy(x => new
{
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
CN_S_OWNER = x.CN_S_OWNER,
CN_S_LOT_NO = x.CN_S_LOT_NO,
CN_S_MODEL = x.CN_S_MODEL,
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
}).Select(y =>
{
return new TN_WM_B_AREA_QTYEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
CN_S_OWNER = y.Key.CN_S_OWNER,
CN_S_MODEL = y.Key.CN_S_MODEL,
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
};
}).ToList();
#endregion
}
}
OperateResult operateResult = UseTransaction(trans =>
{
//写入托盘货位关联表
if (trayLocationList.Any())
{
CreateDAL>().AddRange(trayLocationList, trans);
}
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
//更新货位贮存状态及货位状态
operateResult = CreateDAL>().Update(
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
if (operateResult.AffectedRows == 0)
{
throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化");
}
}
if (areaModel.CN_C_IS_INVENTORY != null)
{
if (areaModel.CN_C_IS_INVENTORY == "Y")
{
//上架记录
if (upHis.Any())
CreateDAL>().AddRange(upHis, trans);
//更新仓库量表
if (addStockQty.Any())
BLLCreator.Create().AddList(addStockQty, trans);
//CreateDAL().AddList(addStockQty, trans);
//更新库区量表
if (addAreaQty.Any())
BLLCreator.Create().AddList(addAreaQty, trans);
//CreateDAL().AddList(addAreaQty, trans);
}
}
});
return operateResult;
}
#endregion
}
}