using Kean.Infrastructure.Database; using Kean.Infrastructure.Database.Repository.Default; using Kean.Infrastructure.Database.Repository.Default.Entities; using System; using System.Threading.Tasks; namespace Kean.Infrastructure.Repository { /// /// 菜单仓库 /// public class MenuRepository : Domain.Order.Repositories.IMenuRepository { private const int CUSTOM_MIN = 9901; // 自定义菜单最小 ID private const int CUSTOM_MAX = 9999; // 自定义菜单最大 ID private readonly IDefaultDb _database; // 默认数据库 /// /// 构造函数 /// public MenuRepository( IDefaultDb database) { _database = database; } /* * 实现 Kean.Domain.Order.Repositories.IMenuRepository.Create 方法 */ public async Task Create(string header, string url, int parent) { var last = await _database.From() .Where(m => m.MENU_ID >= CUSTOM_MIN && m.MENU_ID <= CUSTOM_MAX) .OrderBy(m => m.MENU_ID, Order.Descending) .Single(); var timestamp = DateTime.Now; var menu = new T_SYS_MENU { MENU_HEADER = header, MENU_URL = url, MENU_PARENT_ID = parent, MENU_FLAG = true, CREATE_TIME = timestamp, UPDATE_TIME = timestamp }; if (last == null) { menu.MENU_ID = CUSTOM_MIN; } else { if ((menu.MENU_ID = last.MENU_ID + 1) > CUSTOM_MAX) { throw new OverflowException("菜单长度超出范围"); } } await _database.From().Add(menu); return menu.MENU_ID; } /* * 实现 Kean.Domain.Order.Repositories.IMenuRepository.Modify 方法 */ public async Task Modify(int id, string header, string url, int parent) { await _database.From() .Where(m => m.MENU_ID == id) .Update(new { MENU_HEADER = header, MENU_URL = url, MENU_PARENT_ID = parent, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Order.Repositories.IMenuRepository.Delete 方法 */ public async Task Delete(int id) { await _database.From() .Where(m => m.MENU_ID == id) .Delete(); } /* * 实现 Kean.Domain.Order.Repositories.IMenuRepository.Sort 方法 */ public async Task Sort(int id, int order) { var timestamp = DateTime.Now; var index = -1; var flag = false; var parent = _database.From().Where(m => m.MENU_ID == id).Query(m => m.MENU_PARENT_ID); foreach (var item in await _database.From() .Where(m => parent.Contains(m.MENU_PARENT_ID)) .OrderBy(m => m.MENU_ORDER, Order.Ascending) .OrderBy(m => m.MENU_ID, Order.Ascending) .Select()) { if (++index >= order) { int value; if (!flag) { if (item.MENU_ID != id) { value = index - order + 2; } else { value = 1; flag = true; } } else { value = index - order + 1; } await _database.From() .Where(m => m.MENU_ID == item.MENU_ID) .Update(new { MENU_ORDER = value, UPDATE_TIME = timestamp }); } } } } }