using AutoMapper; using Kean.Domain.Task.Models; using Kean.Domain.Wcs.Models; using Kean.Infrastructure.Database; using Kean.Infrastructure.Database.Repository.Default; using Kean.Infrastructure.Database.Repository.Default.Entities; using Kean.Infrastructure.Database.Repository.Default.Entities.Interface; using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Threading.Tasks; namespace Kean.Infrastructure.Repository { /// /// 任务仓库 /// public class TaskRepository : Domain.Task.Repositories.ITaskRepository { private readonly IMapper _mapper; private readonly IDefaultDb _database; /// /// 构造函数 /// public TaskRepository( IMapper mapper, IDefaultDb database) { _mapper = mapper; _database = database; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasTask 方法 */ public async Task HasTask(int? original, int? destination) { var schema = _database.From(); if (original.HasValue) { schema.Where(m => m.START_CELL_ID == original); } if (destination.HasValue) { schema.Where(m => m.END_CELL_ID == destination); } return (await schema.Single(m => new { Count = Function.Count(m.MANAGE_ID) })).Count > 0; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasTask 方法 */ public async Task HasTask(string barcode, string originalGroup = null, string destinationGroup = null) { var schema = _database.From().Where(m => m.STOCK_BARCODE == barcode); //var queryControl999 = _database.From().Where(r => r.STOCK_BARCODE == barcode && (r.CONTROL_STATUS == 999 || r.CONTROL_STATUS == 1009)).Query(r => new { r.MANAGE_ID }); //schema.Where(r => !queryControl999.Contains(r.MANAGE_ID)); if (originalGroup != null) { var query = _database.From().Where(c => c.CELL_GROUP == originalGroup).Query(c => new { c.CELL_ID }); schema.Where(m => query.Contains(m.START_CELL_ID)); } if (destinationGroup != null) { var query = _database.From().Where(c => c.CELL_GROUP == destinationGroup).Query(c => new { c.CELL_ID }); schema.Where(m => query.Contains(m.END_CELL_ID)); } return (await schema.Single(m => new { Count = Function.Count(m.MANAGE_ID) })).Count > 0; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTask 方法 */ public async Task GetTask(int id) { var task = await _database.From() .Where(m => m.MANAGE_ID == id) .Single(); return task == null ? null : _mapper.Map(task); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTask 方法 */ public async Task GetTask(Domain.Task.Models.Cell cell) { var task = await _database.From() .Where(m => m.START_CELL_ID == cell.Id || m.END_CELL_ID == cell.Id) .Single(); return task == null ? null : _mapper.Map(task); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetFollowed 方法 */ public async Task> GetFollows(int id) { var manageQuery = _database.From() .Where(m => m.PREVIOUS_ID == id) .Query(r => r.MANAGE_ID); var control = await _database.From() .Where(r => manageQuery.Contains(r.MANAGE_ID)) .Select(); if (control == null || ((System.Collections.Generic.List)control).Count ==0) { return _mapper.Map>(await _database.From() .Where(m => m.PREVIOUS_ID == id) .Select()); } else { return _mapper.Map>(await _database.From() .Where(m => m.PREVIOUS_ID == -1) .Select()); } } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetCancelFollows 方法 */ public async Task> GetCancelFollows(int id) { return _mapper.Map>(await _database.From() .Where(m => m.PREVIOUS_ID == id && (m.MANAGE_TYPE == "ApplyOut" || m.MANAGE_TYPE == "PalletOut" || m.MANAGE_TYPE == "Outbound")) .Select()); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.CreateTask 方法 */ public async Task CreateTask(Domain.Task.Models.Task task) { var entity = _mapper.Map(task); entity.MANAGE_STATUS = nameof(Domain.Task.Enums.TaskState.Waiting); entity.UPDATE_TIME = entity.CREATE_TIME = DateTime.Now; return Convert.ToInt32(await _database.From().Add(entity)); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.DeleteTask 方法 */ public async System.Threading.Tasks.Task DeleteTask(int id) { await _database.From() .Where(m => m.MANAGE_ID == id) .Delete(); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.UpdatePrevious 方法 */ public async System.Threading.Tasks.Task UpdatePrevious(int old, int @new) { await _database.From() .Where(m => m.PREVIOUS_ID == old) .Update(new { PREVIOUS_ID = @new, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.UpdateStatus 方法 */ public async System.Threading.Tasks.Task UpdateStatus(int id, Domain.Task.Enums.TaskState state, string message = null) { if (!string.IsNullOrEmpty(message) && message.Length > 300) { message = message.Substring(0, 300); } await _database.From() .Where(m => m.MANAGE_ID == id) .Update(new { MANAGE_STATUS = state.ToString(), MANAGE_REMARK = message, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasTask 方法 */ public async Task HasTaskByRequestno(string requestno) { var schema = _database.From().Where(m => m.REQUEST_NO == requestno); return (await schema.Single(m => new { Count = Function.Count(m.MANAGE_ID) })).Count > 0; } /////////////////////////////////////////////////////////////// /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTaskByBarcode 方法 */ public async Task GetTaskByBarcode(string barcode) { var task = await _database.From() .Where(m => m.STOCK_BARCODE == barcode) .Single(); return task == null ? null : _mapper.Map(task); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.UpdateTransitPlace 方法 */ public async System.Threading.Tasks.Task UpdateTransitPlace(int id, int transitPlace) { await _database.From() .Where(m => m.MANAGE_ID == id) .Update(new { TRANSIT_CELL_ID = transitPlace, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetOutAreaFromItem 方法 */ public async Task GetOutAreaFromItem(string itemCode,string lineCode) { int resultArea = 0; var item = await _database.From() .Where(r => r.ITEM_CODE == itemCode && r.ITEM_LIST_CODE == lineCode) .Single(); if (item != null) { try { resultArea = Convert.ToInt32(item.ITEM_LIST_REMARK); } catch { } } return resultArea; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetBypassTag 方法 */ public async Task GetBypassTag(string barcode) { string resultTag = null; var stock = await _database.From() .Where(r => r.STOCK_BARCODE == barcode) .Single(); if (stock != null) { resultTag = stock.TAG; } return resultTag; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasOutput 方法 */ public async Task HasOutput(int task) { var schema = _database.From() .Where(r => r.MANAGE_ID == task); return (await schema.Single(m => new { Count = Function.Count(m.CONTROL_ID) })).Count > 0; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.SetPriority 方法 */ public async System.Threading.Tasks.Task SetPriority(int id, int priority) { await _database.From() .Where(m => m.MANAGE_ID == id) .Update(new { PRIORITY = priority, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetLines 方法 */ public async Task> GetLines(string barcode) { var query = _database.From() .Where(s => s.STOCK_BARCODE == barcode) .Query(s => s.STORAGE_ID); return _mapper.Map>(await _database.From() .Where(s => query.Contains(s.STORAGE_ID)) .Select()); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.SetErrorStatus 方法 */ public async System.Threading.Tasks.Task SetErrorStatus(string barcode, string status, string message) { var driver = Infrastructure.Database.Configuration.Configure("Default"); using (var context = driver.CreateContext()) { await context.From() .Where(m => m.STOCK_BARCODE == barcode) .Update(new { MANAGE_STATUS = status, MANAGE_REMARK = message, UPDATE_TIME = DateTime.Now }); } } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetStorageLinesForOrderNo 方法 */ public async Task> GetStorageLinesForOrderNo(string orderNo) { var queryStockBarcode = _database.From() .Where(s => s.REQUEST_NO == orderNo) .Query(s => s.STOCK_BARCODE); var query = _database.From() .Where(s => queryStockBarcode.Contains(s.STOCK_BARCODE)) .Query(s => s.STORAGE_ID); return _mapper.Map>(await _database.From() .Where(s => query.Contains(s.STORAGE_ID)) .Select()); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTaskByRequestNo 方法 */ public async Task> GetTaskByRequestNo(string requestNo) { var tasks = await _database.From() .Where(m => m.REQUEST_NO == requestNo) .Select(); return tasks == null ? null : _mapper.Map< IEnumerable>(tasks); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetPalletOutManageCount 方法 */ public async Task GetPalletOutManageCount(string device) { var taskCount = await _database.From() .Where(r => r.END_CELL_ID == int.Parse(device)) .Single(m => new { Count = Function.Count(m.MANAGE_ID) }); return taskCount == null ? 0 : taskCount.Count; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasMovePalletFromLaXian 方法 */ public async Task HasMovePalletFromLaXian(string device, int goodsId) { var taskCount = await _database.From() .Join(Join.Inner, (m, c) => m.STOCK_BARCODE == c.STOCK_BARCODE) .Where((m, c) => m.END_DEVICE_CODE == device && c.GOODS_ID == goodsId) .Select((m,c) => new { m.CONTROL_BEGIN_TIME }); foreach (var m in taskCount) { if (Convert.ToDateTime(m.CONTROL_BEGIN_TIME) > System.DateTime.Now.AddMinutes(-30)) { return true; } } //.Single((m, c) => new { Count = Function.Count(m.MANAGE_ID) }); //return taskCount.Count>0; return false; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetRepairFollowed 方法 */ public async Task> GetRepairFollowed() { var previousManageQuery = _database.From() .Query(r => r.MANAGE_ID); var manageQuery = _database.From() .Where(m => m.PREVIOUS_ID > 0 && !previousManageQuery.Contains(m.PREVIOUS_ID)) .Query(r => r.MANAGE_ID); var control = await _database.From() .Where(r => manageQuery.Contains(r.MANAGE_ID)) .Select(); if (control == null || ((System.Collections.Generic.List)control).Count == 0) { return _mapper.Map>(await _database.From() .Where(m => m.PREVIOUS_ID > 0 && !previousManageQuery.Contains(m.PREVIOUS_ID)) .Select()); } else { return _mapper.Map>(await _database.From() .Where(m => m.PREVIOUS_ID == -1) .Select()); } } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetRepairFollowed 方法 */ public async System.Threading.Tasks.Task ReSetStockBarcode(string originalStockBarcode, string newStockBarcode) { await _database.From() .Where(m => m.STOCK_BARCODE == originalStockBarcode) .Update(new { STOCK_BARCODE = newStockBarcode, UPDATE_TIME = DateTime.Now }); } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasAGVInput 方法 */ public async Task HasAGVInput() { var schema = _database.From(); schema.Where(m => m.CONTROL_APPLY_TYPE == "3" && m.APPLY_TASK_STATUS == 3); return (await schema.Single(m => new { Count = Function.Count(m.CONTROL_APPLY_ID) })).Count > 0; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetStockbarcode 方法 */ public async Task GetStockbarcode(int station) { var stockBarcode = await _database.From() .Where(r => r.CELL_ID == station) .Single(); return stockBarcode?.STOCK_BARCODE; } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.RemoveAGVInput 方法 */ public async System.Threading.Tasks.Task RemoveAGVInput() { var applys = await _database.From().Where(r => r.APPLY_TASK_STATUS == 3 && r.CONTROL_APPLY_TYPE == "3").Select(); foreach (var apply in applys) { var entity = _mapper.Map(apply); entity.UPDATE_TIME = entity.CREATE_TIME = DateTime.Now; await _database.From().Add(entity); await _database.From().Where(r => r.CONTROL_APPLY_ID == apply.CONTROL_APPLY_ID).Delete(); } } /* * 实现 Kean.Domain.Task.Repositories.ITaskRepository.IsPallet 方法 */ public async Task IsPallet(int goodsid) { return (await _database.From() .Join(Join.Inner, (m, c) => m.CLASS_ID == c.CLASS_ID) .Where((m, c) => c.CLASS_FLAG == true && m.GOODS_ID == goodsid && c.CLASS_PARENT_ID == 4) .Single((m, c) => new { Count = Function.Count(c.CLASS_ID) })).Count > 0; } } }