using HH.Redis.ReisModel; using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.Algorithm.Out; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.Check; using HH.WMS.DAL.Common; using HH.WMS.DAL.InStock; using HH.WMS.DAL.MoveStock; using HH.WMS.DAL.OutStock; using HH.WMS.Entitys; using HH.WMS.Entitys.Algorithm; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.MoveStock; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.MoveStock { public class TN_WM_MOVE_MSTBLL : DapperBaseBLL { #region 获取分页列表 /// /// 获取分页列表 /// /// /// /// [HanHe(lt)] CREATED 2018/9/6 public DataTable GetDataTable(dynamic obj) { DataTable dt = CreateDAL().GetDataTable(obj); Dictionary stockDic = new Dictionary(); Dictionary areaDic = new Dictionary(); dt.Columns.Add("CN_S_STOCK_NAME"); dt.Columns.Add("CN_S_START_AREA_NAME"); dt.Columns.Add("CN_S_END_AREA_NAME"); for (int i = 0; i < dt.Rows.Count; i++) { if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) //获取仓库名称 { if (!stockDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) { TN_AB_STOCKEntity stockentity = CreateDAL().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString());//获取仓库名称 if (stockentity != null) { dt.Rows[i]["CN_S_STOCK_NAME"] = stockentity.CN_S_STOCK_NAME; stockDic.Add(dt.Rows[i]["CN_S_STOCK_CODE"].ToString(), stockentity.CN_S_STOCK_NAME); } } else { dt.Rows[i]["CN_S_STOCK_NAME"] = stockDic[dt.Rows[i]["CN_S_STOCK_CODE"].ToString()]; } } if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_START_AREA"].ToString()))//获取起始库区名称 { if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_START_AREA"].ToString())) { AutoBomStockAreaEntity areaentity = CreateDAL().GetModel(dt.Rows[i]["CN_S_START_AREA"].ToString());//获取库区名称 if (areaentity != null) { dt.Rows[i]["CN_S_START_AREA_NAME"] = areaentity.CN_S_AREA_NAME; areaDic.Add(dt.Rows[i]["CN_S_START_AREA"].ToString(), areaentity.CN_S_AREA_NAME); } } else { dt.Rows[i]["CN_S_START_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_START_AREA"].ToString()]; } } if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_END_AREA"].ToString()))//获取库区名称 { if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_END_AREA"].ToString())) { AutoBomStockAreaEntity areaentity = CreateDAL().GetModel(dt.Rows[i]["CN_S_END_AREA"].ToString());//获取库区名称 if (areaentity != null) { dt.Rows[i]["CN_S_END_AREA_NAME"] = areaentity.CN_S_AREA_NAME; areaDic.Add(dt.Rows[i]["CN_S_END_AREA"].ToString(), areaentity.CN_S_AREA_NAME); } } else { dt.Rows[i]["CN_S_END_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_END_AREA"].ToString()]; } } } return dt; } /// /// 获取分页列表 /// /// /// /// [HanHe(lt)] CREATED 2018/9/6 public DataTable GetDataTable(string sqlWhere, string OrdeBy, int pageSize, int pageIndex) { return CreateDAL().GetDataTable(sqlWhere, OrdeBy, pageSize, pageIndex); } #endregion #region 新增 /// /// 增加一条数据 /// /// [HanHe(lt)] CREATED 2018/9/6 public SqlExecuteResult Add(TN_WM_MOVE_MSTEntity entity) { return CreateDAL().Add(entity, null); } #endregion #region 修改 /// /// 更新一条数据 /// /// [HanHe(lt)] CREATED 2018/9/6 public SqlExecuteResult Update(TN_WM_MOVE_MSTEntity entity) { return CreateDAL().Update(entity, null); } #endregion #region 删除 /// /// 删除一条数据 /// /// [HanHe(lt)] CREATED 2018/9/6 public SqlExecuteResult Delete(string sqlwhere) { return CreateDAL().Delete(sqlwhere, null); } #endregion #region 查询移库业务主表 /// /// 查询移库业务主表 /// /// 查询条件 /// /// [HanHe(lt)] CREATED 2018/9/6 public DataTable Getentity(string sqlwhere) { DataTable dt = CreateDAL().Getentity(sqlwhere); return dt; } #endregion #region 获取货位物料信息 /// /// 获取货位物料信息 /// /// 查询条件 /// /// [HanHe(lt)] CREATED 2018/9/11 public DataTable GetTrayLocation(dynamic obj) { DataTable dt = CreateDAL().GetTrayLocation(obj); Dictionary stockDic = new Dictionary(); Dictionary areaDic = new Dictionary(); dt.Columns.Add("CN_S_STOCK_NAME"); dt.Columns.Add("CN_S_AREA_NAME"); for (int i = 0; i < dt.Rows.Count; i++) { if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) //获取仓库名称 { if (!stockDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) { TN_AB_STOCKEntity stockentity = CreateDAL().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString().Trim());//获取仓库名称 if (stockentity != null) { dt.Rows[i]["CN_S_STOCK_NAME"] = stockentity.CN_S_STOCK_NAME; stockDic.Add(dt.Rows[i]["CN_S_STOCK_CODE"].ToString(), stockentity.CN_S_STOCK_NAME); } } else { dt.Rows[i]["CN_S_STOCK_NAME"] = stockDic[dt.Rows[i]["CN_S_STOCK_CODE"].ToString()]; } } if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_AREA"].ToString()))//获取库区名称 { if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_AREA"].ToString())) { AutoBomStockAreaEntity areaentity = CreateDAL().GetModel(dt.Rows[i]["CN_S_STOCK_AREA"].ToString().Trim());//获取库区名称 if (areaentity != null) { dt.Rows[i]["CN_S_AREA_NAME"] = areaentity.CN_S_AREA_NAME; areaDic.Add(dt.Rows[i]["CN_S_STOCK_AREA"].ToString(), areaentity.CN_S_AREA_NAME); } } else { dt.Rows[i]["CN_S_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_STOCK_AREA"].ToString()]; } } } return dt; } #endregion #region 新增 /// /// 新增 /// /// json实体类 /// /// [HanHe(lt)] CREATED 2018/9/13 public SqlExecuteResult Add(JObject obj) { SqlExecuteResult result = new SqlExecuteResult(); TN_WM_MOVE_MSTEntity entitymst = JsonConvert.DeserializeObject(obj.Value("mst").ToString()); List listdtl = JsonConvert.DeserializeObject>(obj.Value("dtl").ToString()); string itemcode = ""; listdtl.ForEach(f => itemcode += f.CN_S_ITEM_CODE + "','"); itemcode = itemcode.Substring(0, itemcode.Length - 3); DataTable dt = CreateDAL().getInfo(" CN_S_ITEM_CODE in ('" + itemcode + "') AND CN_S_OP_NO IN (SELECT CN_S_OP_NO FROM dbo.TN_WM_MOVE_MST WHERE CN_S_STATE='新建')"); int i = 1; //判断是否存在数据 foreach (TN_WM_MOVE_DTLEntity entity in listdtl) { var moveCount = dt.AsEnumerable().Where(w => w.Field("CN_S_ITEM_CODE") == entity.CN_S_ITEM_CODE && w.Field("CN_S_ITEM_STATE") == entity.CN_S_ITEM_STATE && w.Field("CN_S_LOT_CODE") == entity.CN_S_LOT_CODE && w.Field("CN_S_MODEL") == entity.CN_S_MODEL && w.Field("CN_S_FIGURE_NO") == entity.CN_S_FIGURE_NO && w.Field("CN_S_MEASURE_UNIT") == entity.CN_S_MEASURE_UNIT && w.Field("CN_S_PRODUCTION_BATCH") == entity.CN_S_PRODUCTION_BATCH).Count(); if (moveCount > 0) { return new SqlExecuteResult() { Exception = new Exception(" 物料[" + entity.CN_S_ITEM_NAME + "]移库数据已存在") }; break; } i++; } return DAOManager.ExecuteTransaction(trans => { result = CreateDAL().Add(entitymst, trans);//新增移库主表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } CreateDAL().Addlist(listdtl, entitymst.CN_S_OP_NO, trans);//新增子表 return result; }); } #endregion #region 删除移库 /// /// 删除移库 /// /// 移库单号 /// /// [HanHe(lt)] CREATED 2018/9/18 public SqlExecuteResult DeleteStockMove(string CN_S_OP_NO) { SqlExecuteResult result = new SqlExecuteResult(); return DAOManager.ExecuteTransaction(trans => { result = CreateDAL().Delete("where CN_S_OP_NO in ('" + CN_S_OP_NO + "')", trans);//删除移库主表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } result = CreateDAL().Delete("where CN_S_OP_NO in ('" + CN_S_OP_NO + "')", trans);//删除移库子表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } return result; }); } #endregion #region 提交 /// ///提交 /// /// /// /// [HanHe(lt)] CREATED 2018/8/24 public SqlExecuteResult Submits(string opNo, string type) { SqlExecuteResult result = new SqlExecuteResult(); return DAOManager.ExecuteTransaction(trans => { string[] opNoarr = opNo.Split(','); string[] typearr = type.Split(','); var checkNo = ""; for (int i = 0; i < opNoarr.Length; i++) { List GetTrayitemByOpno = CreateDAL().GetTrayitemByOpno("where c.CN_S_OP_NO='" + opNoarr[i] + "'", typearr[i]); result = CreateDAL().Addlist(GetTrayitemByOpno, trans);//子表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } checkNo += opNoarr[i] + "','"; } result = CreateDAL().UpdateStateByNo(checkNo.Substring(0, checkNo.Length - 3), "已提交", trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } return result; }); } /// ///提交 /// /// /// /// [HanHe(lt)] CREATED 2018/8/24 public OperateResult Submit(JObject obj) { var OrgFlag = obj.Value("OrgFlag"); var OrgCode = obj.Value("OrgCode"); var CN_S_CREATOR = obj.Value("CN_S_CREATOR"); var CN_S_CREATOR_BY = obj.Value("CN_S_CREATOR_BY"); var opNo = obj.Value("opNo").Replace(",", "','"); //查询货位托盘物料 //List GetTrayitemlist = CreateDAL().GetTrayitemByOpno("where c.CN_S_OP_NO in ('" + opNo + "')AND b.CN_S_LOCATION_CODE<>'CK001_ZCW01'", "物料盘点"); //AND a.CN_F_PACKING_QTY>0 List GetTrayitemlist = new List(); DataTable dt = CreateDAL().GetMstJoinDtl(" where a.CN_S_OP_NO ='" + opNo + "'"); List MoveResult = dt.AsEnumerable().GroupBy(p => new { CN_S_STOCK_CODE = p.Field("CN_S_STOCK_CODE"), CN_S_ITEM_CODE = p.Field("CN_S_ITEM_CODE"), CN_S_ITEM_STATE = p.Field("CN_S_ITEM_STATE"), CN_S_OWNER = p.Field("CN_S_OWNER"), CN_S_LOT_CODE = p.Field("CN_S_LOT_CODE"), CN_S_PRODUCTION_BATCH = p.Field("CN_S_PRODUCTION_BATCH") }) .Select(x => new TN_WM_B_MOVE_RESULTEntity() { CN_S_ITEM_CODE = x.Key.CN_S_ITEM_CODE, CN_S_LOT_CODE = x.Key.CN_S_LOT_CODE, CN_S_ITEM_STATE = x.Key.CN_S_ITEM_STATE, CN_S_OWNER = x.Key.CN_S_OWNER, CN_S_STOCK_CODE = x.Key.CN_S_STOCK_CODE, CN_F_QUANTITY = x.Sum(y => y.Field("CN_F_QUANTITY")), CN_F_QUANTITY_STOCK = x.FirstOrDefault().Field("CN_F_QUANTITY_STOCK") }).ToList(); List RainStockQuantity = MoveResult.Where(w => w.CN_F_QUANTITY > w.CN_F_QUANTITY_STOCK).ToList(); if (RainStockQuantity.Any()) { return OperateResult.Error("物料编码:【" + RainStockQuantity[0].CN_S_ITEM_CODE + "】库存已被占用!"); } #region 获取对应库区数量 List itemQuerys = MoveResult.Select(x => new itemQueryClass() { itemCode = x.CN_S_ITEM_CODE, batchCode = x.CN_S_LOT_CODE, itemState = x.CN_S_ITEM_STATE, ownerName = x.CN_S_OWNER, stockCode = x.CN_S_STOCK_CODE, itemQty = x.CN_F_QUANTITY, }).ToList(); var allArea = BLLCreator.Create().GetArea(4, dt.Rows[0]["CN_S_STOCK_CODE"].ToString()); List lstAreaPriors = allArea.Select(p => new areaPriorClass() { areaCode = p.CN_S_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(); //调用出库算法 var algorResultEntity = BLLCreator.Create().OutArea(itemQuerys, lstAreaPriors); if (!algorResultEntity.Success) return OperateResult.Error(algorResultEntity.Msg); //算法结果 List algorResult = algorResultEntity.itemOutAreaResult; //移出库区 List GetMoveArealist = new List(); //循环算法返回物料 foreach (OutAreaResultEntity algor in algorResult) { foreach (itemOutClass lis in algor.lstItem) { TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity(); //moveentity.CN_S_OP_NO = opNo; moveentity.CN_S_OWNER = algor.ownerName; moveentity.CN_S_ITEM_STATE = algor.itemState; moveentity.CN_S_LOT_CODE = algor.batchCode; //moveentity.CN_F_OUT_QUANTITY= //moveentity.CN_F_IN_QUANTITY="" //moveentity.CN_S_TRAY_CODE=""; //moveentity.CN_S_START_BIT = ""; //moveentity.CN_S_END_BIT = ""; moveentity.CN_S_NOTE = ""; moveentity.CN_S_STOCK_CODE = algor.stockCode; moveentity.CN_S_PRODUCTION_BATCH = algor.prodBatchCode; moveentity.CN_S_AREA_CODE = algor.areaCode; //AutoBomItemEntity ItemEntity = CreateDAL().GetItemEntity(lis.itemCode); //if (ItemEntity != null) //{ // return new SqlExecuteResult { Exception = new Exception("暂无此物料信息!") }; //} moveentity.CN_S_ITEM_CODE = lis.itemCode; //moveentity.CN_S_ITEM_NAME=ItemEntity.CN_S_ITEM_NAME; //moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT; //moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL; //moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO; moveentity.CN_F_QUANTITY = lis.itemQty; GetMoveArealist.Add(moveentity); } } #endregion #region 计算出托盘增加分配量 //初始化调用算法数据(暂缺少生产批次) List algorItems = GetMoveArealist.GroupBy(x => new { x.CN_S_STOCK_CODE, x.CN_S_AREA_CODE, x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_OWNER, x.CN_S_LOT_CODE, x.CN_S_PRODUCTION_BATCH }).Select(y => new itemQueryClass() { stockCode = y.Key.CN_S_STOCK_CODE, areaCode = y.Key.CN_S_AREA_CODE, itemCode = y.Key.CN_S_ITEM_CODE, batchCode = y.Key.CN_S_LOT_CODE, itemState = y.Key.CN_S_ITEM_STATE, ownerName = y.Key.CN_S_OWNER, itemQty = y.Sum(s => s.CN_F_QUANTITY) }).ToList(); var lstAreaPrior = algorItems.Select(x => new areaPriorClass() { areaCode = x.areaCode, Prior = 1 }).ToList(); OutResultEntityNew outResult = BLLCreator.Create().OutNew(new OutAlgorEnitty() { lstDevice = new List(), lstAreaPrior = lstAreaPrior, lstQueryItem = algorItems, lockLocation = false }); if (!outResult.Success) return OperateResult.Error(outResult.Msg); if (outResult.lstItemNotEnough.Any()) { return OperateResult.Error("物料:" + string.Join(";", outResult.lstItemNotEnough.Select(x => x.itemCode)) + "库存不足,请先完成来料区的上架"); } List trayItemMstList = new List(); foreach (trayOutItem outitem in outResult.itemLocations) { AutoBomItemEntity ItemEntity = CreateDAL().GetItemEntity(outitem.itemCode); if (ItemEntity == null) { return OperateResult.Error("暂无此物料信息!"); } var i = 1; //组织移库单数据 TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity(); TN_WM_B_TRAY_ITEM_MSTEntity trayItemMst = new TN_WM_B_TRAY_ITEM_MSTEntity(); moveentity.CN_S_OP_NO = opNo; moveentity.CN_S_OWNER = outitem.ownerName; moveentity.CN_S_ITEM_STATE = outitem.itemState; moveentity.CN_S_LOT_CODE = outitem.batchCode; moveentity.CN_S_NOTE = ""; moveentity.CN_S_STOCK_CODE = dt.Rows[0]["CN_S_STOCK_CODE"].ToString(); moveentity.CN_S_PRODUCTION_BATCH = outitem.prodBatchCode == null ? "" : outitem.prodBatchCode; //List locaExtlistw = locaExtlist.Where(w => w.CN_S_LOCATION_CODE.Trim() == lis.locationCode).Select(s => s.CN_S_AREA_CODE).ToList(); //moveentity.CN_S_AREA_CODE = locaExtlistw[0].Trim(); moveentity.CN_S_AREA_CODE = outitem.areaCode; moveentity.CN_S_ITEM_CODE = outitem.itemCode; moveentity.CN_S_ITEM_NAME = ItemEntity.CN_S_ITEM_NAME; moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT; moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL; moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO; moveentity.CN_F_QUANTITY = outitem.itemQty; moveentity.CN_F_OUT_QUANTITY = outitem.itemQty; moveentity.CN_F_IN_QUANTITY = outitem.itemQty; moveentity.CN_S_TRAY_CODE = outitem.trayCode; moveentity.CN_S_START_BIT = outitem.locationCode; moveentity.CN_S_TRAY_GRID = outitem.trayGrid; List endbit = dt.AsEnumerable().Where(w => w.Field("CN_S_ITEM_CODE") == outitem.itemCode && w.Field("CN_S_MEASURE_UNIT") == ItemEntity.CN_S_MEASURE_UNIT && w.Field("CN_S_MODEL") == ItemEntity.CN_S_MODEL && w.Field("CN_S_ITEM_STATE") == outitem.itemState && w.Field("CN_S_FIGURE_NO") == ItemEntity.CN_S_FIGURE_NO).Select(s => s.Field("CN_S_END_BIT")).ToList(); //&& w.Field("CN_S_LOT_CODE") == outitem.batchCode moveentity.CN_S_END_BIT = endbit.Any() ? endbit[0].Trim() : ""; trayItemMst.sqlwhere = " where CN_S_TRAY_CODE='" + moveentity.CN_S_TRAY_CODE + "' AND CN_S_TRAY_GRID='" + moveentity.CN_S_TRAY_GRID + "' AND CN_S_OWNER='" + moveentity.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + moveentity.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + moveentity.CN_S_FIGURE_NO + "' AND CN_S_MODEL='" + moveentity.CN_S_MODEL + "' AND CN_S_ITEM_STATE='" + moveentity.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT='" + moveentity.CN_S_MEASURE_UNIT + "'"; trayItemMst.CN_F_ALLOC_QTY = outitem.itemQty; GetTrayitemlist.Add(moveentity); trayItemMstList.Add(trayItemMst);//托盘主表信息 } #region OUT算法注释 //List ire = BLLCreator.Create().Out(new OutAlgorEnitty() //{ // lstDevice = new List(), // lstAreaPrior = lstAreaPrior, // lstQueryItem = algorItems, // lockLocation = false //}); //if (ire.Exists(x => (x.itemLocations == null || !x.itemLocations.Any()))) // return new SqlExecuteResult { Exception = new Exception("库存不足!") }; //foreach (var _ire in ire) // if (!_ire.Success) // { // return new SqlExecuteResult { Exception = new Exception(_ire.Msg) }; // } // else // { // //List locationlist = _ire.itemLocations.Select(s => s.locationCode).ToList(); // //var locations = string.Join("','", locationlist); // //List locaExtlist = CreateDAL().GetModel(" where CN_S_LOCATION_CODE in ('" + locations + "')"); // var i = 1; // //组织移库单数据 // foreach (itemTrayLocation lis in _ire.itemLocations) // { // TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity(); // moveentity.CN_S_OP_NO = opNo; // moveentity.CN_S_OWNER = _ire.ownerName; // moveentity.CN_S_ITEM_STATE = _ire.itemState; // moveentity.CN_S_LOT_CODE = _ire.batchCode; // moveentity.CN_S_NOTE = ""; // moveentity.CN_S_STOCK_CODE = dt.Rows[0]["CN_S_STOCK_CODE"].ToString(); // moveentity.CN_S_PRODUCTION_BATCH = _ire.prodBatchCode == null ? "" : _ire.prodBatchCode; // AutoBomItemEntity ItemEntity = CreateDAL().GetItemEntity(_ire.itemCode); // if (ItemEntity == null) // { // return new SqlExecuteResult { Exception = new Exception("暂无此物料信息!") }; // } // //List locaExtlistw = locaExtlist.Where(w => w.CN_S_LOCATION_CODE.Trim() == lis.locationCode).Select(s => s.CN_S_AREA_CODE).ToList(); // //moveentity.CN_S_AREA_CODE = locaExtlistw[0].Trim(); // moveentity.CN_S_AREA_CODE = _ire.areaCode; // moveentity.CN_S_ITEM_CODE = _ire.itemCode; // moveentity.CN_S_ITEM_NAME = ItemEntity.CN_S_ITEM_NAME; // moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT; // moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL; // moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO; // moveentity.CN_F_QUANTITY = lis.itemQty; // moveentity.CN_F_OUT_QUANTITY = lis.itemQty; // moveentity.CN_F_IN_QUANTITY = lis.itemQty; // moveentity.CN_S_TRAY_CODE = lis.trayCode; // moveentity.CN_S_START_BIT = lis.locationCode; // List endbit = dt.AsEnumerable().Where(w => w.Field("CN_S_ITEM_CODE") == _ire.itemCode && w.Field("CN_S_MEASURE_UNIT") == ItemEntity.CN_S_MEASURE_UNIT && w.Field("CN_S_MODEL") == ItemEntity.CN_S_MODEL && w.Field("CN_S_ITEM_STATE") == _ire.itemState && w.Field("CN_S_FIGURE_NO") == ItemEntity.CN_S_FIGURE_NO && w.Field("CN_S_LOT_CODE") == _ire.batchCode).Select(s => s.Field("CN_S_END_BIT")).ToList(); // moveentity.CN_S_END_BIT = endbit[0].Trim(); // GetTrayitemlist.Add(moveentity); // } // itemtrayloacationlist.AddRange(_ire.itemLocations);//最近实体集合 // } //if (!ire.Any()) // return new SqlExecuteResult { Exception = new Exception("未找到合适的出库货位!") }; //#endregion //if (algorResult == null) // return new SqlExecuteResult { Exception = new Exception("未找到合适的出库库区") }; #endregion #endregion #region 库区量表 List areaQtyList = GetTrayitemlist.GroupBy(x => new { x.CN_S_OWNER, x.CN_S_ITEM_CODE, x.CN_S_LOT_CODE, x.CN_S_ITEM_NAME, x.CN_S_ITEM_STATE, x.CN_S_STOCK_CODE, x.CN_S_AREA_CODE, x.CN_S_PRODUCTION_BATCH }).Select(y => new TN_WM_B_AREA_QTYEntity { CN_S_OWNER = y.Key.CN_S_OWNER, 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_CODE, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, CN_S_STOCK_AREA = y.Key.CN_S_AREA_CODE, CN_F_ALLOC_QTY = y.Sum(s => s.CN_F_OUT_QUANTITY), SqlWhere = " Where CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + @"' and CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + @"' and CN_S_ITEM_STATE='" + y.Key.CN_S_ITEM_STATE + @"' and CN_S_LOT_NO='" + y.Key.CN_S_LOT_CODE + "' and CN_S_OWNER='" + y.Key.CN_S_OWNER + "' and CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "' " }).ToList(); #endregion #region 仓库库存锁定明细表 //List outlockDtlEntityList = new List(); //var stockitem = ""; //areaQtyList.ForEach(f => stockitem += f.CN_S_ITEM_CODE + "','"); //stockitem = stockitem.Substring(0, stockitem.Length - 3); ////出库库区资产锁定 //List outlockingArea = GetTrayitemlist.GroupBy(x => new { x.CN_S_OP_NO, x.CN_S_OWNER, x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_ITEM_STATE, x.CN_S_LOT_CODE, x.CN_S_STOCK_CODE, x.CN_S_START_AREA }).Select(y => new TN_WM_B_OUTLOCKING_DTLEntity //{ // CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), // CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, // CN_S_OWNER = y.Key.CN_S_OWNER, // 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_CODE, // CN_F_QUANTITY = y.Sum(s => s.CN_F_OUT_QUANTITY), // CN_T_LOCK = DateTime.Now, // CN_F_SUM_USE = 0, // CN_T_USE = DateTime.Now, // CN_F_SUM_CANCEL = 0, // CN_S_STATE = Constants.State_Executing, // //CN_S_TABLE_ID = stockQtyWhere[0].CN_GUID, // CN_S_TABLE_TYPE = "2", // CN_T_CANCEL = Convert.ToDateTime("1900-01-01"), // CN_S_OP_FROM = "移库单", // CN_S_FROM_NO = y.Key.CN_S_OP_NO, // CN_S_STOCK_AREA = y.Key.CN_S_START_AREA //}).ToList(); ////查询对应的库区 仓库量表 //List areaQtyList1 = CreateDAL().GetArea(" CN_S_ITEM_CODE in ('" + stockitem + "')"); //foreach (TN_WM_B_OUTLOCKING_DTLEntity areaQty in outlockingArea) //{ // List areaQtyWhere = areaQtyList1.Where(w => w.CN_S_OWNER == areaQty.CN_S_OWNER && w.CN_S_ITEM_CODE == areaQty.CN_S_ITEM_CODE && w.CN_S_ITEM_STATE == areaQty.CN_S_ITEM_STATE && w.CN_S_LOT_NO == areaQty.CN_S_LOT_NO && w.CN_S_STOCK_CODE == areaQty.CN_S_STOCK_CODE && w.CN_S_STOCK_AREA == areaQty.CN_S_STOCK_AREA).ToList(); // if (!areaQtyWhere.Any()) // { // return new SqlExecuteResult() { Exception = new Exception("仓库没有此物料") }; // } // areaQty.CN_S_TABLE_ID = areaQtyWhere[0].CN_GUID; //} //////仓库和库区合并list ////outlockDtlEntityList = outlockingStock.Union(outlockingArea).ToList(); //outlockDtlEntityList = outlockingArea; #endregion #region 分拣单 //分拣单主表 List sortingList = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_STOCK_CODE, g.CN_S_AREA_CODE }).Select(s => new TN_WM_SORTING_LISTEntity { CN_S_FROM_NO = s.Key.CN_S_OP_NO, CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE, CN_S_STOCK_AREA = s.Key.CN_S_AREA_CODE }).ToList(); var so = 1; //分拣单子表 //g.CN_S_STOCK_CODE, g.CN_S_START_AREA List sortingDtl = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_ITEM_CODE, g.CN_S_ITEM_NAME, g.CN_S_OWNER, g.CN_S_ITEM_STATE, g.CN_S_MODEL, g.CN_S_FIGURE_NO, g.CN_S_MEASURE_UNIT, g.CN_S_PRODUCTION_BATCH, CN_S_LOT_CODE = g.CN_S_LOT_CODE, g.CN_S_AREA_CODE }).Select(s => new TN_WM_SORTING_DTLEntity { AreaCode = s.Key.CN_S_AREA_CODE, opNo = s.Key.CN_S_OP_NO,//区别移库单 //CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE, //CN_S_STOCK_AREA = s.Key.CN_S_START_AREA, CN_N_ROW_NO = so++, CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME, CN_F_QUANTITY = s.Sum(n => n.CN_F_OUT_QUANTITY), CN_S_STATE = Constants.Sorting_Stay, CN_S_OWNER = s.Key.CN_S_OWNER, CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = s.Key.CN_S_LOT_CODE, CN_S_MODEL = s.Key.CN_S_MODEL, CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO, CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT, CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH }).ToList(); so = 1; //分拣单明细 List sortingLocation = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_STOCK_CODE, g.CN_S_AREA_CODE, g.CN_S_ITEM_CODE, g.CN_S_ITEM_NAME, g.CN_S_START_BIT, g.CN_S_TRAY_CODE, g.CN_S_OWNER, g.CN_S_ITEM_STATE, g.CN_S_MODEL, g.CN_S_FIGURE_NO, g.CN_S_MEASURE_UNIT, g.CN_S_PRODUCTION_BATCH, CN_S_LOT_CODE = g.CN_S_LOT_CODE }).Select(s => new TN_WM_SORTING_LOCATIONEntity { AreaCode = s.Key.CN_S_AREA_CODE, opNo = s.Key.CN_S_OP_NO,//区别移库单 CN_N_ROW_NO = so++, CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME, CN_F_QUANTITY = s.Sum(n => n.CN_F_OUT_QUANTITY), CN_S_LOCATION_CODE = s.Key.CN_S_START_BIT, CN_S_TRAY_CODE = s.Key.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", CN_S_STATE = Constants.Sorting_Stay, CN_S_OWNER = s.Key.CN_S_OWNER, CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = s.Key.CN_S_LOT_CODE, CN_S_MODEL = s.Key.CN_S_MODEL, CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO, CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT, CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH }).ToList(); string postDatas = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.SortingGroup + "\",\"orgId\":\"" + OrgCode + "\",\"orgFlag\":\"" + OrgFlag + "\"}"; string sortingGroup = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postDatas); DateTime time = DateTime.Now; foreach (TN_WM_SORTING_LISTEntity solist in sortingList) { string postDataso = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.SortingNo + "\",\"orgId\":\"" + OrgCode + "\",\"orgFlag\":\"" + OrgFlag + "\"}"; string sortingNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postDataso); solist.CN_GUID = Guid.NewGuid().ToString(); solist.CN_S_SORTING_NO = sortingNo; solist.CN_S_OP_FROM = "移库单";//业务来源 //solist.CN_S_FROM_NO = fromNo,//来源单号 solist.CN_T_OPERATE = time.ToString(); //solist.CN_S_STOCK_CODE = m.stockCode,//仓库号 //solist.CN_S_STOCK_AREA = m.areaCode,//库区 solist.CN_S_STATE = Constants.Sorting_Stay; solist.CN_S_SEEDING_MODE = "先拣后播";//分拨模式 solist.CN_S_GROUP = sortingGroup; solist.CN_S_CREATOR = CN_S_CREATOR; solist.CN_S_CREATOR_BY = CN_S_CREATOR_BY; solist.CN_T_CREATE = time; solist.CN_S_MODIFY = CN_S_CREATOR; solist.CN_S_MODIFY_BY = CN_S_CREATOR_BY; solist.CN_T_MODIFY = time; solist.CN_N_PRINT_COUNT = 0; solist.CN_N_SORTING_BOX_NUM = 0; string stock = solist.CN_S_STOCK_CODE; //List whereArea = Arealist.Where(w => w.CN_S_STOCK_CODE == solist.CN_S_STOCK_CODE && w.CN_S_AREA_CODE == solist.CN_S_STOCK_AREA).ToList(); //if (whereArea[0].CN_S_AREA_CLASS.Contains("大件区")) //{ solist.CN_C_BIG = "Y"; //} //else //{ // solist.CN_C_BIG = "N"; //} //子表分拣单号 sortingDtl.Where(w => w.opNo == solist.CN_S_FROM_NO && w.AreaCode == solist.CN_S_STOCK_AREA).ToList().ForEach(f => f.CN_S_SORTING_NO = sortingNo); //明细表分拣单号 sortingLocation.Where(w => w.opNo == solist.CN_S_FROM_NO && w.AreaCode == solist.CN_S_STOCK_AREA).ToList().ForEach(f => f.CN_S_SORTING_NO = sortingNo); solist.CN_S_ORDER_NO = ""; //出库订单 } #endregion //#region 货位锁定 ////货位锁定 //List locationlist = GetTrayitemlist.GroupBy(x => x.CN_S_START_BIT).Select(o => o.Key).ToList(); //#endregion //string locationCode = string.Join("','", locationlist); OperateResult operateResult = UseTransaction(trans => { //新增明细表 CreateDAL>().AddRange(GetTrayitemlist, trans); CreateDAL().UpdateMoveMstStateByNo(opNo, "已提交", trans); //result = CreateDAL().UpdateLocationState(locationCode, "预出库锁定", trans); //if (!result.Success) //{ // DAOManager.RollbackTransaction(trans); // return result; //} ////修改仓库分配量 //result = CreateDAL().UpdateStockListAllocBysqlwhere(stockQtyList, trans); //if (!result.Success) //{ // DAOManager.RollbackTransaction(trans); // return result; //} //修改库区分配 CreateDAL().UpdateAreaListAllocBysqlwhere(areaQtyList, trans); //// 影响锁定详细表 //if (outlockDtlEntityList.Any()) //{ // result = CreateDAL().AddList(outlockDtlEntityList, trans); // if (!result.Success) // { // DAOManager.RollbackTransaction(trans); // return result; // } //} CreateDAL>().AddRange(sortingList, trans); CreateDAL>().AddRange(sortingDtl, trans); CreateDAL>().AddRange(sortingLocation, trans); //上升码盘分配量 CreateDAL().UpdateMstAllocQty(trayItemMstList, trans); }); return operateResult; } #endregion #region 查询移库主表 /// /// 查询移库主表 /// /// 查询条件 /// /// [HanHe(lt)] CREATED 2018/9/19 public DataTable GetMst(string sqlwhere) { DataTable dt = CreateDAL().Getentity(sqlwhere); dt.Columns.Add("CN_S_STOCK_NAME"); dt.Columns.Add("CN_S_START_AREA_NAME"); dt.Columns.Add("CN_S_END_AREA_NAME"); for (int i = 0; i < dt.Rows.Count; i++) { TN_AB_STOCKEntity Stockentity = CreateDAL().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString()); AutoBomStockAreaEntity StockArea = CreateDAL().GetStockArea("CN_S_AREA_CODE", dt.Rows[i]["CN_S_START_AREA"].ToString()); AutoBomStockAreaEntity StockAreas = CreateDAL().GetStockArea("CN_S_AREA_CODE", dt.Rows[i]["CN_S_END_AREA"].ToString()); dt.Rows[i]["CN_S_STOCK_NAME"] = Stockentity == null ? "" : Stockentity.CN_S_STOCK_NAME; dt.Rows[i]["CN_S_START_AREA_NAME"] = StockArea == null ? "" : StockArea.CN_S_AREA_NAME; dt.Rows[i]["CN_S_END_AREA_NAME"] = StockAreas == null ? "" : StockAreas.CN_S_AREA_NAME; } return dt; } #endregion #region 修改 /// /// 修改 /// /// json实体类 /// /// [HanHe(lt)] CREATED 2018/9/19 public SqlExecuteResult MoveUpdate(JObject obj) { SqlExecuteResult result = new SqlExecuteResult(); TN_WM_MOVE_MSTEntity entitymst = JsonConvert.DeserializeObject(obj.Value("mst").ToString()); List listdtl = JsonConvert.DeserializeObject>(obj.Value("dtl").ToString()); string itemcode = ""; listdtl.ForEach(f => itemcode += f.CN_S_ITEM_CODE + "','"); itemcode = itemcode.Substring(0, itemcode.Length - 3); DataTable dt = CreateDAL().getInfo(" CN_S_ITEM_CODE in ('" + itemcode + "') AND CN_S_OP_NO IN (SELECT CN_S_OP_NO FROM dbo.TN_WM_MOVE_MST WHERE CN_S_STATE='新建' AND CN_S_OP_NO !='" + entitymst.CN_S_OP_NO + "')"); int i = 1; foreach (TN_WM_MOVE_DTLEntity entity in listdtl) { var moveCount = dt.AsEnumerable().Where(w => w.Field("CN_S_ITEM_CODE") == entity.CN_S_ITEM_CODE && w.Field("CN_S_ITEM_STATE") == entity.CN_S_ITEM_STATE && w.Field("CN_S_LOT_CODE") == entity.CN_S_LOT_CODE && w.Field("CN_S_MODEL") == entity.CN_S_MODEL && w.Field("CN_S_FIGURE_NO") == entity.CN_S_FIGURE_NO && w.Field("CN_S_MEASURE_UNIT") == entity.CN_S_MEASURE_UNIT && w.Field("CN_S_PRODUCTION_BATCH") == entity.CN_S_PRODUCTION_BATCH).Count(); if (moveCount > 0) { return new SqlExecuteResult() { Exception = new Exception(" 物料[" + entity.CN_S_ITEM_NAME + "]移库数据已存在") }; break; } i++; } return DAOManager.ExecuteTransaction(trans => { result = CreateDAL().UpdateDtl(entitymst, trans);//新增移库主表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } result = CreateDAL().Delete("where CN_S_OP_NO='" + entitymst.CN_S_OP_NO + "'", trans);//删除 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } CreateDAL().Addlist(listdtl, entitymst.CN_S_OP_NO, trans);//新增子表 if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } return result; }); } #endregion #region 移库分拣完成 OLD /// ///移库分拣完成 /// /// 移库单号 /// /// [HanHe(lt)] CREATED 2018/12/20 public SqlExecuteResult MoveSortingComplete(string opNo, string userId, string userName, string orgId, string orgFlag) { //DataTable dt = CreateDAL().GetMstResult(" WHERE a.CN_S_OP_NO='" + opNo + "'"); //获取分拣单 List sorting = CreateDAL().GetSortingResult(" WHERE c.CN_S_OP_NO='" + opNo + "'"); //获取虚拟库区 List locationExtlist = CreateDAL().GetlistXnAreaCode("XNWXK"); #region 仓库库区量表 //库区 List arealist = sorting.GroupBy(x => new { CN_S_OWNER = x.CN_S_OWNER, 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_LOT_NO = x.CN_S_LOT_NO, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_STOCK_AREA = x.CN_S_END_AREA, startArea = x.CN_S_AREA_CODE, endArea = x.CN_S_END_AREA, endBit = x.CN_S_END_BIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => new TN_WM_B_AREA_QTYEntity { CN_GUID = System.Guid.NewGuid().ToString(), //CN_S_OWNER=y.Key.CN_S_OWNER, CN_S_OWNER = y.Key.endBit,//用于新增 CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, startArea = y.Key.startArea, endArea = y.Key.endArea, endBit = y.Key.endBit, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_F_QUANTITY = y.Sum(s => s.CN_F_QUANTITY), CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), SqlWhere = " CN_S_OWNER='" + y.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'", SqlWhere1 = " CN_S_OWNER='" + y.Key.endBit + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'" }).ToList(); //仓库 List stocklist = sorting.GroupBy(x => new { CN_S_OWNER = x.CN_S_OWNER, 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, startArea = x.CN_S_AREA_CODE, endArea = x.CN_S_END_AREA, endBit = x.CN_S_END_BIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = x.CN_S_LOT_NO, }).Select(y => new TN_WM_B_STOCK_QTYEntity { CN_GUID = System.Guid.NewGuid().ToString(), //CN_S_OWNER=y.Key.CN_S_OWNER, CN_S_OWNER = y.Key.endBit,//用于新增 CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, startArea = y.Key.startArea, endArea = y.Key.endArea, endBit = y.Key.endBit, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, //CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_F_QUANTITY = y.Sum(s => s.CN_F_QUANTITY), CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), SqlWhere = " CN_S_OWNER='" + y.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'", SqlWhere1 = " CN_S_OWNER='" + y.Key.endBit + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'" }).ToList(); #endregion #region 码盘主子表 //生成托盘编码 string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + orgId + "\",\"orgFlag\":\"" + orgFlag + "\"}"; //string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); //获取码盘主表 List itemMstList = sorting.GroupBy(g => new { CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_GRID = g.CN_S_TRAY_GRID, CN_S_OWNER = g.CN_S_OWNER, CN_S_ITEM_CODE = g.CN_S_ITEM_CODE, CN_S_ITEM_NAME = g.CN_S_ITEM_NAME, CN_S_FIGURE_NO = g.CN_S_FIGURE_NO, CN_S_MODEL = g.CN_S_MODEL, CN_S_ITEM_STATE = g.CN_S_ITEM_STATE, CN_S_MEASURE_UNIT = g.CN_S_MEASURE_UNIT, endBit = g.CN_S_END_BIT, CN_S_AREA_CODE = g.CN_S_AREA_CODE, CN_S_END_AREA = g.CN_S_END_AREA, CN_S_STOCK_CODE = g.CN_S_STOCK_CODE }).Select(s => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE, CN_S_STOCK_AREA = s.Key.CN_S_AREA_CODE, CN_S_END_AREA = s.Key.CN_S_END_AREA, CN_GUID = System.Guid.NewGuid().ToString(), CN_S_TRAY_CODE_OLD = s.Key.CN_S_TRAY_CODE,//查询出来的托盘用于托盘判断 //CN_S_TRAY_CODE = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData),//新增托盘编码 托盘与容器表 容器表保持一致 CN_S_TRAY_GRID = s.Key.CN_S_TRAY_GRID, CN_S_OWNER = s.Key.endBit, CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME, CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO, CN_S_MODEL = s.Key.CN_S_MODEL, CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE, CN_F_QUANTITY = s.Sum(u => u.CN_F_QUANTITY), CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT, CN_S_IN_AREA_CODE = "", CN_F_INQTY = s.Sum(u => u.CN_F_QUANTITY), CN_F_ALLOC_QTY = 0, sqlwhere = "where CN_S_TRAY_CODE='" + s.Key.CN_S_TRAY_CODE + "' AND CN_S_OWNER='" + s.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + s.Key.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + s.Key.CN_S_FIGURE_NO + "' AND CN_S_MODEL= '" + s.Key.CN_S_MODEL + "' AND CN_S_ITEM_STATE= '" + s.Key.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT= '" + s.Key.CN_S_MEASURE_UNIT + "'", //CN_S_TRAY_CODE='" + s.Key.CN_S_TRAY_CODE + "' sqlwhere1 = " where CN_S_OWNER='" + s.Key.endBit + "' AND CN_S_ITEM_CODE='" + s.Key.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + s.Key.CN_S_FIGURE_NO + "' AND CN_S_MODEL= '" + s.Key.CN_S_MODEL + "' AND CN_S_ITEM_STATE= '" + s.Key.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT= '" + s.Key.CN_S_MEASURE_UNIT + "'", CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), }).ToList(); List endBitlist = itemMstList.GroupBy(x => x.CN_S_OWNER).Select(s => s.Key).ToList(); //找到对应重复的目的货位 foreach (var endBit in endBitlist) { //同一个目的货位 相同编码判断 string newtray = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);//新增托盘编码 托盘与容器表 容器表保持一致 itemMstList.Where(w => w.CN_S_OWNER == endBit).Select(c => { c.CN_S_TRAY_CODE = newtray; return c; }).ToList(); } //获取码盘子表 List itemDtlList = sorting.GroupBy(g => new { CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_GRID = g.CN_S_TRAY_GRID, CN_S_ITEM_CODE = g.CN_S_ITEM_CODE, CN_S_UNIQUE_CODE = g.CN_S_PACKING_CODE, CN_S_SERIAL_NO = g.CN_S_SERIAL_NO, CN_S_PACKING_UNIT = g.CN_S_PACKING_UNIT, CN_F_PACKING_QTY = g.CN_F_PACKING_QTY, CN_S_PRODUCTION_BATCH = g.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = g.CN_S_LOT_NO }).Select(s => new TN_WM_B_TRAY_ITEM_DTLEntity { CN_GUID = System.Guid.NewGuid().ToString(), CN_S_UNIQUE_CODE = s.Key.CN_S_UNIQUE_CODE, CN_S_LOT_NO = s.Key.CN_S_LOT_NO, CN_S_SERIAL_NO = s.Key.CN_S_SERIAL_NO, CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE, CN_S_PACKING_UNIT = s.Key.CN_S_PACKING_UNIT == null ? "" : s.Key.CN_S_PACKING_UNIT, CN_F_PACKING_QTY = s.Key.CN_F_PACKING_QTY, CN_F_QUANTITY = s.Sum(u => u.CN_F_QUANTITY), CN_S_VENDOR_NO = "", CN_S_VENDOR_NAME = "", CN_F_PURCHASE_PRICE = 0, CN_F_RETAIL_PRICE = 0, CN_T_PRODUCTION = DateTime.Now, CN_T_EXPIRATION = DateTime.Now, CN_S_CREATOR = userId, CN_S_CREATOR_BY = userName, CN_T_CREATE = DateTime.Now, CN_S_MODIFY = userId, CN_S_MODIFY_BY = userName, CN_T_MODIFY = DateTime.Now, CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH, sqlwhere = " where CN_S_UNIQUE_CODE='" + s.Key.CN_S_UNIQUE_CODE + "' AND CN_S_LOT_NO='" + s.Key.CN_S_LOT_NO + "' AND CN_S_PACKING_UNIT='" + s.Key.CN_S_PACKING_UNIT + "' AND CN_F_PACKING_QTY='" + s.Key.CN_F_PACKING_QTY + "' AND CN_S_PRODUCTION_BATCH='" + s.Key.CN_S_PRODUCTION_BATCH + "'", }).ToList(); ////分拣结果的托盘物料关联数据 //List trayItemList = CreateDAL>().GetList(new //{ // CN_S_TRAY_CODE = locationExtlist.Select(x => x.CN_S_TRAY_CODE).ToList(), //}); //循环主表 更新关联主键 CN_PARENT_GUID foreach (TN_WM_B_TRAY_ITEM_MSTEntity mst in itemMstList) { List trayDtllist = itemDtlList.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE).ToList(); //判断是有虚拟对应的货位托盘 List locationExtlists = locationExtlist.Where(x => x.CN_S_STOCK_CODE == mst.CN_S_STOCK_CODE && x.CN_S_STOCK_AREA == mst.CN_S_END_AREA && x.CN_S_LOCATION_CODE == mst.CN_S_OWNER).ToList(); if (locationExtlists.Any()) { mst.CN_S_TRAY_CODE = locationExtlists[0].CN_S_TRAY_CODE; mst.CN_GUID = locationExtlists.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE && x.CN_S_TRAY_CODE == locationExtlists[0].CN_S_TRAY_CODE).ToList().Any() ? locationExtlists.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE && x.CN_S_TRAY_CODE == locationExtlists[0].CN_S_TRAY_CODE).ToList()[0].CN_GUID : mst.CN_GUID; } foreach (TN_WM_B_TRAY_ITEM_DTLEntity dtl in trayDtllist) { dtl.CN_PARENT_GUID = mst.CN_GUID; dtl.sqlwhere = dtl.sqlwhere + " AND CN_PARENT_GUID IN (select CN_GUID FROM dbo.TN_WM_B_TRAY_ITEM_MST " + mst.sqlwhere1 + ")"; } } #endregion #region 货位与托盘表 //组织货位拓展表 数据来自与码盘主表 List traylocationlist = itemMstList.GroupBy(g => new { CN_S_STOCK_CODE = g.CN_S_STOCK_CODE, CN_S_STOCK_AREA = g.CN_S_END_AREA, CN_S_LOCATION_CODE = g.CN_S_OWNER, CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_CODE_OLD = g.CN_S_TRAY_CODE_OLD }).Select(x => new TN_WM_B_TRAY_LOCATIONEntity { CN_S_TRAY_CODE = x.Key.CN_S_TRAY_CODE, CN_S_TRAY_CODE_OLD = x.Key.CN_S_TRAY_CODE_OLD, CN_S_STOCK_CODE = x.Key.CN_S_STOCK_CODE, CN_S_STOCK_AREA = x.Key.CN_S_STOCK_AREA, CN_S_LOCATION_CODE = x.Key.CN_S_LOCATION_CODE, CN_N_INDEX = 1, CN_S_CREATOR = userId, CN_S_CREATOR_BY = userName, CN_T_CREATE = DateTime.Now, sqlWhere = @" Where CN_S_STOCK_CODE='" + x.Key.CN_S_STOCK_CODE + "'and CN_S_STOCK_AREA='" + x.Key.CN_S_STOCK_AREA + "' and CN_S_LOCATION_CODE='" + x.Key.CN_S_LOCATION_CODE + "'" }).ToList(); #endregion #region 容器表 //组织容器表 List trayInfoList = traylocationlist.GroupBy(g => g.CN_S_TRAY_CODE).Select(x => new TN_WM_B_TRAY_INFOEntity { CN_S_TRAY_CODE = x.Key, CN_S_TRAY_CODE_EXT = "", CN_S_TRAY_TYPE = "虚拟托盘", CN_S_TRAY_DIMENSION = "", CN_S_TRAY_COLOR = "", CN_S_DESC = "移库生成虚拟托盘", CN_S_STATE = "使用中", CN_S_SPEC = "", CN_S_SORTING_CODE = "", CN_S_COLLECT_CODE = "", CN_S_COLLECT_LOCATION = "", CN_N_LATTICE_NUM = 1, CN_S_USE_STATE = "不满", CN_N_ROW_NUM = 1, CN_N_COLUMN_NUM = 1, CN_F_LOADBEARING = 0, CN_F_GROSSWEIGHT = 0, CN_F_WEIGHT = 0, CN_S_CREATOR = userId, CN_S_CREATOR_BY = userName, CN_T_CREATE = DateTime.Now, CN_S_MODIFY = userId, CN_S_MODIFY_BY = userName, CN_T_MODIFY = DateTime.Now, //sqlWhere = " where CN_S_TRAY_CODE='"+x.CN_S_TRAY_CODE_OLD+"'" }).ToList(); //判断是否是新增托盘 foreach (TN_WM_B_TRAY_INFOEntity trayInfo in trayInfoList) { List trayItemMst = itemMstList.Where(x => x.CN_S_TRAY_CODE == trayInfo.CN_S_TRAY_CODE).ToList(); if (trayItemMst.Any()) { trayInfo.sqlWhere = trayItemMst[0].sqlwhere1; } } #endregion #region 上架 List upHistoryList = new List(); foreach (TN_WM_B_TRAY_ITEM_DTLEntity right in itemDtlList) { TN_WM_B_TRAY_ITEM_MSTEntity left = itemMstList.Find(x => x.CN_S_ITEM_CODE == right.CN_S_ITEM_CODE); upHistoryList.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = System.Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = left.CN_S_OWNER, CN_S_TRAY_CODE = left.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", 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 = userId, CN_S_CREATOR_BY = userName, CN_T_CREATE = DateTime.Now, CN_S_MODIFY = userId, CN_S_MODIFY_BY = userName, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "移库单", CN_S_FROM_NO = opNo, CN_S_STOCK_CODE = left.CN_S_STOCK_CODE, CN_S_STOCK_AREA = left.CN_S_END_AREA }); } //if (itemMstList.Any()) //{ // var entity1 = (from left in itemMstList // join right in itemDtlList 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 = left.CN_S_OWNER, // CN_S_TRAY_CODE = left.CN_S_TRAY_CODE, // CN_S_TRAY_GRID = "1", // 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 = left.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 = userId, // CN_S_CREATOR_BY = userName, // CN_T_CREATE = DateTime.Now, // CN_S_MODIFY = userId, // CN_S_MODIFY_BY = userName, // CN_T_MODIFY = DateTime.Now, // CN_S_OP_FROM = "移库单", // CN_S_FROM_NO = opNo, // CN_S_STOCK_CODE = left.CN_S_STOCK_CODE, // CN_S_STOCK_AREA = left.CN_S_END_AREA // }).ToList(); // upHistoryList.AddRange(entity1); //} #endregion 托盘上架 SqlExecuteResult result = new SqlExecuteResult(); return DAOManager.ExecuteTransaction(trans => { result = CreateDAL().MoveInfoUpdateAreaQty(arealist, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } //新增容器表 CreateDAL().Add(trayInfoList, trans); result = CreateDAL().MoveInfoUpdateStockQty(stocklist, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } //新增码盘主表判断 result = CreateDAL().UpdateMst(itemMstList, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } //新增码盘子表判断 result = CreateDAL().UpdateDtl(itemDtlList, trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } //新增货位拓展表 CreateDAL().addlist(traylocationlist, trans); ////删除为0码盘数据 //result = CreateDAL().DeleteMstDtl(trans); //if (!result.Success) //{ // DAOManager.RollbackTransaction(trans); // return result; //} //新增入库记录 if (upHistoryList.Any()) { //新增入库记录 CreateDAL>().AddRange(upHistoryList, trans); } result = CreateDAL().UpdateStateByNo(opNo, "完成", trans); if (!result.Success) { DAOManager.RollbackTransaction(trans); return result; } return result; }); } #endregion #region 快速移库 /// ///快速移库 /// /// 移库单号 /// /// [HanHe(dbs)] CREATED 2019/4/2 public OperateResult PartMoveStock(JObject obj, RedisUserEntity user) { List moveResultList = JsonConvert.DeserializeObject>(obj["list"].ToString()); string moveStockType = obj["moveStockType"].ToString() == "" ? "1" : obj["moveStockType"].ToString();//移库类型 1整托移库 2部分移库 string startBit = obj["CN_S_START_BIT"].ToString(); string endBit = obj["CN_S_END_BIT"].ToString(); //获取货位与托盘关联数据 List trayLocationlists = CreateDAL().GetTrayLocationBylocationCode(endBit); string startTrayCode = obj["CN_S_TRAY_CODE"].ToString();//移动的托盘 string endTrayCode = trayLocationlists.Any() ? trayLocationlists[0].CN_S_TRAY_CODE : ""; if (moveStockType == "2") { if (string.IsNullOrEmpty(moveResultList[0].CN_S_TRAY_CODE)) moveResultList.ForEach(x => { x.CN_S_TRAY_CODE = startTrayCode; x.CN_S_TRAY_GRID = "1"; }); } #region 判断起点终点货位状态 if (string.IsNullOrEmpty(startBit)) { return OperateResult.Error("移库起点货位不存在!"); } else if (string.IsNullOrEmpty(endBit)) { return OperateResult.Error("移库终点货位不存在!"); } TN_WM_LOCATION_EXTEntity startMode = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = startBit }); TN_WM_LOCATION_EXTEntity endMode = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = endBit }); if (startMode == null || !startMode.CN_S_LOCATION_STATE.Trim().Equals(Constants.Location_State_Normal)) { return OperateResult.Error("请检查起点货位状态!"); } if (endMode == null || !endMode.CN_S_LOCATION_STATE.Trim().Equals(Constants.Location_State_Normal)) { return OperateResult.Error("请检查终点货位状态!"); } #endregion #region 获取起点托盘绑定物料信息 List resouceTrayItems = CreateDAL>().GetList(new { CN_S_TRAY_CODE = startTrayCode }); resouceTrayItems.ForEach(x => { x.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = x.CN_GUID }); }); #endregion //记录托盘减少量 List reduceMstGuid = new List();//记录哪些是完全移除的物料; List reduceDtlGuid = new List();//记录哪些是完全移除的物料; List reduceTrayMst = new List(); OperateResult or = ReduceTrayMst(moveStockType == "1", resouceTrayItems, moveResultList, out reduceMstGuid, out reduceDtlGuid, out reduceTrayMst, user); if (or.Status != ResultStatus.Success) return or; List downHis = new List(); downHis = BuildDownHis(reduceTrayMst, user); List upHis = new List(); upHis = BuildUpHis(reduceTrayMst, user); List tagTrayItems = null; List addMstGuid = new List();//记录哪些是完全新增的物料; string virTrayCode = "";//虚拟托盘号 TN_WM_B_TRAY_LOCATIONEntity trayLocationRel = new TN_WM_B_TRAY_LOCATIONEntity(); if (!string.IsNullOrEmpty(endTrayCode)) { #region 移动到非空货位,获取非空货位的物料,组织容器增加的物料 or = BuildAddTrayMst(endTrayCode, reduceTrayMst, out tagTrayItems, out addMstGuid); if (or.Status != ResultStatus.Success) return or; #endregion } else { #region 创建虚拟托盘 or = BLLCreator.Create().CreateVirtualTray(user); if (or.Status != ResultStatus.Success) return or; virTrayCode = or.Data.ToString(); trayLocationRel = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = user.CN_S_LOGIN, CN_S_CREATOR_BY = user.CN_S_NAME, CN_S_STOCK_CODE = endMode.CN_S_STOCK_CODE, CN_S_STOCK_AREA = endMode.CN_S_AREA_CODE, CN_S_LOCATION_CODE = endBit, CN_S_TRAY_CODE = virTrayCode, CN_T_CREATE = DateTime.Now }; #endregion } return UseTransaction(trans => { CreateDAL>().AddRange(upHis, trans); CreateDAL>().AddRange(downHis, trans); if (moveStockType == "1" && string.IsNullOrEmpty(endTrayCode)) { #region 整托移库到空货位 CreateDAL>().Update(new { CN_S_USE_STATE = Constants.Use_State_NoFull }, new { CN_S_LOCATION_CODE = endBit }, trans); CreateDAL>().Update(new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = startBit }, trans); //移动托盘到新的货位 CreateDAL>().Update(new { CN_S_LOCATION_CODE = endBit }, new { CN_S_TRAY_CODE = startTrayCode }, trans); #endregion } else if (moveStockType == "1" && !string.IsNullOrEmpty(endTrayCode)) { #region 整托移库到非空货位 CreateDAL>().Update(new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = startBit }, trans); //删除起点货位与托盘的关系 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = startBit }, trans); //删除起点托盘与物料的关系 CreateDAL>().Delete(new { CN_S_TRAY_CODE = startTrayCode }, trans); AddTrayItem(tagTrayItems, addMstGuid, trans); #endregion } else if (moveStockType != "1" && string.IsNullOrEmpty(endTrayCode)) { #region 部分移库到空货位上 CreateDAL>().Update(new { CN_S_USE_STATE = Constants.Use_State_NoFull }, new { CN_S_LOCATION_CODE = trayLocationRel.CN_S_LOCATION_CODE }, trans); ReduceTrayItem(reduceTrayMst, reduceMstGuid, reduceDtlGuid, trans); #region 增加空位的记录 CreateDAL>().Add(trayLocationRel, trans); reduceTrayMst.ForEach(x => { x.CN_GUID = Guid.NewGuid().ToString(); x.CN_S_TRAY_CODE = virTrayCode; x.TrayItemDtlList.ForEach(y => { y.CN_GUID = Guid.NewGuid().ToString(); y.CN_PARENT_GUID = x.CN_GUID; }); }); CreateDAL>().AddRange(reduceTrayMst, trans); reduceTrayMst.ForEach(x => { CreateDAL>().AddRange(x.TrayItemDtlList, trans); }); #endregion #endregion } else if (moveStockType != "1" && !string.IsNullOrEmpty(endTrayCode)) { #region 部分移库到非空货位上 ReduceTrayItem(reduceTrayMst, reduceMstGuid, reduceDtlGuid, trans); AddTrayItem(tagTrayItems, addMstGuid, trans); #endregion } }); } private List BuildUpHis(List reduceTrayMst, RedisUserEntity user) { List upHis = new List(); reduceTrayMst.ForEach(x => { upHis.Add(new TN_WM_UP_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = x.CN_F_PACKING_QTY, CN_S_CREATOR = user.CN_S_LOGIN, CN_S_CREATOR_BY = user.CN_S_NAME, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_F_QUANTITY = x.CN_F_QUANTITY, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = x.CN_S_LOCATION_CODE, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_MODEL = x.CN_S_MODEL, CN_S_MODIFY = user.CN_S_NAME, CN_S_MODIFY_BY = user.CN_S_NAME, CN_S_OWNER = x.CN_S_OWNER, CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_TRAY_CODE = x.CN_S_TRAY_CODE, CN_S_TRAY_GRID = x.CN_S_TRAY_GRID, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, }); }); return upHis; } private List BuildDownHis(List reduceTrayMst, RedisUserEntity user) { List downHis = new List(); reduceTrayMst.ForEach(x => { downHis.Add(new TN_WM_DOWN_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = x.CN_F_PACKING_QTY, CN_S_CREATOR = user.CN_S_LOGIN, CN_S_CREATOR_BY = user.CN_S_NAME, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_F_QUANTITY = x.CN_F_QUANTITY, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = x.CN_S_LOCATION_CODE, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_MODEL = x.CN_S_MODEL, CN_S_MODIFY = user.CN_S_NAME, CN_S_MODIFY_BY = user.CN_S_NAME, CN_S_OWNER = x.CN_S_OWNER, CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_TRAY_CODE = x.CN_S_TRAY_CODE, CN_S_TRAY_GRID = x.CN_S_TRAY_GRID, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, }); }); return downHis; } #region 组织下架记录 #endregion #region 移动到非空货位,获取非空货位的物料,组织容器增加的物料 /// /// 移动到非空货位,获取非空货位的物料,组织容器增加的物料 /// /// /// 减少的物料信息 /// /// /// /// [HanHe(dbs)] CREATED 2019/4/2 private OperateResult BuildAddTrayMst(string endTrayCode, List reduceTrayMst, out List addMst, out List addMstGuid) { addMstGuid = new List(); addMst = new List(); List tagTrayItems = CreateDAL>().GetList(new { CN_S_TRAY_CODE = endTrayCode }); tagTrayItems.ForEach(x => { x.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = x.CN_GUID }); }); foreach (TN_WM_B_TRAY_ITEM_MSTEntity y in reduceTrayMst) { TN_WM_B_TRAY_ITEM_MSTEntity x = tagTrayItems.Find(k => k.CN_S_ITEM_CODE.Equals(y.CN_S_ITEM_CODE)); if (x != null) { x.CN_F_QUANTITY += y.CN_F_QUANTITY; foreach (TN_WM_B_TRAY_ITEM_DTLEntity o in y.TrayItemDtlList) { TN_WM_B_TRAY_ITEM_DTLEntity d = x.TrayItemDtlList.Find(p => p.CN_F_PACKING_QTY == o.CN_F_PACKING_QTY && p.CN_S_PACKING_UNIT.Equals(o.CN_S_PACKING_UNIT) && p.CN_F_PURCHASE_PRICE == o.CN_F_PURCHASE_PRICE && p.CN_S_LOT_NO.Equals(o.CN_S_LOT_NO) && p.CN_S_PRODUCTION_BATCH.Equals(o.CN_S_PRODUCTION_BATCH)); if (d != null) d.CN_F_QUANTITY += o.CN_F_QUANTITY; else { TN_WM_B_TRAY_ITEM_DTLEntity newDtl = TransExpV2.Trans(o); newDtl.CN_GUID = ""; newDtl.CN_PARENT_GUID = y.CN_GUID; x.TrayItemDtlList.Add(newDtl); } } addMst.Add(x); } else { string newGuid = Guid.NewGuid().ToString(); addMstGuid.Add(newGuid); TN_WM_B_TRAY_ITEM_MSTEntity newMst = y.Clone(); newMst.CN_GUID = newGuid; newMst.CN_S_TRAY_CODE = endTrayCode; newMst.CN_S_TRAY_GRID = "1"; newMst.TrayItemDtlList.ForEach(k => { k.CN_GUID = ""; k.CN_PARENT_GUID = newGuid; }); addMst.Add(newMst); } } return OperateResult.Succeed(); } #endregion #region 组织减少起点托盘上的物料信息 /// /// 组织减少起点托盘上的物料信息 /// /// /// /// /// /// /// /// /// [HanHe(dbs)] CREATED 2019/4/2 private OperateResult ReduceTrayMst(bool isFullLocation, List resouceTrayItems, List moveResultList, out List reduceMstGuid, out List reduceDtlGuid, out List reduceTrayMst, RedisUserEntity user) { reduceTrayMst = new List(); reduceMstGuid = new List(); reduceDtlGuid = new List(); if (isFullLocation) { //整托移库 //获取起点货位上面的物料 reduceTrayMst = resouceTrayItems; return OperateResult.Succeed(); } else { //部分移库 if (!moveResultList.Any()) { reduceTrayMst = new List(); reduceMstGuid = new List(); reduceDtlGuid = new List(); return OperateResult.Error("未找到移库数据!"); } #region 校验部分移库的物料和数量是否匹配,并组织容器减少的物料 foreach (var x in resouceTrayItems) { foreach (var y in moveResultList) { if (y.CN_F_QUANTITY == 0) continue; if (x.CN_S_TRAY_CODE.Equals(y.CN_S_TRAY_CODE) && x.CN_S_TRAY_GRID.Equals(y.CN_S_TRAY_GRID) && x.CN_S_ITEM_CODE.Equals(y.CN_S_ITEM_CODE)) { decimal reduceQty = y.CN_F_QUANTITY; if (y.CN_F_QUANTITY > x.CN_F_QUANTITY) { return OperateResult.Error("移动的物料数量不匹配,请联系管理员!"); } else if (y.CN_F_QUANTITY == x.CN_F_QUANTITY) { //完全移除的物料 reduceMstGuid.Add(x.CN_GUID); } TN_WM_B_TRAY_ITEM_MSTEntity mst = new TN_WM_B_TRAY_ITEM_MSTEntity() { CN_GUID = x.CN_GUID, CN_S_TRAY_CODE = x.CN_S_TRAY_CODE, CN_S_TRAY_GRID = x.CN_S_TRAY_GRID, CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_OWNER = x.CN_S_OWNER, CN_F_QUANTITY = reduceQty, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }; y.CN_F_QUANTITY -= y.CN_F_QUANTITY; foreach (var m in x.TrayItemDtlList) { foreach (var n in y.DtlList) { if (m.CN_S_PACKING_UNIT.Equals(n.CN_S_PACKING_UNIT) && m.CN_F_PACKING_QTY == n.CN_F_PACKING_QTY) { if (n.CN_F_QUANTITY == 0) continue; decimal qty = 0; if (n.CN_F_QUANTITY > m.CN_F_QUANTITY) { qty = m.CN_F_QUANTITY; n.CN_F_QUANTITY -= m.CN_F_QUANTITY; reduceDtlGuid.Add(m.CN_GUID); } else if (n.CN_F_QUANTITY == m.CN_F_QUANTITY) { qty = n.CN_F_QUANTITY; n.CN_F_QUANTITY = 0; reduceDtlGuid.Add(m.CN_GUID); } else if (n.CN_F_QUANTITY < m.CN_F_QUANTITY) { qty = n.CN_F_QUANTITY; n.CN_F_QUANTITY = 0; } mst.TrayItemDtlList.Add(new TN_WM_B_TRAY_ITEM_DTLEntity() { CN_GUID = m.CN_GUID, CN_S_PACKING_UNIT = m.CN_S_PACKING_UNIT, CN_F_PACKING_QTY = m.CN_F_PACKING_QTY, CN_S_LOT_NO = m.CN_S_LOT_NO, CN_S_PRODUCTION_BATCH = m.CN_S_PRODUCTION_BATCH, CN_F_QUANTITY = qty, CN_S_CREATOR = user.CN_S_LOGIN, CN_S_CREATOR_BY = user.CN_S_NAME, CN_T_CREATE = DateTime.Now }); } } } if (mst.TrayItemDtlList.Count == 0) { return OperateResult.Error("移动的包装数量与库存不一致!"); } reduceTrayMst.Add(mst); } } } #endregion } return OperateResult.Succeed(); } #endregion #region 减少容器物料 /// /// 减少容器物料 /// /// 减少的数量 /// 完全排除的主表ID /// 完全排除的子表ID /// /// [HanHe(dbs)] CREATED 2019/4/2 private void ReduceTrayItem(List reduceTrayMst, List reduceMstGuid, List reduceDtlGuid, IDbTransaction trans) { reduceTrayMst.ForEach(h => { if (reduceMstGuid.Exists(y => y.Equals(h.CN_GUID))) { CreateDAL>().Delete(new { CN_GUID = h.CN_GUID }, trans); CreateDAL>().Delete(new { CN_PARENT_GUID = h.CN_GUID }, trans); } else { CreateDAL().ReduceMstQty(h, trans); h.TrayItemDtlList.ForEach(x => { if (reduceDtlGuid.Exists(y => y.Equals(x.CN_GUID))) CreateDAL>().Delete(new { CN_GUID = x.CN_GUID }, trans); else CreateDAL().ReduceDtlQty(x, trans); }); } }); } #endregion #region 增加容器物料 /// /// 增加容器物料 /// /// 增加的数量 /// 增加增加的主表记录 /// /// [HanHe(dbs)] CREATED 2019/4/2 private void AddTrayItem(List tagTrayItems, List addMstGuid, IDbTransaction trans) { tagTrayItems.ForEach(x => { if (addMstGuid.Exists(y => y.Equals(x.CN_GUID))) { CreateDAL>().Add(x, trans); } else CreateDAL>().Update(new { CN_F_QUANTITY = x.CN_F_QUANTITY }, new { CN_GUID = x.CN_GUID }, trans); //CreateDAL().AddMstQty(x, trans); x.TrayItemDtlList.ForEach(y => { if (string.IsNullOrEmpty(y.CN_GUID)) { y.CN_GUID = Guid.NewGuid().ToString(); CreateDAL>().Add(y, trans); } else { CreateDAL>().Update(new { CN_F_QUANTITY = y.CN_F_QUANTITY }, new { CN_GUID = y.CN_GUID }, trans); //CreateDAL().AddDtlQty(y, trans); } }); }); } #endregion #endregion #region 综合查询 /// /// 综合查询 /// /// 主表字段 /// /// /// /// /// /// public DataTable GetDataList(string tableName, int pageIndex, int pageSize, out long total, string orderBy = "") { return CreateDAL().GetDataList(tableName, pageIndex, pageSize, out total, orderBy); } #endregion } }