using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using WMS.Core._02Entity; using WMS.Info; using WMS.Info.Models; using WMS.Util; namespace WMS.Core { public class AppCoreBLL { private bool IsSkip; public string token; public AppCoreBLL() { //token = (string)System.Runtime.Remoting.Messaging.CallContext.GetData("token"); } public AppCoreBLL(bool skipOauth) { IsSkip = skipOauth; // token = (string)System.Runtime.Remoting.Messaging.CallContext.GetData("token"); } private LoginUserInfo _LoginUser; public LoginUserInfo LoginUser { get { if (_LoginUser != null) return _LoginUser; if (IsSkip) { _LoginUser = new LoginUserInfo { UserNo = "wcs" }; return _LoginUser; } if (string.IsNullOrWhiteSpace(token)) { #if DEBUG _LoginUser = new LoginUserInfo { UserNo = "TEST" }; # else throw SysExCore.ThrowToken(); #endif } else { _LoginUser= LoginBLLCore.GetLoginUser(token); } return _LoginUser; } } private HttpHelper _httpHelper; public HttpHelper httpClinet { get { if (_httpHelper == null) _httpHelper = new HttpHelper(SysSetCore.GetSysSet().WCSApiUrl); return _httpHelper; } } /// /// 获取列表数据 /// /// protected List GetList(string trayNo) { try { return SysDbCore.GetDbCtx().Queryable().Where(it => it.sod_part == trayNo).ToList(); } catch (Exception ex) { throw ex; } } /// /// 根据点位获取类型 /// 主键 /// /// protected BASE_POINT GetPointInfo(string pointNo) { try { return SysDbCore.GetDbCtx().Queryable().Where(it => it.F_isDelete == 0 && it.F_no == pointNo).First(); } catch (Exception ex) { throw ex; } } /// /// 根据类型获取空置点位 /// 主键 /// /// public BASE_POINT GetFreePointInfoByType(int type) { var point = SysDbCore.GetDbCtx().Queryable().Where(it => it.F_isDelete == 0 && it.F_type == type && it.F_status == (int)EPointSatus.Idle).First(); if (point == null) throw SysExCore.ThrowFailException("没有空闲的点位!"); //point.F_status = (int)EPointSatus.Occupied; //SysDbCore.GetDbCtx().Updateable(point).UpdateColumns(it => new { it.F_status }).WhereColumns(it => it.F_no == point.F_no).ExecuteCommand(); return point; } /// /// 根据类型获取空置货位 /// 主键 /// /// public BASE_LOCATION GetFreeLocationByType(int type) { var locEntity = SysDbCore.GetDbCtx().Queryable().Where(it => it.F_isDelete == 0 && it.F_type == type && it.F_status == (int)EWareCellState.Empty).First(); if (locEntity == null) throw SysExCore.ThrowFailException("没有闲置的货位!"); return locEntity; } public ResInfo LocationGenerate(GenerateLocationRequest request) { SqlSugarClient ctx = SysDbCore.GetDbCtx(); try { ctx.BeginTran(); for (int x = request.StartLine.HasValue ? request.StartLine.Value : 1; x <= request.Line; x++) { for (int y = request.StartCell.HasValue ? request.StartCell.Value : 1; y <= request.Cell; y++) { if (request.SkinLineCell.Any(a => a.Key == x && a.Value == y)) continue; var location = new BASE_LOCATION { F_addTime = DateTime.Now, F_addUserNo = "admin", F_editTime = DateTime.Now, F_cell = y, F_depth = 1, F_isDelete = 0, F_layer = request.layer, F_line = x, F_name = "货位", F_no = $"{x.ToString().PadLeft(2, '0') }-{y.ToString().PadLeft(2, '0')}-{request.layer.ToString().PadLeft(2, '0')}", F_status = 1, F_type = 1, F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo }; ctx.Insertable(location).ExecuteCommand(); } } ctx.CommitTran(); } catch (Exception ex) { ctx.RollbackTran(); throw ex; } finally { ctx.Dispose(); } return SysExCore.GetResSucc(); } /// /// 获取出库单类型 /// /// public ResInfo GetStockOutType() { try { var data = SysDbCore.GetDbCtx().Queryable().Where(it => it.F_PNO == "StockOutOrderType").Select("f_no,f_name,f_num").ToList(); return SysExCore.GetResSucc(data: data); } catch (Exception ex) { throw ex; } } /// /// 转仓类型 /// /// public ResInfo GetTransferType() { try { var data = SysDbCore.GetDbCtx().Queryable().Where(it => it.F_PNO == "ETransferType").Select("f_no,f_name,f_num").ToList(); return SysExCore.GetResSucc(data: data); } catch (Exception ex) { throw ex; } } /// /// 更新库存及添加库存事务 /// /// /// public void UpdateInventory(List inv, SqlSugarClient db) { if (!inv.Any()) return; var strSql = new StringBuilder(); db.Ado.ExecuteCommand(" SELECT * INTO #INVENTORY FROM dbo.BILL_INVENTORY WHERE 1=2"); var data = new List(); foreach (var item in inv) { var param = GetParameter(item); db.Ado.ExecuteCommand(@" INSERT INTO #INVENTORY ( F_warehouseNo, F_projectNo, F_matNo, F_matName, F_matType, F_quantity, F_lockQty, F_trayNo, F_batchNo, F_memo, F_isBonded, F_UID, F_addUserNo, F_addTime, F_editUserNo, F_editTime, F_boxNo, F_productDate ) VALUES ( @F_warehouseNo, @F_projectNo, @F_matNo, @F_matName, @F_matType, @F_quantity, @F_lockQty, @F_trayNo, @F_batchNo, @F_memo, @F_isBonded, @F_UID, @F_addUserNo, @F_addTime, @F_editUserNo, @F_editTime, @F_boxNo, @F_productDate )", param); } strSql.Append($@" MERGE INTO dbo.BILL_INVENTORY A USING #INVENTORY C ON ( A.F_trayNo = C.F_trayNo AND A.F_matNo = C.F_matNo AND A.F_matType = C.F_matType AND isnull(A.F_boxNo,'') = isnull(C.F_boxNo,'') AND isnull(A.F_UID,'') =isnull(C.F_UID,'') ) WHEN MATCHED THEN UPDATE SET A.F_quantity = IIF(C.F_quantity>0 AND C.F_matType=1,C.F_quantity,A.F_quantity + C.F_quantity), A.F_editTime = GETDATE(), A.F_editUserNo = C.F_editUserNo WHEN NOT MATCHED THEN INSERT ( F_warehouseNo, F_projectNo, F_matNo, F_matName, F_matType, F_quantity, F_lockQty, F_trayNo, F_batchNo, F_memo, F_isBonded, F_UID, F_addUserNo, F_addTime, F_productDate, F_boxNo ) VALUES (C.F_warehouseNo, C.F_projectNo, C.F_matNo, C.F_matName, C.F_matType, C.F_quantity, 0, C.F_trayNo, C.F_batchNo, C.F_memo, C.F_isBonded, C.F_UID, C.F_addUserNo, GETDATE(),C.F_productDate,C.F_boxNo) OUTPUT Inserted.F_no, Inserted.F_warehouseNo, Inserted.F_projectNo, C.F_matNo, C.F_matName, C.F_matType, ISNULL(DELETED.F_quantity, 0), ISNULL(DELETED.F_lockQty, 0), ISNULL(Inserted.F_quantity, 0), ISNULL(Inserted.F_lockQty, 0), DELETED.F_trayNo, C.F_trayNo, C.F_batchNo, C.F_memo, C.F_isBonded, C.F_UID, C.F_addUserNo, C.F_addTime, C.F_boxNo, C.F_productDate INTO dbo.BILL_INVENTORYTRANSACTION ( [F_inventoryNo], [F_warehouseNo], [F_projectNo], [F_matNo], [F_matName], [F_matType], [F_sourceQuantity], [F_sourceLockQty], [F_targetQuantity], [F_targetLockQty], [F_sourceTrayNo], [F_targetTrayNo], [F_batchNo], [F_memo], [F_isBonded], [F_UID], [F_addUserNo], [F_addTime], F_boxNo, F_productDate ); DELETE dbo.BILL_INVENTORY WHERE EXISTS(SELECT 1 FROM #INVENTORY tmp WHERE tmp.F_matNo=BILL_INVENTORY.F_matNo AND tmp.F_trayNo=BILL_INVENTORY.F_trayNo AND tmp.F_boxNo=BILL_INVENTORY.F_boxNo) AND BILL_INVENTORY.F_quantity=0 DROP TABLE #INVENTORY;"); db.Ado.ExecuteCommand(strSql.ToString()); } /// /// 返回基于该对象的SugarParameters的数组 /// /// /// public static SugarParameter[] GetParameter(T Info) where T : class { Type type = typeof(T); object obj = Activator.CreateInstance(type); // 获取所有属性。 PropertyInfo[] properties = type.GetProperties(); SugarParameter[] arParms = new SugarParameter[properties.Length]; for (int i = 0; i < properties.Length; i++) { arParms[i] = new SugarParameter($"@{properties[i].Name}", properties[i].GetValue(Info)); } return arParms; } /// /// 出库下一个点位分配 /// /// /// public string StockOutNextPointAllot(SqlSugarClient ctx) { var point = ctx.Queryable().First(c => c.F_type == (int)EPointType.CKXYGDZ); var pointTask = ctx.Queryable().Where(c => ((c.F_posidNext == point.F_no || c.F_posidNext == point.F_cachePoint) && c.F_taskStatus == (int)ETaskStatus.NotIssued || c.F_taskStatus == (int)ETaskStatus.NotExecute || c.F_taskStatus == (int)ETaskStatus.Executing)); if (pointTask.Any()) { if (pointTask.Any(a => a.F_posidNext == point.F_no)) { if (!pointTask.Any(a => a.F_posidNext == point.F_cachePoint)) { return point.F_cachePoint; } } } return point.F_no; } } }