WYB
2021-03-22 91b8cdad021ab052e4991f3d41834a6f0ddc36b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using JiepeiWMS.IRepository.Base;
using JiepeiWMS.Model.Interfaces;
using System.Linq;
using System.Threading.Tasks;
using JiepeiWMS.Extends;
using System;
 
namespace JiepeiWMS.Repository.Base
{
    /// <summary>
    /// 排序扩展
    /// </summary>
    public static class ExtSortBy
    {
        /// <summary>
        /// 移动到指定目标Id位置(可以批量移动,多条数据按ID由小到大排列)需配合事务,防止错误时可回滚
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="Dal">仓储类</param>
        /// <param name="TargetId">指定目标Id</param>
        /// <param name="Where">符合附加条件记录进行排序</param>
        /// <param name="Models">模型列表</param>
        /// <returns>返回仓储类</returns>
        public static async Task<IBaseRepository<T>> _SortByMoveTo<T>(this IBaseRepository<T> Dal, int TargetId, string Where, params T[] Models) where T : class, IModSortBy
        {
            var tableName = typeof(T).Name;
            var fieldSortBy = "SortById";
            var where = string.IsNullOrEmpty(Where) ? string.Empty : Where + " and ";
            var ids = string.Join(",", Models.Select(t => t.Id));
 
            //先更新当前排序编号,再更新当前信息之后的
            var tb = await Dal.QueryTable(string.Format("select {1} from {0} where Id={2};", tableName, fieldSortBy, TargetId));
            int tsortid = tb.Rows.Count > 0 ? (int)tb.Rows[0][0] : 0;
            int sortid = tsortid;
            //是否放置最后
            if (tsortid == 0)
            {
                var sqlmax = string.Format("select max({0}) from [{1}] where {2}", fieldSortBy, tableName, where.Substring(0,where.Length-5));
                tb = await Dal.QueryTable(sqlmax);
                var objmax = tb.Rows.Count > 0 ? tb.Rows[0][0] : null;
                sortid = objmax == null || objmax == DBNull.Value ? 1 : (int)objmax;
            }
            foreach (var mod in Models)
            {
                mod.SortById = sortid + 1;
            }
            //移动到目标之前时需更新目标后面的数据
            if (tsortid > 0)
            {
                var sql = string.Format(@"
update [{0}] set {1}={1}+2 where {2}{1}>={4};
update [{0}] set {1}={1}-2 where {2}Id<{5} and {1}={4}+2;
update [{0}] set {1}={4}+1 where Id in ({3});
", tableName, fieldSortBy, where, ids, sortid, TargetId);
                var obj = Dal.ExecuteSqlCommand(sql);
            }
            return Dal;
        }
        /// <summary>
        /// 移动到指定目标Id位置(可以批量移动,多条数据按ID由小到大排列)
        /// </summary>
        /// <typeparam name="T">模型类型</typeparam>
        /// <param name="Dal">仓储类</param>
        /// <param name="TargetId">指定目标Id</param>
        /// <param name="Where">符合附加条件记录进行排序</param>
        /// <param name="Modes">模型列表</param>
        /// <returns>返回仓储类</returns>
        public static async Task<IBaseRepository<T>> _SortByMoveTo<T>(this IBaseRepository<T> Dal, int TargetId, params T[] Modes) where T : class, IModSortBy
        {
            var obj = _SortByMoveTo(Dal, TargetId, string.Empty, Modes);
            return Dal;
        }
    }
}