using HH.Redis.ReisModel; using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.External; using HH.WMS.BLL.Interface; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.Common.Para; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.InStock; using HH.WMS.DAL.OutStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace HH.WMS.BLL.InStock { public class TN_WM_B_TRAY_LOCATIONBLL : DapperBaseBLL { #region GET public TN_WM_B_TRAY_LOCATIONEntity GetByLocationCode(string locationCode) { return BLLCreator.Create>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode }); } #endregion #region DELETE public OperateResult Delete(string trayCode, string locationCode, IDbTransaction trans = null, LogPara logPara = null) { //解绑托盘与货位的关系 if (logPara != null) Log.Detail(logPara, "解绑任务的托盘" + trayCode + "和货位" + locationCode + "关联!"); return CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayCode, CN_S_LOCATION_CODE = locationCode }, trans); } #endregion #region 可用货位查询 public List GetAGVLocationStatus(string stockCode, string strLocation) { return CreateDAL().GetAGVLocationStatus(stockCode, strLocation); } #endregion #region 根据货位找托盘及其物料 /// /// 根据货位获取货位上托盘物料信息 /// /// 货位编码 /// /// [HANHE(XDL)] CREATED BY 2018-11-13 public DataTable GetTrayByLocationCode(string CN_S_LOCATION_CODE) { return CreateDAL().GetTrayByLocationCode(CN_S_LOCATION_CODE); } #endregion #region 物料上架 /// /// 物料上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-14 //拼接托盘物料关联主子表 private List TrayItemMstlst = new List(); private List TrayItemUpdateMstlst = new List(); private List TrayItemDtllst = new List(); public OperateResult SaveLocationPalletRelation(ItemOnShelfEntity entity, RedisUserEntity userEntity) { Log.Info("===>进入物料上架接口:SaveLocationPalletRelation", ""); Log.Info("===>传递参数", JsonConvert.SerializeObject(entity)); if (entity != null && entity.row.Count > 0) entity.row.ForEach(x => { if (string.IsNullOrEmpty(x.CN_S_ITEM_STATE)) x.CN_S_ITEM_STATE = "合格"; }); string deviceNo = entity.CN_S_DEVICE_NO; string locationCode = entity.CN_S_LOCATION_CODE; string trayCode = entity.CN_S_TRAY_CODE; List trayInfoList = new List(); List TrayLocationlst = new List(); AutoBomLocationEntity location = BLLCreator.Create().GetLocationModel(locationCode); if (location == null && !string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("未在Mongo货位表中找到货位 " + locationCode + " 的实体!"); } if (!string.IsNullOrEmpty(trayCode)) { List trayLocationByTray = CreateDAL>().GetList(new { CN_S_TRAY_CODE = trayCode }); Log.Info("===>查找托盘是否在库:", trayLocationByTray.Count.ToString()); if (trayLocationByTray.Any()) { //托盘在库-补料上架 Log.Info("===>托盘在库-补料上架:====>", ""); DoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity); } else { //托盘不在库,但是有明细-补料,整托上架 if (entity.row.Any()) { Log.Info("===>托盘不在库,但是有明细-补料,整托上架:====>", ""); DoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }); #endregion } else { //前台没传明细,则整托上架 Log.Info("===>托盘不在库,也没有明细,整托上架:====>", ""); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }); #endregion } } } else { List trayLocationByLocation = CreateDAL>().GetList(new { CN_S_LOCATION_CODE = locationCode }); if (!trayLocationByLocation.Any())//货位上没有托盘,生成虚拟托盘-补料上架 { #region 生成虚拟托盘实体 TN_WM_B_TRAY_INFOEntity trayInfo = new TN_WM_B_TRAY_INFOEntity(); 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("生成虚拟托盘编码失败!"); } trayInfo.CN_S_TRAY_CODE = trayNo; trayInfo.CN_S_TRAY_TYPE = Constants.VirtualTray; trayInfo.CN_S_TRAY_CODE_EXT = ""; trayInfo.CN_S_SPEC = ""; trayInfo.CN_S_SORTING_CODE = ""; trayInfo.CN_S_STATE = "使用中"; trayInfo.CN_S_USE_STATE = "满"; trayInfo.CN_N_COLUMN_NUM = 1; trayInfo.CN_F_GROSSWEIGHT = 0; trayInfo.CN_F_LOADBEARING = 0; trayInfo.CN_F_WEIGHT = 0; trayInfo.CN_N_LATTICE_NUM = 1; trayInfo.CN_N_ROW_NUM = 1; trayInfo.CN_S_COLLECT_CODE = ""; trayInfo.CN_S_COLLECT_LOCATION = ""; trayInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN; trayInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME; trayInfo.CN_T_CREATE = DateTime.Now; trayInfo.CN_S_MODIFY = userEntity.CN_S_LOGIN; trayInfo.CN_S_MODIFY_BY = userEntity.CN_S_NAME; trayInfo.CN_T_MODIFY = DateTime.Now; trayInfo.CN_S_DESC = "物料上架生成虚拟托盘"; trayInfoList.Add(trayInfo); #endregion Log.Info("===>没传托盘,货位上也没有托盘,生成虚拟托盘-补料上架:====>", ""); DoFindTrayItemList(trayNo, entity, userEntity); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.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("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst)); #endregion } } //库区量表实体 List AreaQtyList = new List(); //降收货区库区量 List shouHuoLocation = new List(); decimal weight = 0; //汇总本次上架物料总重量 if (string.IsNullOrEmpty(deviceNo)) { var shLocation = CreateDAL().GetSHLocationArea("收货区"); if (!shLocation.Any()) { return OperateResult.Error("未在Mongo库区表中找到收货区实体!"); } //收货区 shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE }); var itemCode = "";//存在问题的物料编码 foreach (var item in entity.row) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE); if (itemenity == null) { return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!"); } #region 影响库区量表数据 TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity(); AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString(); AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER; AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO; AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT; AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL; AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO; AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; AreaQtyEntity.CN_S_STOCK_AREA = location.CN_S_AREA_CODE; AreaQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE; AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString()); AreaQtyEntity.CN_F_ALLOC_QTY = 0; AreaQtyEntity.CN_F_PLANNED_QTY = 0; AreaQtyEntity.CN_S_NOTE = ""; AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"' and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"' and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"' and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' "; AreaQtyList.Add(AreaQtyEntity); Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList)); #endregion #region 汇总本次上架物料总重量 ////获取物料重量 //var fTw = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE).CN_F_TW; //string DataType = ConfigurationManager.ConnectionStrings["DataType"].ToString(); //if (fTw == 0 && DataType == "JXXWMS") //{ // itemCode = item.CN_S_ITEM_CODE; // break; //} ////更新托盘实际重量 //weight = weight + (fTw) * item.CN_F_QUANTITY; #endregion } if (!string.IsNullOrEmpty(itemCode)) { return OperateResult.Error("未在Mongo物料表中找到物料 " + itemCode + " 的重量!"); } } else { //生成入库任务号 string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.TaskNo_In + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; string opNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(opNo)) { return OperateResult.Error("入库任务号生成失败!"); } //undo //…… //…… //…… //自动的情况下,需要生成入库任务 ,规划路线,调用AMS指令 } #region 拼接入库上架记录实体 var increaseEntity = CreateDAL>().GetSingleEntity(new { CN_S_LOT_NO = entity.row[0].CN_S_LOT_NO }); if (increaseEntity == null) { return OperateResult.Error("根据批次号未获取到入库单实体!"); } List upHistoryList = new List(); if (TrayItemMstlst.Any()) { var entity1 = (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 = location.CN_S_LOCATION_CODE, 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 = increaseEntity.CN_S_OP_NO, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_STOCK_AREA = location.CN_S_AREA_CODE }).ToList(); upHistoryList.AddRange(entity1); } if (TrayItemUpdateMstlst.Any()) { var entity2 = (from left in TrayItemUpdateMstlst 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 = location.CN_S_LOCATION_CODE, 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 = increaseEntity.CN_S_OP_NO, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_STOCK_AREA = location.CN_S_AREA_CODE }).ToList(); upHistoryList.AddRange(entity2); } Log.Info("===>upHistoryList", JsonConvert.SerializeObject(upHistoryList)); #endregion OperateResult operateResult = UseTransaction(trans => { if (trayInfoList.Any()) { //新增容器信息表(虚拟托盘) CreateDAL>().AddRange(trayInfoList, trans); Log.Info("===>新增容器信息表-虚拟托盘", ""); } if (TrayLocationlst.Any()) { //新增托盘货位关联 CreateDAL>().AddRange(TrayLocationlst, trans); Log.Info("===>新增托盘货位关联", ""); } if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); Log.Info("===>新增托盘物料关联主表", ""); } if (TrayItemUpdateMstlst.Any()) { //更新托盘物料关联主表 var aa = CreateDAL().UpdateMstQty(TrayItemUpdateMstlst, trans); Log.Info("===>更新托盘物料关联主表", ""); Log.Info("===>影响行数", aa.AffectedRows.ToString()); } if (TrayItemDtllst.Any()) { for (int i = 0; i < TrayItemDtllst.Count; i++) { var aa = CreateDAL().UpdateByCondition(TrayItemDtllst[i], trans);// new { CN_F_QUANTITY = TrayItemDtllst[i].CN_F_QUANTITY }, new { CN_PARENT_GUID = TrayItemDtllst[i].CN_PARENT_GUID, CN_S_UNIQUE_CODE = TrayItemDtllst[i].CN_S_UNIQUE_CODE, CN_S_LOT_NO = TrayItemDtllst[i].CN_S_LOT_NO, CN_S_SERIAL_NO = TrayItemDtllst[i].CN_S_SERIAL_NO, CN_S_PACKING_UNIT = TrayItemDtllst[i].CN_S_PACKING_UNIT, CN_F_PACKING_QTY = TrayItemDtllst[i].CN_F_PACKING_QTY, CN_F_PURCHASE_PRICE = TrayItemDtllst[i].CN_F_PURCHASE_PRICE, CN_F_RETAIL_PRICE = TrayItemDtllst[i].CN_F_RETAIL_PRICE, CN_T_PRODUCTION = TrayItemDtllst[i].CN_T_PRODUCTION, CN_T_EXPIRATION = TrayItemDtllst[i].CN_T_EXPIRATION, CN_S_PRODUCTION_BATCH = TrayItemDtllst[i].CN_S_PRODUCTION_BATCH }, trans); Log.Info("===>影响行数", aa.AffectedRows.ToString()); if (aa.AffectedRows == 0) { CreateDAL>().Add(TrayItemDtllst[i], trans); Log.Info("===>新增托盘物料关联子表", ""); } } } //根据单号和物料编码更新累积上架数 CreateDAL().updateUpselefQty(entity.row, trans); Log.Info("===>根据单号和物料编码更新累积上架数", ""); //根据单号和物料编码更新累积码盘数 CreateDAL().updateOntrayQty(entity.row, trans); Log.Info("===>根据单号和物料编码更新累积码盘数", ""); //更新托盘实际重量 CreateDAL().updateTrayCodeWeight(trayCode, weight, trans); Log.Info("===>更新托盘实际重量", ""); //人工上架情况 if (string.IsNullOrEmpty(deviceNo)) { //影响库区量表 CreateDAL().AddAreaQty(AreaQtyList, trans); Log.Info("===>影响库区量表", ""); //降收货区库区量 AreaQtyList.ForEach(x => { x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE; }); CreateDAL().ReduceAreaQty(AreaQtyList, trans); Log.Info("===>降收货区库区量", ""); //更新货位扩展表状态 CreateDAL().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans); Log.Info("===>更新货位扩展表状态", ""); } else { //生成入库任务 //调用方法,下达AMS指令 } //新增入库记录 if (upHistoryList.Any()) { //新增入库记录 CreateDAL>().AddRange(upHistoryList, trans); Log.Info("===>新增入库记录", JsonConvert.SerializeObject(upHistoryList)); } }); return operateResult; } /// /// 拼接托盘物料关联关系 /// /// /// 数据实体 /// 用户实体 private void DoFindTrayItemList(string trayCode, ItemOnShelfEntity entity, RedisUserEntity userEntity) { Log.Info("===>开始拼接托盘物料关联:", trayCode); 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 ItemRow { 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("===>Group_List:", JsonConvert.SerializeObject(Group_List)); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); Log.Info("===>itemenity:", JsonConvert.SerializeObject(itemenity)); //拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = trayCode, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_LOT_NO = Group_List[i].CN_S_LOT_NO.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = 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 = Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), 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()) }; Log.Info("===>trayItemMstEntity:", JsonConvert.SerializeObject(trayItemMstEntity)); //判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行 var result = CreateDAL().CheckExists(trayItemMstEntity); var parentGuid = ""; if (result.Any()) { trayItemMstEntity.CN_GUID = result[0].CN_GUID; TrayItemUpdateMstlst.Add(trayItemMstEntity); parentGuid = result[0].CN_GUID; } else { TrayItemMstlst.Add(trayItemMstEntity); parentGuid = trayItemMstEntity.CN_GUID; } Log.Info("===>parentGuid:", parentGuid); Log.Info("===>TrayItemMstlst:", JsonConvert.SerializeObject(TrayItemMstlst)); 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++) { TrayItemDtllst.Add(new TN_WM_B_TRAY_ITEM_DTLEntity { CN_GUID = Guid.NewGuid().ToString().ToUpper(), CN_PARENT_GUID = parentGuid, CN_S_UNIQUE_CODE = "",// entity.row[i].CN_S_UNIQUE_CODE.ToString(), CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString(), CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(), CN_S_PACKING_UNIT = dtl_List[j].CN_S_PACKING_UNIT.ToString(), CN_F_PACKING_QTY = Convert.ToDecimal(dtl_List[j].CN_F_PACKING_QTY), CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY), CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(), CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(), CN_F_PURCHASE_PRICE = dtl_List[j].CN_F_PURCHASE_PRICE, CN_F_RETAIL_PRICE = dtl_List[j].CN_F_RETAIL_PRICE, CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION, CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION, CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(), 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:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst)); } } } #endregion #region 还料上架 /// /// 还料上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-14 //拼接还料托盘物料关联主子表 private List HLTrayItemMstlst = new List(); private List HLTrayItemNewOwnerMstlst = new List(); private List HLTrayItemDtllst = new List(); public OperateResult HLSaveLocationPalletRelation(string itemBackNo, ItemOnShelfEntity entity, RedisUserEntity userEntity) { Log.Info("===>进入还料上架接口:HLSaveLocationPalletRelation", ""); Log.Info("===>传递参数", JsonConvert.SerializeObject(entity)); if (entity != null && entity.row.Count > 0) entity.row.ForEach(x => { if (string.IsNullOrEmpty(x.CN_S_ITEM_STATE)) x.CN_S_ITEM_STATE = "合格"; }); string deviceNo = entity.CN_S_DEVICE_NO; string locationCode = entity.CN_S_LOCATION_CODE; string trayCode = entity.CN_S_TRAY_CODE; List trayInfoList = new List(); List TrayLocationlst = new List(); AutoBomLocationEntity location = BLLCreator.Create().GetLocationModel(locationCode); if (location == null) { return OperateResult.Error("未在Mongo货位表中找到货位 " + locationCode + " 的实体!"); } if (!string.IsNullOrEmpty(trayCode)) { List trayLocationByTray = CreateDAL>().GetList(new { CN_S_TRAY_CODE = trayCode }); Log.Info("===>查找托盘是否在库:", trayLocationByTray.Count.ToString()); if (trayLocationByTray.Any()) { //托盘在库-补料上架 Log.Info("===>托盘在库-补料上架:====>", ""); HLDoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity); } else { //托盘不在库,但是有明细-补料,整托上架 if (entity.row.Any()) { Log.Info("===>托盘不在库,但是有明细-补料,整托上架:====>", ""); HLDoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }); #endregion } else { //前台没传明细,则整托上架 Log.Info("===>托盘不在库,也没有明细,整托上架:====>", ""); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }); #endregion } } } else { List trayLocationByLocation = CreateDAL>().GetList(new { CN_S_LOCATION_CODE = locationCode }); if (!trayLocationByLocation.Any())//货位上没有托盘,生成虚拟托盘-补料上架 { #region 生成虚拟托盘实体 TN_WM_B_TRAY_INFOEntity trayInfo = new TN_WM_B_TRAY_INFOEntity(); 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("生成虚拟托盘编码失败!"); } trayInfo.CN_S_TRAY_CODE = trayNo; trayInfo.CN_S_TRAY_TYPE = Constants.VirtualTray; trayInfo.CN_S_TRAY_CODE_EXT = ""; trayInfo.CN_S_SPEC = ""; trayInfo.CN_S_SORTING_CODE = ""; trayInfo.CN_S_STATE = "使用中"; trayInfo.CN_S_USE_STATE = "满"; trayInfo.CN_N_COLUMN_NUM = 1; trayInfo.CN_F_GROSSWEIGHT = 0; trayInfo.CN_F_LOADBEARING = 0; trayInfo.CN_F_WEIGHT = 0; trayInfo.CN_N_LATTICE_NUM = 1; trayInfo.CN_N_ROW_NUM = 1; trayInfo.CN_S_COLLECT_CODE = ""; trayInfo.CN_S_COLLECT_LOCATION = ""; trayInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN; trayInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME; trayInfo.CN_T_CREATE = DateTime.Now; trayInfo.CN_S_MODIFY = userEntity.CN_S_LOGIN; trayInfo.CN_S_MODIFY_BY = userEntity.CN_S_NAME; trayInfo.CN_T_MODIFY = DateTime.Now; trayInfo.CN_S_DESC = "物料上架生成虚拟托盘"; trayInfoList.Add(trayInfo); #endregion Log.Info("===>没传托盘,货位上也没有托盘,生成虚拟托盘-补料上架:====>", ""); HLDoFindTrayItemList(trayNo, entity, userEntity); #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = location.CN_S_AREA_CODE, CN_S_STOCK_CODE = location.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("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst)); #endregion } } //量表实体 List StockQtyList = new List(); List AreaQtyList = new List(); decimal weight = 0; //汇总本次上架物料总重量 if (string.IsNullOrEmpty(deviceNo)) { var itemCode = "";//存在问题的物料编码 foreach (var item in entity.row) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE); if (itemenity == null) { return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!"); } #region 影响仓库量表数据 TN_WM_B_STOCK_QTYEntity StockQtyEntity = new TN_WM_B_STOCK_QTYEntity(); StockQtyEntity.CN_GUID = System.Guid.NewGuid().ToString(); StockQtyEntity.CN_S_OWNER = item.CN_S_OWNER; StockQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; StockQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; StockQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; StockQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO; StockQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT; StockQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL; StockQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO; StockQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; StockQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE; StockQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString()); StockQtyEntity.CN_F_ALLOC_QTY = 0; StockQtyEntity.CN_F_PLANNED_QTY = 0; StockQtyEntity.CN_S_NOTE = ""; StockQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"' and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"' and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' "; StockQtyList.Add(StockQtyEntity); Log.Info("===>拼接仓库量表", JsonConvert.SerializeObject(StockQtyList)); #endregion #region 影响库区量表数据 TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity(); AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString(); AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER; AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO; AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT; AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL; AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO; AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; AreaQtyEntity.CN_S_STOCK_AREA = location.CN_S_AREA_CODE; AreaQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE; AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString()); AreaQtyEntity.CN_F_ALLOC_QTY = 0; AreaQtyEntity.CN_F_PLANNED_QTY = 0; AreaQtyEntity.CN_S_NOTE = ""; AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"' and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"' and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"' and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' "; AreaQtyList.Add(AreaQtyEntity); Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList)); #endregion #region 汇总本次上架物料总重量 ////获取物料重量 //var fTw = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE).CN_F_TW; //if (fTw == 0) //{ // itemCode = item.CN_S_ITEM_CODE; // break; //} ////更新托盘实际重量 //weight = weight + (fTw) * item.CN_F_QUANTITY; #endregion } if (!string.IsNullOrEmpty(itemCode)) { return OperateResult.Error("未在Mongo物料表中找到物料 " + itemCode + " 的重量!"); } } else { string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.Rule_TaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; string opNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); //undo //…… //…… //…… //自动的情况下,需要规划路线,生成入库任务 } List oldOwnerTrayItemList = new List(); if (HLTrayItemMstlst.Any()) { oldOwnerTrayItemList = ReduceOwnerRelMstQty(HLTrayItemMstlst); Log.Info("===>旧货主", JsonConvert.SerializeObject(oldOwnerTrayItemList)); } List trayItemAddMstList = new List(); List trayItemModMstList = new List(); List trayItemAddDtlList = new List(); List trayItemModDtlList = new List(); if (HLTrayItemNewOwnerMstlst.Any()) { //拼接托盘物料关联主子表更新和新增实体 foreach (var item in HLTrayItemNewOwnerMstlst) { string oldP = item.CN_GUID; // var entityExist = CreateDAL>().GetSingleEntity(new { CN_S_OWNER = item.CN_S_OWNER, CN_S_ITEM_CODE = item.CN_S_ITEM_CODE, CN_S_ITEM_STATE = item.CN_S_ITEM_STATE, CN_S_TRAY_CODE = item.CN_S_TRAY_CODE }); if (entityExist != null) { var trayItemModMst = item; trayItemModMst.CN_GUID = entityExist.CN_GUID; trayItemModMstList.Add(trayItemModMst); var modDtlList = HLTrayItemDtllst.Where(x => x.CN_PARENT_GUID == oldP).ToList(); foreach (var itemDtl in modDtlList) { var trayItemModDtl = itemDtl; trayItemModDtl.CN_PARENT_GUID = item.CN_GUID; trayItemModDtlList.Add(trayItemModDtl); } } else { trayItemAddMstList.Add(item); var modDtlList = HLTrayItemDtllst.Where(x => x.CN_PARENT_GUID == oldP).ToList(); trayItemAddDtlList.AddRange(modDtlList); } } } // return OperateResult.Error("bug!"); #region 拼接还料上架记录实体 var increaseEntity = CreateDAL>().GetSingleEntity(new { CN_S_LOT_NO = entity.row[0].CN_S_LOT_NO }); if (increaseEntity == null) { return OperateResult.Error("根据批次号未获取到入库单实体!"); } Log.Info("===>开始还料上架记录:====>", JsonConvert.SerializeObject(increaseEntity)); List upHistoryList = new List(); if (HLTrayItemMstlst.Any()) { Log.Info("===>开始还料上架记录1-A:====>", JsonConvert.SerializeObject(HLTrayItemMstlst)); Log.Info("===>开始还料上架记录1-B:====>", JsonConvert.SerializeObject(HLTrayItemDtllst)); var entity1 = (from left in HLTrayItemMstlst join right in HLTrayItemDtllst 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 = location.CN_S_LOCATION_CODE, 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 = itemBackNo, CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, CN_S_STOCK_AREA = location.CN_S_AREA_CODE }).ToList(); Log.Info("===>开始还料上架记录2:====>", JsonConvert.SerializeObject(entity1)); upHistoryList.AddRange(entity1); } //Log.Info("===>开始还料上架记录3:====>", JsonConvert.SerializeObject(TrayItemUpdateMstlst)); //if (HLTrayItemUpdateMstlst.Any()) //{ // var entity2 = (from left in TrayItemUpdateMstlst // 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 = location.CN_S_LOCATION_CODE, // 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 = increaseEntity.CN_S_OP_NO, // CN_S_STOCK_CODE = location.CN_S_STOCK_CODE, // CN_S_STOCK_AREA = location.CN_S_AREA_CODE // }).ToList(); // Log.Info("===>开始还料上架记录4:====>", JsonConvert.SerializeObject(entity2)); // upHistoryList.AddRange(entity2); //} Log.Info("===>upHistoryList", JsonConvert.SerializeObject(upHistoryList)); #endregion OperateResult operateResult = UseTransaction(trans => { if (trayInfoList.Any()) { //新增容器信息表(虚拟托盘) CreateDAL>().AddRange(trayInfoList, trans); Log.Info("===>新增容器信息表-虚拟托盘", ""); } if (TrayLocationlst.Any()) { //新增托盘货位关联 CreateDAL>().AddRange(TrayLocationlst, trans); Log.Info("===>新增托盘货位关联", ""); } if (HLTrayItemMstlst.Any()) { //下降托盘物料数据量 var bb = CreateDAL().DropTrayItemQty(oldOwnerTrayItemList, null, trans); Log.Info("===>降旧货主所在托盘物料关联主表,影响行数", bb.AffectedRows.ToString()); } if (HLTrayItemNewOwnerMstlst.Any()) { //影响托盘物料关联主子表 if (trayItemAddMstList.Any()) { CreateDAL>().AddRange(trayItemAddMstList, trans); } if (trayItemModMstList.Any()) { CreateDAL().UpdateMstQty(trayItemModMstList, trans); } if (trayItemAddDtlList.Any()) { CreateDAL>().AddRange(trayItemAddDtlList, trans); } if (trayItemModDtlList.Any()) { for (int i = 0; i < trayItemModDtlList.Count; i++) { var aa = CreateDAL().UpdateByCondition(trayItemModDtlList[i], trans);// Log.Info("===>影响行数", aa.AffectedRows.ToString()); if (aa.AffectedRows == 0) { CreateDAL>().Add(trayItemModDtlList[i], trans); Log.Info("===>新增托盘物料关联子表", ""); } } } } //根据单号和物料编码更新累积码盘数 CreateDAL().updateOntrayQty(entity.row, trans); Log.Info("===>根据单号和物料编码更新累积码盘数", ""); //更新托盘实际重量 CreateDAL().updateTrayCodeWeight(trayCode, weight, trans); Log.Info("===>更新托盘实际重量", ""); //更新还料单已完成 if (!string.IsNullOrEmpty(itemBackNo)) { CreateDAL>().Update(new { CN_S_STATE = Constants.State_Completed }, new { CN_S_OP_NO = itemBackNo }, trans); Log.Info("===>更新还料单已完成", ""); } //人工上架情况 if (string.IsNullOrEmpty(deviceNo)) { //降货主所在仓库量 CreateDAL().ReduceOwnerStockQty(StockQtyList, trans); Log.Info("===>降货主所在仓库量", ""); //影响仓库量表-默认货主 CreateDAL().AddStockQty(StockQtyList, trans, true); Log.Info("===>影响仓库量表-默认货主", ""); //降货主所在库区量 CreateDAL().ReduceOwnerAreaQty(AreaQtyList, trans); Log.Info("===>降货主所在库区量", ""); //影响库区量表-默认货主 CreateDAL().AddAreaQty(AreaQtyList, trans, true); Log.Info("===>影响库区量表-默认货主", ""); //更新货位扩展表状态 CreateDAL().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans); Log.Info("===>更新货位扩展表状态", ""); } else { //生成入库任务 //调用方法,下达AMS指令 } //新增入库记录 if (upHistoryList.Any()) { //新增入库记录 CreateDAL>().AddRange(upHistoryList, trans); Log.Info("===>新增入库记录", ""); } // throw new Exception("fanhui"); }); return operateResult; } private List ReduceOwnerRelMstQty(List HLTrayItemMstlst) { //批分 var trayItemMstList = CreateDAL>().GetList(new { CN_S_OWNER = HLTrayItemMstlst.Select(x => x.CN_S_OWNER).ToList(), CN_S_ITEM_CODE = HLTrayItemMstlst.Select(x => x.CN_S_ITEM_CODE).ToList() }); foreach (var trayItemMst in trayItemMstList) { trayItemMst.TrayItemDtlList = new List(); var currentResult = HLTrayItemMstlst.Where(x => x.CN_S_ITEM_CODE == trayItemMst.CN_S_ITEM_CODE && x.CN_S_OWNER == trayItemMst.CN_S_OWNER).ToList(); decimal qty = currentResult.Sum(y => y.CN_F_QUANTITY); if (trayItemMst.CN_F_QUANTITY >= qty) { trayItemMst.CN_F_QUANTITY -= qty; trayItemMst.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }).OrderBy(x => x.CN_S_LOT_NO).ToList(); //空的生产批次放后面 currentResult = currentResult.Select(x => new { index = string.IsNullOrEmpty(x.CN_S_PRODUCTION_BATCH) ? 0 : 1, x }).OrderByDescending(y => y.index).ThenBy(z => z.x.CN_S_PRODUCTION_BATCH).Select(m => m.x).ToList(); //算法策略 List lstStrate = BLLCreator.Create().GetStrateListByAreaOrStock("", "", Constants.Out) .OrderByDescending(a => a.CN_N_PRIORITY).Select(o => o.CN_S_CODE).ToList(); foreach (string stegy in lstStrate) { //逐个策略进行计算 switch (stegy) { case "FirstInFirstOut": trayItemMst.TrayItemDtlList = trayItemMst.TrayItemDtlList.OrderBy(o => o.CN_S_LOT_NO).ToList(); break; case "FirstWarrantFirstOut": trayItemMst.TrayItemDtlList = trayItemMst.TrayItemDtlList.Select(x => new { index = string.IsNullOrEmpty(x.CN_S_PRODUCTION_BATCH) ? 0 : 1, x }).OrderByDescending(y => y.index).ThenBy(z => z.x.CN_S_PRODUCTION_BATCH).Select(m => m.x).ToList(); break; } } foreach (var cs in currentResult) { var csQty = cs.CN_F_QUANTITY; foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { if (csQty == 0) break; if (trayItemDtl.CN_F_QUANTITY == 0) continue; if (((string.IsNullOrEmpty(cs.CN_S_PACKING_UNIT) && string .IsNullOrEmpty(trayItemDtl.CN_S_PACKING_UNIT)) || cs.CN_S_PACKING_UNIT .Equals(trayItemDtl.CN_S_PACKING_UNIT)) && (string.IsNullOrEmpty(cs.CN_S_PRODUCTION_BATCH) || cs.CN_S_PRODUCTION_BATCH .Equals(trayItemDtl.CN_S_PRODUCTION_BATCH)) && (string.IsNullOrEmpty(cs.CN_S_LOT_NO) || cs.CN_S_LOT_NO .Equals(trayItemDtl.CN_S_LOT_NO))) { if (trayItemDtl.CN_F_QUANTITY >= csQty) { trayItemDtl.CN_F_QUANTITY -= csQty; csQty = 0; } else { csQty -= trayItemDtl.CN_F_QUANTITY; trayItemDtl.CN_F_QUANTITY = 0; } } } } } } return trayItemMstList; } /// /// 拼接托盘物料关联关系-还料(货主默认) /// /// /// 数据实体 /// 用户实体 private void HLDoFindTrayItemList(string trayCode, ItemOnShelfEntity entity, RedisUserEntity userEntity) { Log.Info("===>开始拼接托盘物料关联:", trayCode); var Group_List = entity.row.GroupBy(x => new { x.CN_S_TRAY_CODE, x.CN_S_LOT_NO, x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_OWNER }).Select(g => new ItemRow { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO.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("===>Group_List:", JsonConvert.SerializeObject(Group_List)); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); Log.Info("===>itemenity:", JsonConvert.SerializeObject(itemenity)); //拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var HLtrayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = trayCode, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = 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 = 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()) }; var newEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = trayCode, CN_S_TRAY_GRID = string.IsNullOrEmpty(Group_List[i].CN_S_TRAY_GRID.ToString()) ? "1" : Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = Constants.DefaultOwner, 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 = 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()), //sqlwhere = " where CN_S_ITEM_CODE='" + Group_List[i].CN_S_ITEM_CODE + "' AND ISNULL(b.CN_S_LOT_NO,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_LOT_NO) ? "" : Group_List[i].CN_S_LOT_NO) + "' AND a.CN_S_OWNER='" + Group_List[i].CN_S_OWNER + "' AND ISNULL(b.CN_S_SERIAL_NO,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_SERIAL_NO) ? "" : Group_List[i].CN_S_SERIAL_NO) + "' AND ISNULL(b.CN_S_UNIQUE_CODE,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_UNIQUE_CODE) ? "" : Group_List[i].CN_S_UNIQUE_CODE) + "' AND ISNULL(CN_S_PACKING_UNIT,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_PACKING_UNIT) ? "" : Group_List[i].CN_S_PACKING_UNIT) + "' AND ISNULL(CN_F_PACKING_QTY,'0')='" + Group_List[i].CN_F_PACKING_QTY + "' AND ISNULL(CN_F_PURCHASE_PRICE,'0')='" + Group_List[i].CN_F_PURCHASE_PRICE + "' AND ISNULL(CN_F_RETAIL_PRICE,'0')='" + Group_List[i].CN_F_RETAIL_PRICE + "' AND ISNULL(CN_S_PRODUCTION_BATCH,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_PRODUCTION_BATCH) ? "" : Group_List[i].CN_S_PRODUCTION_BATCH) + "'" }; Log.Info("===>HLtrayItemMstEntity:", JsonConvert.SerializeObject(HLtrayItemMstEntity)); HLTrayItemMstlst.Add(HLtrayItemMstEntity); Log.Info("===>HLTrayItemMstlst:", JsonConvert.SerializeObject(HLTrayItemMstlst)); HLTrayItemNewOwnerMstlst.Add(newEntity); //var dtl_List = entity.row.Where(o => o.CN_S_TRAY_CODE.Trim() == Group_List[i].CN_S_TRAY_CODE.Trim() // && o.CN_S_TRAY_GRID.Trim() == Group_List[i].CN_S_TRAY_GRID.Trim() && o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() // && o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_LOT_NO == Group_List[i].CN_S_LOT_NO && 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++) { HLTrayItemDtllst.Add(new TN_WM_B_TRAY_ITEM_DTLEntity { CN_GUID = Guid.NewGuid().ToString().ToUpper(), CN_PARENT_GUID = mstGuid, CN_S_UNIQUE_CODE = "",// entity.row[i].CN_S_UNIQUE_CODE.ToString(), CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO == null ? "" : dtl_List[j].CN_S_LOT_NO.ToString(), CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(), CN_S_PACKING_UNIT = dtl_List[j].CN_S_PACKING_UNIT.ToString(), CN_F_PACKING_QTY = Convert.ToDecimal(dtl_List[j].CN_F_PACKING_QTY), CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY), CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(), CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(), CN_F_PURCHASE_PRICE = dtl_List[j].CN_F_PURCHASE_PRICE, CN_F_RETAIL_PRICE = dtl_List[j].CN_F_RETAIL_PRICE, CN_T_PRODUCTION = string.IsNullOrEmpty(dtl_List[j].CN_T_PRODUCTION.ToString()) ? Convert.ToDateTime("1970-01-01") : Convert.ToDateTime(dtl_List[j].CN_T_PRODUCTION), CN_T_EXPIRATION = string.IsNullOrEmpty(dtl_List[j].CN_T_EXPIRATION.ToString()) ? Convert.ToDateTime("1970-01-01") : Convert.ToDateTime(dtl_List[j].CN_T_EXPIRATION), CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(), 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:" + j + "==>", JsonConvert.SerializeObject(HLTrayItemDtllst)); } } } #endregion #region 整托上架 /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult ZTSaveLocationPalletRelation(TrayOnShelfEntity entity, RedisUserEntity userEntity) { try { Log.Info("===>进入整托上架接口:ZTSaveLocationPalletRelation", ""); 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; Log.Info("===>传递数据", JsonConvert.SerializeObject(entity)); if (string.IsNullOrEmpty(locationCode) && !string.IsNullOrEmpty(endAreaCode)) { string locationWhere = " where CN_S_AREA_CODE='" + endAreaCode + "' and CN_S_LOCATION_STATE='" + Constants.Location_State_Normal + "' and CN_S_USE_STATE='" + Constants.Use_State_Empty + "' "; Log.Info("===>获取目的库区正常货位", locationWhere); List locationList = BLLCreator.Create().GetModel(locationWhere); if (locationList.Any()) { locationCode = locationList[0].CN_S_LOCATION_CODE; Log.Info("===>获取目的库区正常货位结果", locationCode); } else { return OperateResult.Error("目的库区 " + endAreaCode + " 无正常可用货位!"); } } List locationModel = BLLCreator.Create().GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); Log.Info("===>获取货位实体", JsonConvert.SerializeObject(locationModel)); if (locationModel.Any()) { if (locationModel[0].CN_S_LOCATION_STATE.Trim() != Constants.Location_State_Normal) { return OperateResult.Error("货位被占用!"); } //库区量表实体 List AreaQtyList = new List(); List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); if (string.IsNullOrEmpty(deviceNo)) { #region 拼接库区量表数据 List trayItem = CreateDAL().TrayItemMstAndDtl(trayCode); Log.Info("===>TrayItemMstAndDtlEntity", JsonConvert.SerializeObject(trayItem)); if (trayItem.Any()) { Group_List = trayItem.GroupBy(x => new { x.CN_S_TRAY_CODE, x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_PRODUCTION_BATCH, x.CN_S_OWNER, x.CN_S_ITEM_STATE, x.CN_S_LOT_NO }).Select(g => new TrayItemMstAndDtlEntity { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE, CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID, CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE, CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH, CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER, CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE, CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO, CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); Log.Info("===>Group_List", JsonConvert.SerializeObject(trayItem)); foreach (var item in Group_List) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE); if (itemenity == null) { return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!"); } TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity(); AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString(); AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER; AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO; AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT; AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL; AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO; AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; AreaQtyEntity.CN_S_STOCK_AREA = locationModel[0].CN_S_AREA_CODE; AreaQtyEntity.CN_S_STOCK_CODE = locationModel[0].CN_S_STOCK_CODE; AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString()); AreaQtyEntity.CN_F_ALLOC_QTY = 0; AreaQtyEntity.CN_F_PLANNED_QTY = 0; AreaQtyEntity.CN_S_NOTE = ""; AreaQtyEntity.CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(); AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + locationModel[0].CN_S_STOCK_CODE.Trim() + @"' and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"' and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"' and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' "; AreaQtyList.Add(AreaQtyEntity); } Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList)); } #endregion #region 拼接托盘货位关联表 TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity() { CN_N_INDEX = 1, CN_S_LOCATION_CODE = locationCode, CN_S_STOCK_AREA = locationModel[0].CN_S_AREA_CODE, CN_S_STOCK_CODE = locationModel[0].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("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst)); #endregion } else { TN_WM_LOCATION_EXTEntity startModel = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = deviceNo }); if (startModel == null || string.IsNullOrEmpty(startModel.CN_S_LOCATION_CODE)) { return OperateResult.Error(deviceNo + " 不存在!"); } //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.TaskNo_In + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("入库任务号生成失败!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = "上架"; taskEntity.CN_S_FROM_OP = "入库"; taskEntity.CN_S_STOCK_CODE = startModel.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startModel.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = deviceNo; taskEntity.CN_S_END_AREA = locationModel[0].CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = locationModel[0].CN_S_LOCATION_CODE; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; 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); } //策略配置:上架是否直接生成入库单 string UpshelfWithIncrease = GetStrategy(locationModel[0].CN_S_STOCK_CODE, StrategyKey.UpshelfWithIncrease); //降收货区库区量 List shouHuoLocation = new List(); #region 拼接收货区实体 var shLocation = CreateDAL().GetSHLocationArea("收货区"); if (shLocation == null) { return OperateResult.Error("未在Mongo库区表中找到收货区实体!"); } //收货区 shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE }); Log.Info("===>获取收货区实体", JsonConvert.SerializeObject(shouHuoLocation)); #endregion //上架是否生成入库单 快速入库 不需要收货区 TN_WM_LOT_INFOEntity lotInfo = new TN_WM_LOT_INFOEntity(); TN_WM_INCREASE_INVENTORY_MSTEntity inMstEntity = new TN_WM_INCREASE_INVENTORY_MSTEntity(); if (UpshelfWithIncrease == "Y") { #region 拼接批次信息 string postDataLot = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.BatchNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string lotCode = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postDataLot); if (string.IsNullOrEmpty(lotCode)) { return OperateResult.Error("生成批次号失败!"); } lotInfo.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); lotInfo.CN_S_LOT_CODE = lotCode; lotInfo.CN_S_VENDOR_NO = ""; lotInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN; lotInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME; lotInfo.CN_T_CREATE = DateTime.Now; #endregion #region 生成入库单主表 string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_In + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string inOpNo = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postData); //生成入库单号 if (string.IsNullOrEmpty(inOpNo)) { return OperateResult.Error("生成入库单号失败!"); } inMstEntity.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); inMstEntity.CN_S_OP_NO = inOpNo; inMstEntity.CN_T_OPERATE = DateTime.Now; inMstEntity.CN_T_MODIFY = DateTime.Now; inMstEntity.CN_T_CREATE = DateTime.Now; inMstEntity.CN_S_VENDOR_NO = ""; inMstEntity.CN_S_VENDOR_NAME = ""; inMstEntity.CN_S_STOCK_CODE = locationModel[0].CN_S_STOCK_CODE; inMstEntity.CN_S_STATE = Constants.State_New; inMstEntity.CN_S_OWNER = Constants.DefaultOwner; inMstEntity.CN_S_OPERATOR = userEntity.CN_S_NAME; inMstEntity.CN_S_OP_TYPE = Constants.DefaultOpType; inMstEntity.CN_S_OP_FROM = ""; inMstEntity.CN_S_FROM_NO = ""; inMstEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; inMstEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; inMstEntity.CN_S_LOT_NO = lotCode; inMstEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; inMstEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; inMstEntity.CN_S_NOTE = "码盘自动生成"; #endregion #region 生成入库单子表 List dtlEntityList = new List(); var rowNo = 1; foreach (var item in Group_List) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(item.CN_S_ITEM_CODE); TN_WM_INCREASE_INVENTORY_DTLEntity dtlEntity = new TN_WM_INCREASE_INVENTORY_DTLEntity(); dtlEntity.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); //dtlEntity.CN_T_PRODUCTION = item.CN_T_PRODUCTION; dtlEntity.CN_T_MODIFY = DateTime.Now; dtlEntity.CN_T_CREATE = DateTime.Now; //dtlEntity.CN_T_EXPIRATION = item.CN_T_EXPIRATION; dtlEntity.CN_S_STATE = Constants.State_New; dtlEntity.CN_S_SERIAL_NO = item.CN_S_SERIAL_NO; dtlEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; dtlEntity.CN_S_OP_NO = inOpNo; dtlEntity.CN_S_MSTGUID = inMstEntity.CN_GUID; dtlEntity.CN_S_SERIAL_NO = ""; dtlEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlEntity.CN_S_MODEL = item.CN_S_MODEL; dtlEntity.CN_S_MEASURE_UNIT = item.CN_S_MEASURE_UNIT; dtlEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; dtlEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; dtlEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; dtlEntity.CN_S_FIGURE_NO = item.CN_S_FIGURE_NO; dtlEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlEntity.CN_S_ARRIVAL_QTY = item.CN_F_QUANTITY == null ? "" : item.CN_F_QUANTITY.ToString(); dtlEntity.CN_N_ROW_NO = rowNo; dtlEntity.CN_F_WARRNTY_PARTS = itemenity.CN_F_WARRNTY_PARTS; dtlEntity.CN_F_UPSHELF_QTY = 0; dtlEntity.CN_F_QUANTITY = item.CN_F_QUANTITY == null ? 0 : Convert.ToDecimal(item.CN_F_QUANTITY.ToString()); dtlEntity.CN_F_PRINTING_QTY = 0; dtlEntity.CN_F_PLAN_PRICE = 0; dtlEntity.CN_F_PLAN_MONEY = 0; dtlEntity.CN_F_ALLOT_QTY = 0; dtlEntity.CN_F_ADD_ONTRAY_QTY = 0; dtlEntity.CN_S_NOTE = "码盘自动生成"; //dtlEntity.CN_F_ACTUAL_PRICE = item.CN_F_PURCHASE_PRICE; //dtlEntity.CN_F_ACTUAL_MONEY = (item.CN_F_PURCHASE_PRICE == null ? 0 : item.CN_F_PURCHASE_PRICE) * item.CN_F_QUANTITY == null ? 0 : Convert.ToDecimal(item.CN_F_QUANTITY.ToString()); dtlEntity.CN_C_IS_SCRAP = Constants.N; dtlEntity.CN_C_IS_BALANCE = Constants.N; dtlEntityList.Add(dtlEntity); rowNo++; } inMstEntity.DTLEntity = dtlEntityList; #endregion } OperateResult operateResult = UseTransaction(trans => { if (!string.IsNullOrEmpty(inMstEntity.CN_S_OP_NO)) { //新增入库单主表 CreateDAL>().Add(inMstEntity, trans); //新增入库单子表 CreateDAL>().AddRange(inMstEntity.DTLEntity, trans); } //新增批次信息表 if (!string.IsNullOrEmpty(lotInfo.CN_S_LOT_CODE)) { CreateDAL>().Add(lotInfo, trans); } //整托-自动上架情况下 if (!string.IsNullOrEmpty(deviceNo)) { //下推任务给AMS foreach (var taskEntity in taskEntityList) { OperateResult re = new OtherSysApi().SendAmsTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } Log.Info("===>ZT-DoTransaction1", ""); //锁定目的位置货位-预入库锁定 CreateDAL>().Update( new { CN_S_LOCATION_STATE = Constants.Location_State_InLock, CN_S_TASK_NO = taskEntity.CN_S_TASK_NO }, new { CN_S_LOCATION_CODE = taskEntity.CN_S_END_BIT }, trans); Log.Info("===>ZT-DoTransaction2", taskEntity.CN_S_END_BIT + "$" + Constants.Location_State_InLock); //锁定起始位置货位-预出库锁定 CreateDAL>().Update( new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = taskEntity.CN_S_TASK_NO }, new { CN_S_LOCATION_CODE = taskEntity.CN_S_START_BIT }, trans); Log.Info("===>ZT-DoTransaction2-1", taskEntity.CN_S_START_BIT + "$" + Constants.Location_State_OutLock); //锁定起始位置货位-预出库锁定 CreateDAL>().Update( new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock }, new { CN_S_LOCATION_CODE = taskEntity.CN_S_START_BIT }, trans); Log.Info("===>ZT-DoTransaction2-1", taskEntity.CN_S_START_BIT + "$" + Constants.Location_State_OutLock); } //新增入库任务 if (taskEntityList.Any()) { CreateDAL>().AddRange(taskEntityList, trans); } Log.Info("===>ZT-DoTransaction3", ""); } //整托-人工上架情况下 if (string.IsNullOrEmpty(deviceNo)) { if (TrayLocationlst.Any()) { //新增托盘货位关联 CreateDAL>().AddRange(TrayLocationlst, trans); Log.Info("===>新增托盘货位关联", ""); } //根据批次和物料编码更新累积上架数 if (Group_List.Any()) { CreateDAL().UpdateUpselefQtyByLot(Group_List, trans); Log.Info("===>根据单号和物料编码更新累积上架数", ""); } //影响库区量表 if (AreaQtyList.Any() && UpshelfWithIncrease == "N") { CreateDAL().AddAreaQty(AreaQtyList, trans); Log.Info("===>影响库区量表", ""); } //降收货区库区量 if (AreaQtyList.Any()) { AreaQtyList.ForEach(x => { x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE; }); CreateDAL().ReduceAreaQty(AreaQtyList, trans); Log.Info("===>降收货区库区量", ""); } //更新货位扩展表状态 CreateDAL().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans); Log.Info("===>更新货位扩展表状态", ""); CreateDAL().UpdateLocation(trayCode, locationModel, trans); Log.Info("===>更新入库记录", trayCode + "****" + JsonConvert.SerializeObject(locationModel)); } }); return operateResult; } else { return OperateResult.Error("货位不存在!"); } } catch (Exception ex) { Log.Info("===>Exception", ex.ToString()); return OperateResult.Error(ex.ToString()); } } #endregion #region 获取货位列表 /// /// 根据托盘编码获取托盘货位关联列表 /// /// /// /// [HANHE(XDL)] CREATED BY 2018-11-16 public List GetListByTrayCode(string trayCode) { return CreateDAL().GetListByTrayCode(trayCode); } #endregion #region 获取货位列表 /// /// 根据托盘编码获取托盘货位关联列表 /// /// /// /// [HANHE(XDL)] CREATED BY 2018-11-16 public List GetListByLocationCode(string locationCode) { return CreateDAL().GetListByLocationCode(locationCode); } #endregion #region 根据货位获取托盘信息 /// /// 根据货位获取托盘信息 /// /// /// /// /// [HANHE(lt)] CREATED BY 2018-12-5 public List GetTrayLocation(string sqlwhere) { List list = CreateDAL().GetTrayLocation(sqlwhere); foreach (var entity in list) { AutoBomItemEntity ItemEntity = CreateDAL().GetItemEntity(entity.CN_S_ITEM_CODE); entity.CN_C_IS_SN = ItemEntity == null ? "" : ItemEntity.CN_C_IS_SN; entity.AuxiliaryUnitList = ItemEntity == null ? null : ItemEntity.AuxiliaryUnitList; } return list; } public List GetTrayLocationAndNullLocation(string sqlwhere) { List list = CreateDAL().GetTrayLocationAndNullLocation(sqlwhere); foreach (var entity in list) { AutoBomItemEntity ItemEntity = CreateDAL().GetItemEntity(entity.CN_S_ITEM_CODE); entity.CN_C_IS_SN = ItemEntity == null ? "" : ItemEntity.CN_C_IS_SN; entity.AuxiliaryUnitList = ItemEntity == null ? null : ItemEntity.AuxiliaryUnitList; } return list; } #endregion #region 修改货位 /// /// 修改货位 /// /// /// [HANHE(lt)] CREATED BY 2018-12-5 public SqlExecuteResult UpdateLocation(string startLoca, string endLoca) { SqlExecuteResult result = new SqlExecuteResult(); return DAOManager.ExecuteTransaction(trans => { result = CreateDAL().UpdateLocation(startLoca, endLoca, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } result = CreateDAL().UpdateLocationExt(startLoca, endLoca, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } return result; }); } #endregion #region 根据托盘,返回托盘所在货位信息 /// /// 根据托盘,返回托盘所在货位信息 /// /// /// public DataTable GetLocationByTrayCode(string trayCode, string locationCode) { DataTable dt = new DataTable(); if (!string.IsNullOrEmpty(trayCode)) return CreateDAL>().GetDataTable(new { CN_S_TRAY_CODE = trayCode }); if (!string.IsNullOrEmpty(locationCode)) return CreateDAL>().GetDataTable(new { CN_S_LOCATION_CODE = locationCode }); return dt; } #endregion #region (PDA接口)物料上架获取建议货位 /// /// 物料上架获取建议货位 /// /// 物料编码 /// 库区编码 /// 上架数量 /// 批次编码 /// /// [HANHE(XDL)] CREATED BY 2019-03-20 public OperateResult ItemGetLocationCode(string itemCode, string areaCode, int quantity, string lotCode) { List itemlist = new List(); itemlist.Add(new itemInClass() { itemCode = itemCode, itemQty = quantity, lotNo = lotCode }); var Fae = new FeedAlgorEntity() { FeedType = (FeedGoodType)Enum.Parse(typeof(FeedGoodType), "None", false), lstDevice = null, stockArea = areaCode, trayQty = quantity, lstItem = itemlist, lockLocation = false//是否需要锁定货位 }; OutFeedResultEntity result = BLLCreator.Create().Feed(Fae); return OperateResult.Succeed("", result); } #endregion #region (PDA接口)整托获取建议货位 /// /// 整托获取建议货位 /// /// 物料编码 /// 库区编码 /// 上架数量 /// /// [HANHE(XDL)] CREATED BY 2019-03-20 public OperateResult ZTGetLocationCode(string trayCode, string platformArea, string stockArea) { OperateResult opResult = new OperateResult(); return opResult; } #endregion #region (PDA接口)根据货位编码获取货位上托盘信息 /// /// (PDA接口)根据货位编码获取货位上托盘信息 /// /// 货位编码 /// /// [HanHe(xdl)] CREATED 2019/03/20 public List GetDetailByLocationCode(string locationCode) { List list = CreateDAL>().GetList(new { CN_S_LOCATION_CODE = locationCode }); return list; } #endregion #region (PDA接口)呼叫不满托盘出库 /// /// 呼叫不满托盘出库 /// /// 物料编码 /// 库区编码 /// 目的位置 /// 起始库区 /// 实体 /// /// [HANHE(XDL)] CREATED BY 2019-03-20 public OperateResult CallNoFullPallet(string itemCode, string trayQuantity, string endLocationCode, string startAreaCode, RedisUserEntity useEntity) { //调用算法返回能用托盘 List itemlist = new List(); itemlist.Add(new itemInClass() { itemCode = itemCode, lotNo = "" }); FeedAlgorEntity feedParam = new FeedAlgorEntity() { FeedType = FeedGoodType.FridTrayFirst, stockArea = startAreaCode, lstItem = itemlist, lockLocation = false }; Log.Info("算法传参:", JsonConvert.SerializeObject(feedParam)); OutFeedResultEntity feedAlloc = BLLCreator.Create().Feed(feedParam); Log.Info("算法返回:", JsonConvert.SerializeObject(feedAlloc)); if (!feedAlloc.Success) return OperateResult.Error("算法异常:" + feedAlloc.Msg); //拼接任务实体集合 List taskList = new List(); foreach (FeedItemEntity m in feedAlloc.lstFeedItem) { string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.TaskNo_Out + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { Log.Info("===>出库任务号生成失败!", ""); return null; } TN_WM_B_TRAY_LOCATIONEntity trayLocationRel = CreateDAL>().GetSingleEntity(new { CN_S_TRAY_CODE = m.trayCode }); TN_WM_LOCATION_EXTEntity locationModel = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = endLocationCode }); if (locationModel == null) { Log.Info("===>目的位置实体解析失败!", ""); return null; } taskList.Add(new TN_WM_TASKEntity() { CN_S_TASK_NO = taskNo, CN_N_PRIORITY = 1, CN_S_TASK_TYPE = "呼叫出库", CN_S_FROM_OP = "出库", CN_S_STOCK_CODE = trayLocationRel.CN_S_STOCK_CODE, CN_S_START_AREA = trayLocationRel.CN_S_STOCK_AREA, CN_S_START_BIT = trayLocationRel.CN_S_LOCATION_CODE, CN_S_END_AREA = locationModel.CN_S_AREA_CODE,//分拣台所在库区 CN_S_END_BIT = locationModel.CN_S_LOCATION_CODE,//分拣台所在位置 CN_S_STATE = Constants.TaskState_NoExecuted, CN_S_TRAY_CODE = m.trayCode, CN_S_CREATOR = useEntity.CN_S_LOGIN, CN_S_CREATOR_BY = useEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now, CN_S_MODIFY = useEntity.CN_S_LOGIN, CN_S_MODIFY_BY = useEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }); } OperateResult operateResult = UseTransaction(trans => { //生成出库任务 if (taskList.Any()) { CreateDAL>().AddRange(taskList, trans); } Log.Info("===>DoTransaction2", ""); foreach (var item in taskList) { //下推任务给AMS OperateResult re = new OtherSysApi().SendAmsTask(item); if (!re.Success) { throw new Exception(re.Msg); } Log.Info("===>DoTransaction3", item.CN_S_TASK_NO); //锁定出库起始货位 CreateDAL>().Update( new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = item.CN_S_TASK_NO }, new { CN_S_LOCATION_CODE = item.CN_S_START_BIT }, trans); } Log.Info("===>DoTransaction4", ""); }); return operateResult; } #endregion #region 托盘指引出库 /// /// 托盘指引出库 锁定货位\写入托盘预分配表\生成入库任务\下推给AMS /// /// 托盘预分配表 /// 出库任务 /// /// [HANHE(XDL)] CREATED BY 2019-03-26 public OperateResult CommitUpGuide(List lstAllocQuery, List taskList) { List trays = lstAllocQuery.GroupBy(x => x.CN_S_TRAY_CODE).Select(x => x.Key).ToList(); OperateResult operateResult = UseTransaction(trans => { //写入托盘预分配表 if (lstAllocQuery.Any()) { CreateDAL>().AddRange(lstAllocQuery, trans); } Log.Info("===>DoTransaction1", ""); //生成出库任务 if (taskList.Any()) { CreateDAL>().AddRange(taskList, trans); } Log.Info("===>DoTransaction2", ""); foreach (var item in taskList) { //下推任务给AMS OperateResult re = new OtherSysApi().SendAmsTask(item); if (!re.Success) { throw new Exception(re.Msg); } Log.Info("===>DoTransaction3", item.CN_S_TASK_NO); //锁定出库起始货位 CreateDAL>().Update( new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = item.CN_S_TASK_NO }, new { CN_S_LOCATION_CODE = item.CN_S_START_BIT }, trans); } Log.Info("===>DoTransaction4", ""); }); //把指引容器返回到前台,供等待容器使用 if (operateResult.Success) { operateResult.Data = trays; } return operateResult; } #endregion #region (PDA接口)托盘货位绑定 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckLocationYS(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } //检查该货位外层是否有阻挡 if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR)) { var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR); var locations = BLLCreator.Create>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR); if (locations.Count() > 0) { foreach (var location in locations) { if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常")) { return OperateResult.Error(string.Format("当前货位的外层货位{0}被占用,请先处理外层货位!", location.CN_S_LOCATION_CODE)); } } } } return OperateResult.Succeed(""); } #endregion #region (PDA接口)托盘货位绑定 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckCallLocationYS(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } 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_S_AREA_CLASS != "线边区") { //非法的目的货位 return OperateResult.Error(string.Format("该货位{0}不属于线边区,不允许叫料!", 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 lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } //检查该货位外层是否有阻挡 if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR)) { var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR); var locations = BLLCreator.Create>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR); if (locations.Count() > 0) { foreach (var location in locations) { if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常")) { return OperateResult.Error(string.Format("当前货位的外层货位{0}状态为{1},存储状态为{2},导致当前货位不可用!", location.CN_S_LOCATION_CODE, location.CN_S_LOCATION_STATE, location.CN_S_USE_STATE)); } } } } return OperateResult.Succeed(""); } #endregion #region (PDA接口)检查入库起点是否可用 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckInStockLocation(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + lstStartTray[0].CN_S_TRAY_CODE + "'"); if (lstMst.Count == 0) { return OperateResult.Error(string.Format("当前货位{0}绑定的托盘没有物料信息,不允许入库!", locationCode)); } } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE)); } //检查该货位外层是否有阻挡 if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR)) { var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR); var locations = BLLCreator.Create>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR); if (locations.Count() > 0) { foreach (var location in locations) { if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常")) { return OperateResult.Error(string.Format("当前货位的外层货位{0}被占用,请先处理外层货位!", location.CN_S_LOCATION_CODE)); } } } } return OperateResult.Succeed("", strTrayCode); } /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckInStockTray(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + trayCode + "'"); if (lstMst.Count == 0) { return OperateResult.Error(string.Format("当前托盘{0}没有物料信息,不允许入库!", trayCode)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE)); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE)); } return OperateResult.Succeed("", lstStartTray[0].CN_S_LOCATION_CODE); } else { return OperateResult.Succeed("", ""); } } #endregion #region (PDA接口)检查码盘起点是否可用 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckMpLocation(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复码盘!", lstInTask[0].CN_S_TASK_NO)); } } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许在该位置码盘!", GetModel[0].CN_S_LOCATION_STATE)); } DataTable dt = BLLCreator.Create().GetTrayDetail(strTrayCode); return OperateResult.Succeed(strTrayCode, dt); } /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckMpTray(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许码盘!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许在该货位码盘!", GetModel[0].CN_S_LOCATION_STATE)); } DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode); return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt); } else { DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode); return OperateResult.Succeed("", dt); } } #endregion #region (PDA接口)托盘货位绑定 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } List upHis = new List(); List addStockQty = new List(); List addAreaQty = new List(); #region 检查托盘与货位是否满足绑定条件 List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } #endregion //拼接托盘货位实体 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_TRAY_CODE = trayCode, CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE, CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE, CN_S_LOCATION_CODE = locationCode, CN_N_INDEX = 1, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }; trayLocationList.Add(trayLocation); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接上架记录表 upHis.Add(new TN_WM_UP_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = 0, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO, CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE, CN_F_QUANTITY = dltEntity.CN_F_QUANTITY, CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME, CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = locationCode, CN_S_LOT_NO = dltEntity.CN_S_LOT_NO, CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT, CN_S_MODEL = mstEntity.CN_S_MODEL, CN_S_MODIFY = userEntity.CN_S_NAME, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_S_OWNER = mstEntity.CN_S_OWNER, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE, CN_S_TRAY_CODE = trayCode, CN_S_TRAY_GRID = "1", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", }); #endregion } } #region 仓库量表 addStockQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_MODEL = x.CN_S_MODEL, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, }; }).ToList(); #endregion #region 库区量表 addAreaQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion } } OperateResult operateResult = UseTransaction(trans => { //写入托盘货位关联表 if (trayLocationList.Any()) { CreateDAL>().AddRange(trayLocationList, trans); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态及货位状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化"); } } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //上架记录 if (upHis.Any()) CreateDAL>().AddRange(upHis, trans); //更新仓库量表 if (addStockQty.Any()) BLLCreator.Create().AddList(addStockQty, trans); //CreateDAL().AddList(addStockQty, trans); //更新库区量表 if (addAreaQty.Any()) BLLCreator.Create().AddList(addAreaQty, trans); //CreateDAL().AddList(addAreaQty, trans); } } }); return operateResult; } #endregion #region (PDA接口)托盘货位解绑 /// /// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult DeleteTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } OperateResult operateResult = new OperateResult(); List downHis = new List(); List reduceStockQty = new List(); List reduceAreaQty = new List(); //根据托盘码删除 if (!string.IsNullOrEmpty(trayCode)) { #region 判断托盘与货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } #endregion if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; 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_EXT1 = dltEntity.CN_S_UNIQUE_CODE; down.CN_S_TRAY_CODE = trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion } } operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); } if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); } } }); return operateResult; } //根据货位码删除 if (!string.IsNullOrEmpty(locationCode)) { #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_INVENTORY == "Y") { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE)); } #endregion if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = locationCode; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion } } operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans); if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); } if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } }); } return operateResult; } #endregion #region(PDA接口)托盘货位绑定带码盘 /// /// 加生成任务接口模拟AMS接口调用出入库, /// /// /// /// public OperateResult LoadAndUnload(HH.WMS.Entitys.Basic.LocationTrayItmRelEntity entity, RedisUserEntity userEntity) { OperateResult result = new OperateResult(); List upHis = new List(); List downHis = new List(); if (entity.type == 1) { #region 绑定 #region 检验货位是否可用 List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } List lstEntity = CreateDAL().GetListByLocationCode(entity.location); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(entity.location); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location)); } #endregion #region 检验托盘是否可用 if (!string.IsNullOrEmpty(entity.trayCode)) { //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(entity.trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } } else { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; entity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(entity.trayCode)) { return OperateResult.Error("获取Autobom托盘号异常,请检查是否配置虚拟托盘生成规则"); } } #endregion #region 拼接处理数据 //拼接托盘物料关联主子表 List TrayItemMstlst = new List(); List TrayItemDtllst = new List(); var Group_List = entity.itemData.GroupBy(x => new { x.itemCode, x.itemState, x.owner }).Select(g => new TrayItemRow { CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = g.FirstOrDefault().itemCode.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().itemState.Trim(), CN_S_OWNER = g.FirstOrDefault().owner.Trim(), CN_F_QUANTITY = g.Sum(p => p.qty) }).ToList(); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); //拼接托盘物料关联主表实体 #region 拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO, CN_S_MODEL = itemenity.CN_S_MODEL, CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), }; #endregion #region 拼接托盘物料关联子表实体 TrayItemMstlst.Add(trayItemMstEntity); var parentGuid = trayItemMstEntity.CN_GUID; var dtl_List = entity.itemData.Where(o => o.owner.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.itemCode.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); for (int j = 0; j < dtl_List.Count; j++) { var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); dtlentity.CN_PARENT_GUID = parentGuid; dtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString(); dtlentity.CN_S_LOT_NO = dtl_List[j].lotNo.ToString(); dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].qty); dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].batchNo.ToString(); dtlentity.CN_S_NOTE = ""; dtlentity.CN_S_EXT1 = ""; dtlentity.CN_S_EXT2 = ""; dtlentity.CN_S_EXT3 = ""; dtlentity.CN_S_EXT4 = ""; dtlentity.CN_S_EXT5 = ""; dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlentity.CN_T_CREATE = DateTime.Now; dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlentity.CN_T_MODIFY = DateTime.Now; TrayItemDtllst.Add(dtlentity); upHis.Add(new TN_WM_UP_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = 0, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_S_FIGURE_NO = trayItemMstEntity.CN_S_FIGURE_NO, CN_S_ITEM_CODE = trayItemMstEntity.CN_S_ITEM_CODE, CN_F_QUANTITY = dtlentity.CN_F_QUANTITY, CN_S_ITEM_NAME = trayItemMstEntity.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMstEntity.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = entity.location, CN_S_LOT_NO = dtlentity.CN_S_LOT_NO, CN_S_MEASURE_UNIT = trayItemMstEntity.CN_S_MEASURE_UNIT, CN_S_MODEL = trayItemMstEntity.CN_S_MODEL, CN_S_MODIFY = userEntity.CN_S_NAME, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_S_OWNER = trayItemMstEntity.CN_S_OWNER, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = dtlentity.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = "1", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", CN_S_EXT1 = "" }); } #endregion } //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = entity.location; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = entity.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List addStockQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_MODEL = x.CN_S_MODEL, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, }; }).ToList(); List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List addAreaQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion //拼接托盘货位实体 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_TRAY_CODE = entity.trayCode, CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE, CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE, CN_S_LOCATION_CODE = entity.location, CN_N_INDEX = 1, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }; #endregion result = UseTransaction(trans => { #region 事务 //删除原托盘中绑定的物料 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); } if (TrayItemDtllst.Any()) { CreateDAL>().AddRange(TrayItemDtllst, trans); } //Log.Info("LoadAndUnload", "7"); CreateDAL>().Add(trayLocation, trans); //更新货位贮存状态及货位状态 result = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //上架记录 if (upHis.Any()) CreateDAL>().AddRange(upHis, trans); //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (addStockQty.Any()) CreateDAL().AddStockQty(addStockQty, trans); if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (addAreaQty.Any()) CreateDAL().AddAreaQty(addAreaQty, trans); if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } #endregion }); #endregion } else if (entity.type == 2) { //根据托盘码删除 if (!string.IsNullOrEmpty(entity.trayCode)) { #region 根据托盘解除绑定 #region 判断托盘货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不需要绑定!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(); down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = entity.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion result = UseTransaction(trans => { string waitlocationCode = lstEntity[0].CN_S_LOCATION_CODE.ToString(); //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除托盘物料关联 //删除原托盘中绑定的物料 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } //更新货位贮存状态 result = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } }); return result; #endregion } //根据货位码删除 if (!string.IsNullOrEmpty(entity.location)) { #region 根据货位解除绑定 #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(entity.location); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", entity.location)); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(entity.location); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location)); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = entity.location; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion result = UseTransaction(trans => { # region 执行事务 string waitlocationCode = entity.location; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = entity.location }, trans); //删除托盘物料关联 //删除原托盘中绑定的物料 result = CreateDAL>().Delete(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } //更新货位贮存状态 result = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } #endregion }); return result; #endregion } } return result; } #endregion #region (PDA接口)简易版整托上架(自动) /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string deviceNo = entity.CN_S_DEVICE_NO;//起点 string locationCode = entity.CN_S_LOCATION_CODE; string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; if (string.IsNullOrEmpty(locationCode)) { //调用算法计算终点货位 //调用入库算法,获取空货位 InAlgorEnitty iAe = new InAlgorEnitty() { stockAreaCode = entity.CN_S_END_AREA_CODE, logicCode = "", locationQty = 1, trayCode = trayCode, itemCode = "", lockLocation = false//是否需要锁定货位 }; iAe.lstDevice = null; InResultEntity irEresult = BLLCreator.Create().In(iAe); if (!irEresult.Success) { return OperateResult.Error(irEresult.Msg);//货位获取失败! } else { locationCode = irEresult.lstLocation[0].locationCode.ToString(); } } #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'"); if (startlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!"); } if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(deviceNo); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(locationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(locationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = "整托上架"; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = deviceNo; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = locationCode; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { OperateResult re = CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } }); return operateResult; } #endregion #region (PDA接口)简易版整托上架(移库) /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTShelfMoveStock(ref MoveStockJobPara moveStockJobPara, TrayOnShelfEntity entity, RedisUserEntity userEntity, LogPara logPara) { 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; var parentGuid = moveStockJobPara.MoveStockMst.CN_GUID; if (string.IsNullOrEmpty(locationCode)) { //调用算法计算终点货位 //调用入库算法,获取空货位 InAlgorEnitty iAe = new InAlgorEnitty() { stockAreaCode = entity.CN_S_END_AREA_CODE, logicCode = "", locationQty = 1, trayCode = trayCode, itemCode = "", lockLocation = false//是否需要锁定货位 }; iAe.lstDevice = null; InResultEntity irEresult = BLLCreator.Create().In(iAe); if (!irEresult.Success) { return OperateResult.Error(irEresult.Msg);//货位获取失败! } else { locationCode = irEresult.lstLocation[0].ToString(); } } #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'"); if (startlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!"); } if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal) { //锁定起点货位 BLLCreator.Create>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = deviceNo }); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(deviceNo); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(locationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(locationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = 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 => { //re = new OtherSysApi().SendAmsCreateTask(taskEntity); //if (!re.Success) //{ // throw new Exception("SendAmsCreateTask异常:" + re.Msg); //} OperateResult re = CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, "", "", taskNo, trans); //if (operateResult.AffectedRows == 0) //{ // throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); //} BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } //var qty = DALCreator.Create().GetItemQtyByTrayCode(trayCode, logPara); //BLLCreator.Create().AddDtl(parentGuid, taskNo, "移库", qty, null); }); if (operateResult.Success) { moveStockJobPara.OkTasks.Add(new OkTask { taskNo = taskEntity.CN_S_TASK_NO, startBit = taskEntity.CN_S_START_BIT, endBit = taskEntity.CN_S_END_BIT, priority = Convert.ToInt32(taskEntity.CN_N_PRIORITY), trayCode = taskEntity.CN_S_TRAY_CODE, startStock = taskEntity.CN_S_STOCK_CODE }); } return operateResult; } #endregion #region(PDA接口)简易版整托下架(自动) /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 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 lstStartTray = new List(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().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().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().GetListByLocationCode(locationCode); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().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().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 lstEndTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = "整托下架"; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = locationCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = deviceNo; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } }); return operateResult; } #endregion #region (PDA接口)简易版整托上架(手动) /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult SimZTShelfManual(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } List upHis = 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中未查询到该货位!"); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().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)); } 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)); } #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); //策略配置:库存是否启用收货区 List shouHuoLocation = new List(); string AreaQtyReceiveGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); if (AreaQtyReceiveGood.Equals("Y")) { var shLocation = CreateDAL().GetSHLocationArea("收货区"); if (shLocation == null) { return OperateResult.Error("未在Mongo库区表中找到收货区实体!"); } //收货区 shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE }); } //获取原托盘中的数据 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, CN_S_LOCATION_CODE = locationCode, CN_S_LOT_NO = dltEntity.CN_S_LOT_NO, CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT, CN_S_MODEL = mstEntity.CN_S_MODEL, CN_S_MODIFY = userEntity.CN_S_NAME, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_S_OWNER = mstEntity.CN_S_OWNER, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_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 仓库量表 List addStockQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_MODEL = x.CN_S_MODEL, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, }; }).ToList(); #endregion #region 库区量表 List addAreaQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion OperateResult operateResult = UseTransaction(trans => { //写入托盘货位关联表 if (trayLocationList.Any()) { CreateDAL>().AddRange(trayLocationList, trans); } //更新货位贮存状态及货位状态 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 (upHis.Any()) CreateDAL>().AddRange(upHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { if (AreaQtyReceiveGood.Equals("Y")) { //更新仓库量表 if (addStockQty.Any()) CreateDAL().AddStockQty(addStockQty, trans); } //更新库区量表 if (addAreaQty.Any()) CreateDAL().AddAreaQty(addAreaQty, trans); } } if (AreaQtyReceiveGood.Equals("Y")) { #region 拼接收货区实体 //降收货区库区量 //降收货区库区量 if (addAreaQty.Any()) { addAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE; }); CreateDAL().ReduceAreaQty(addAreaQty, trans); Log.Info("===>降收货区库区量", ""); } Log.Info("===>获取收货区实体", JsonConvert.SerializeObject(shouHuoLocation)); #endregion } }); return operateResult; } #endregion #region (PDA接口)简易版整托下架(手动) /// /// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult SimZTDownShelfManual(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } OperateResult operateResult = new OperateResult(); List downHis = new List(); //根据托盘码删除 if (!string.IsNullOrEmpty(trayCode)) { #region 判断托盘与货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不允许出库!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置出库!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置出库!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; 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 = 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 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion //策略配置:库存是否启用收货区 List faHuoLocation = new List(); string AreaQtyDeliverGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (AreaQtyDeliverGood.Equals("Y")) { var shLocation = CreateDAL().GetSHLocationArea("发货区"); if (shLocation == null) { return OperateResult.Error("未在Mongo库区表中找到发货区实体!"); } //收货区 faHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE }); } operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans); //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { if (AreaQtyDeliverGood.Equals("Y")) { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); } //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } if (AreaQtyDeliverGood.Equals("Y")) { #region 拼接收货区实体 //降收货区库区量 if (reduceAreaQty.Any()) { reduceAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = faHuoLocation[0].CN_S_AREA_CODE; }); CreateDAL().ReduceAreaQty(reduceAreaQty, trans); Log.Info("===>降发货区库区量", ""); } Log.Info("===>降发货区库区量", JsonConvert.SerializeObject(faHuoLocation)); #endregion } }); return operateResult; } //根据货位码删除 if (!string.IsNullOrEmpty(locationCode)) { #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不允许出库!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT未查询到该货位{0}!", locationCode)); } //货位存储状态:非空 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)); } 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)); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = 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_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA下架出库"; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion //策略配置:库存是否启用收货区 List faHuoLocation = new List(); string AreaQtyDeliverGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (AreaQtyDeliverGood.Equals("Y")) { var shLocation = CreateDAL().GetSHLocationArea("发货区"); if (shLocation == null) { return OperateResult.Error("未在Mongo库区表中找到发货区实体!"); } //收货区 faHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE }); } operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans); //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { if (AreaQtyDeliverGood.Equals("Y")) { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); } //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } if (AreaQtyDeliverGood.Equals("Y")) { #region 拼接收货区实体 //降收货区库区量 if (reduceAreaQty.Any()) { reduceAreaQty.ForEach(x => { x.CN_S_STOCK_AREA = faHuoLocation[0].CN_S_AREA_CODE; }); CreateDAL().ReduceAreaQty(reduceAreaQty, trans); Log.Info("===>降发货区库区量", ""); } Log.Info("===>降发货区库区量", JsonConvert.SerializeObject(faHuoLocation)); #endregion } }); } return operateResult; } #endregion #region (PDA接口)简易版整托上架(自动) 宇寿 /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTShelfAutoYS(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string deviceNo = entity.CN_S_DEVICE_NO;//起点 string locationCode = entity.CN_S_LOCATION_CODE; string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; if (string.IsNullOrEmpty(locationCode)) { //调用算法计算终点货位 //调用入库算法,获取空货位 List lstTmpArea = new List(); lstTmpArea.Add(new areaPriorClass { areaCode = endAreaCode, Prior = 1 }); InAssignEntity iAe = new InAssignEntity() { lstAreaPrior = lstTmpArea, logicAreaCode = "", objectCode = trayCode, projectCode = "ys001", lockLocation = false,//是否需要锁定货位 needCalLock = false }; iAe.lstDevice = null; InAssignResultEntity irEresult = BLLCreator.Create().InAssign(iAe); if (!irEresult.Success) { return OperateResult.Error(irEresult.Msg);//货位获取失败! } else { locationCode = irEresult.locationCode.ToString(); } } #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'"); if (startlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!"); } if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(deviceNo); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(locationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(locationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置入库任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = "整托上架"; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = deviceNo; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = locationCode; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; //存放入库类型 正常入库 其他入库 taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { OperateResult re = CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } }); return operateResult; } #endregion #region(PDA接口)简易版整托下架(自动)宇寿 /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTDownShelfAutoYS(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 lstStartTray = new List(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().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().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().GetListByLocationCode(locationCode); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().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().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 lstEndTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstEndTray.Count > 0) { return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_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>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } }); return operateResult; } #endregion #region(PDA接口)简易版整托下架(叫料)宇寿 /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTDownShelfCallMaterialYS(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string endLocationCode = entity.CN_S_DEVICE_NO;//终点 string startLocationCode = entity.CN_S_LOCATION_CODE;//起点 string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; List lstStartTray = new List(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'"); //if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal) //{ // //锁定起点货位 // BLLCreator.Create>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = startLocationCode }); //} AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startLocationCode); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 根据项目需要也可不检查该策略 lstStartTray = CreateDAL().GetListByLocationCode(startLocationCode); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + endLocationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endLocationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(endLocationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = startLocationCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = endLocationCode; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; //存放出库类型 正常出库 其他出库 taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { CreateDAL>().Add(taskEntity, trans); //更新起点任务号 if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, "", "", "", taskNo, trans); //if (operateResult.AffectedRows == 0) //{ // throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); //} //BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } }); return operateResult; } #endregion #region (PDA接口)托盘货位绑定 宇寿 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult AddTrayLocationRelationYS(string trayCode, string locationCode, string inStockType, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } List upHis = new List(); #region 检查托盘与货位是否满足绑定条件 List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } if (areaModel.CN_S_AREA_CLASS == "中间库") { //检查中间库托盘中的物料种类是否大于1 int goodType = BLLCreator.Create().GetGoodTypeInTray(trayCode); if (goodType > 1) { return OperateResult.Error(string.Format("在中间库中绑定托盘{0}的物料种类不能大于1!", trayCode)); } } #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); //获取原托盘中的数据 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 = dltEntity.CN_S_EXT1, CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE, CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO), 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_TRAY_CODE = trayCode, CN_S_TRAY_GRID = "1", CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE, //宇寿存储入库类型 正常入库 其他入库 CN_S_EXT2 = "", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", }); #endregion } } #region 仓库量表 List addStockQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_MODEL = x.CN_S_MODEL, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_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_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, }; }).ToList(); #endregion #region 库区量表 List addAreaQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_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_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion OperateResult operateResult = UseTransaction(trans => { //写入托盘货位关联表 if (trayLocationList.Any()) { CreateDAL>().AddRange(trayLocationList, trans); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态及货位状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化"); } } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //上架记录 if (upHis.Any()) CreateDAL>().AddRange(upHis, trans); //更新仓库量表 if (addStockQty.Any()) BLLCreator.Create().AddList(addStockQty, trans); //CreateDAL().AddList(addStockQty, trans); //更新库区量表 if (addAreaQty.Any()) BLLCreator.Create().AddList(addAreaQty, trans); //CreateDAL().AddList(addAreaQty, trans); } } }); return operateResult; } #endregion #region (PDA接口) 托盘货位解绑 宇寿 /// /// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult DeleteTrayLocationRelationYS(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } OperateResult operateResult = new OperateResult(); List downHis = new List(); //根据托盘码删除 if (!string.IsNullOrEmpty(trayCode)) { #region 判断托盘与货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO); 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 = dltEntity.CN_S_EXT1; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(); down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE; //宇寿存储入库类型 正常入库 其他入库 down.CN_S_EXT2 = ""; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); } if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); } } }); return operateResult; } //根据货位码删除 if (!string.IsNullOrEmpty(locationCode)) { #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_INVENTORY == "Y") { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE)); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO); down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : mstEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = locationCode; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion operateResult = UseTransaction(trans => { string waitlocationCode = locationCode; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans); if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); } if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } }); } return operateResult; } #endregion #region 空托回库检测货位码和托盘码 /// /// 空托回库检测货位码和托盘码 /// /// /// public OperateResult CheckInStockLocationEmpty(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许从空托回库!", GetModel[0].CN_S_LOCATION_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); //if (lstStartTray.Count == 0) //{ // return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); //} if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } //检测该托盘码上是否有物料 List ITEMMSTLIST = CreateDAL>().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)); } } else { //货位存储状态:非空 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("", strTrayCode); } #endregion #region 空托回库检测托盘码 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckInTrayCode(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该托盘绑定的货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许空托回库!", GetModel[0].CN_S_LOCATION_STATE)); } //检测该托盘码上是否有物料 List ITEMMSTLIST = CreateDAL>().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(PDA接口)简易版整托下架(叫料) /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTDownShelfCallMaterial(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string endLocationCode = entity.CN_S_DEVICE_NO;//终点 string startLocationCode = entity.CN_S_LOCATION_CODE;//起点 string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; List lstStartTray = new List(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'"); if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startLocationCode); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 根据项目需要也可不检查该策略 lstStartTray = CreateDAL().GetListByLocationCode(startLocationCode); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + endLocationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endLocationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(endLocationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = startLocationCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = endLocationCode; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; //存放出库类型 正常出库 其他出库 taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { CreateDAL>().Add(taskEntity, trans); //更新起点任务号 if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } }); return operateResult; } #endregion public OperateResult Add(TN_WM_B_TRAY_LOCATIONEntity trayLocation, IDbTransaction trans, LogPara logPara = null) { if (logPara != null) Log.Detail(logPara, LogDescribe.Content(trayLocation)); return DALCreator.Create().Add(trayLocation, trans); } } }