kazelee
3 天以前 63e94e068622d4ef843cee0d19d4f2d231316304
wms/DbExpr.cs
@@ -15,7 +15,7 @@
    /// </summary>
    public class DbExpr {
        /// <summary>
        /// 通用货位筛选表达式
        /// 通用 [ 货位 ] 筛选
        /// </summary>
        /// <remarks><code><![CDATA[
        /// l => l.C_ENABLE == "Y" 
@@ -29,18 +29,19 @@
        /// <param name="areas"></param>
        /// <param name="curNum"></param>
        /// <returns></returns>
        public static Expression<Func<TN_Location, bool>> LocFilter(int @lock = 0, string name = "", List<string> areas = null, int curNum = 0) {
        public static Expression<Func<TN_Location, bool>> LocFilter(int @lock, string name, List<string> areas, int curNum) {
            Expression<Func<TN_Location, bool>> expr = l => l.C_ENABLE == "Y"; // 已启用
            if (@lock >= 0) {
                Expression<Func<TN_Location, bool>> newExpr = l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock);
                Expression<Func<TN_Location, bool>> newExpr =
                    l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock);
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            if (!string.IsNullOrEmpty(name)) {
                Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            if (areas != null && areas.Count == 0) {
            if (areas != null && areas.Count > 0) {
                Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
@@ -66,23 +67,28 @@
        /// <param name="areas"></param>
        /// <returns></returns>
        public static Expression<Func<TN_Location, bool>> StartLocUnbind(string name = "", List<string> areas = null) {
            Expression<Func<TN_Location, bool>> expr =
                l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.N_CURRENT_NUM == 0;
            if (!string.IsNullOrEmpty(name)) {
                Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            if (areas != null && areas.Count > 0) {
                Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            return expr;
            return LocFilter(0, name, areas, 0);
        }
        /// <summary>
        ///
        /// 起点货位 ( 已绑定 )
        /// </summary>
        /// <remarks><code><![CDATA[
        /// l => l.C_ENABLE == "Y"
        ///   && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无"
        ///   && l.S_CODE == name
        ///   && areas.Contains(l.S_AREA_CODE)
        ///   && l.N_CURRENT_NUM == 1
        /// ]]></code></remarks>
        /// <param name="name"></param>
        /// <param name="areas"></param>
        /// <returns></returns>
        public static Expression<Func<TN_Location, bool>> StartLoc(string name = "", List<string> areas = null) {
            return LocFilter(0, name, areas, 1);
        }
        /// <summary>
        /// 终点货位
        /// </summary>
        /// <remarks><code><![CDATA[
        /// l => l.C_ENABLE == "Y" 
@@ -95,115 +101,7 @@
        /// <param name="areas"></param>
        /// <returns></returns>
        public static Expression<Func<TN_Location, bool>> EndLoc(string name = "", List<string> areas = null) {
            Expression<Func<TN_Location, bool>> expr =
                l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.N_CURRENT_NUM == 0;
            if (!string.IsNullOrEmpty(name)) {
                Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            if (areas != null && areas.Count > 0) {
                Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
            }
            return expr;
            return LocFilter(0, name, areas, 0);
        }
    }
    #region 旧查询类 ( 搁置 )
    /// <summary>
    /// [ 数据库查询 ] 帮助类
    /// </summary>
    /// <remarks><b>[ 搁置 ]</b> 类与方法暂时设为私有<br/><b>[ 理由 ]</b> 引用外部 db 存在风险 ; 不适用于联表查询场景 , 不够灵活</remarks>
    class DbQuery {
        /// <summary>
        /// 构建 [ 货位 ] 查询表达式 : 筛选条件 : 锁状态 / 名称 / 货区 / 当前容器数量 ( 默认筛选已启用货位 )
        /// </summary>
        /// <param name="db">调用区域的 SqlSugarClient</param>
        /// <param name="lock">锁状态 ( 小于 0 时忽略 )</param>
        /// <param name="name">货位名称 ( 为 null 或 "" 时忽略 )</param>
        /// <param name="areas">所在库区列表 ( 为 null 或 [] 时忽略 )</param>
        /// <param name="curNum">当前数量 ( 小于 0 时忽略 )</param>
        /// <returns></returns>
        static ISugarQueryable<TN_Location> Loc(SqlSugarClient db, int @lock, string name, List<string> areas, int curNum) {
            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y"); // 已启用
            if (@lock >= 0) {
                query = query.Where(l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock));
            }
            if (!string.IsNullOrEmpty(name)) {
                query = query.Where(l => l.S_CODE == name);
            }
            if (areas != null && areas.Count != 0) {
                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
            }
            if (curNum >= 0) {
                query = query.Where(l => l.N_CURRENT_NUM == curNum);
            }
            return query;
        }
        /// <summary>
        /// 构建 [ 起点货位 ( 绑定前 ) ] 查询表达式 : 筛选条件 : 名称 / 货区 ( 默认筛选 : 已启用 / 未上锁 / 当前容器数量 = 0 )
        /// </summary>
        /// <param name="db">调用区域的 SqlSugarClient</param>
        /// <param name="name">货位名称 ( 为 null 或 "" 时忽略 )</param>
        /// <param name="areas">所在库区列表 ( 为 null 或 [] 时忽略 )</param>
        /// <returns></returns>
        static ISugarQueryable<TN_Location> StartLocUnbind(SqlSugarClient db, string name, List<string> areas) {
            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 0); // 已启用,未上锁,当前容器数量=0(初始未绑定容器)
            if (!string.IsNullOrEmpty(name)) {
                query = query.Where(l => l.S_CODE == name);
            }
            if (areas != null && areas.Count != 0) {
                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
            }
            return query;
        }
        /// <summary>
        /// 构建 [ 起点货位 ( 绑定后 ) ] 查询表达式 : 筛选条件 : 名称 / 货区 ( 默认筛选 : 已启用 / 未上锁 / 当前容器数量 = 1 )
        /// </summary>
        /// <param name="db">调用区域的 SqlSugarClient</param>
        /// <param name="name">货位名称 ( 为 null 或 "" 时忽略 )</param>
        /// <param name="areas">所在库区列表 ( 为 null 或 [] 时忽略 )</param>
        /// <returns></returns>
        static ISugarQueryable<TN_Location> StartLoc(SqlSugarClient db, string name, List<string> areas) {
            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 1); // 已启用,未上锁,当前容器数量=1(已绑定容器)
            if (!string.IsNullOrEmpty(name)) {
                query = query.Where(l => l.S_CODE == name);
            }
            if (areas != null && areas.Count != 0) {
                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
            }
            return query;
        }
        /// <summary>
        /// 构建 [ 终点货位 ] 查询表达式 : 筛选条件 : 名称 / 货区 ( 默认筛选 : 已启用 / 未上锁 / 当前容器数量 = 0 )
        /// </summary>
        /// <param name="db">调用区域的 SqlSugarClient</param>
        /// <param name="name">货位名称 ( 为 null 或 "" 时忽略 )</param>
        /// <param name="areas">所在库区列表 ( 为 null 或 [] 时忽略 )</param>
        /// <returns></returns>
        static ISugarQueryable<TN_Location> EndLoc(SqlSugarClient db, string name, List<string> areas) {
            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 0); // 已启用,未上锁,当前容器数量=0(未绑定容器)
            if (!string.IsNullOrEmpty(name)) {
                query = query.Where(l => l.S_CODE == name);
            }
            if (areas != null && areas.Count != 0) {
                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
            }
            return query;
        }
    }
    #endregion
}