山东雷驰
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

483 lines
18 KiB

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
{
/// <summary>
/// 任务仓库
/// </summary>
public class TaskRepository :
Domain.Task.Repositories.ITaskRepository
{
private readonly IMapper _mapper;
private readonly IDefaultDb _database;
/// <summary>
/// 构造函数
/// </summary>
public TaskRepository(
IMapper mapper,
IDefaultDb database)
{
_mapper = mapper;
_database = database;
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasTask 方法
*/
public async Task<bool> HasTask(int? original, int? destination)
{
var schema = _database.From<T_MANAGE_MAIN>();
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<bool> HasTask(string barcode, string originalGroup = null, string destinationGroup = null)
{
var schema = _database.From<T_MANAGE_MAIN>().Where(m => m.STOCK_BARCODE == barcode);
//var queryControl999 = _database.From<IO_CONTROL>().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<T_WH_CELL>().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<T_WH_CELL>().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<Domain.Task.Models.Task> GetTask(int id)
{
var task = await _database.From<T_MANAGE_MAIN>()
.Where(m => m.MANAGE_ID == id)
.Single();
return task == null ? null : _mapper.Map<Domain.Task.Models.Task>(task);
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTask 方法
*/
public async Task<Domain.Task.Models.Task> GetTask(Domain.Task.Models.Cell cell)
{
var task = await _database.From<T_MANAGE_MAIN>()
.Where(m => m.START_CELL_ID == cell.Id || m.END_CELL_ID == cell.Id)
.Single();
return task == null ? null : _mapper.Map<Domain.Task.Models.Task>(task);
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetFollowed 方法
*/
public async Task<IEnumerable<Domain.Task.Models.Task>> GetFollows(int id)
{
var manageQuery = _database.From<T_MANAGE_MAIN>()
.Where(m => m.PREVIOUS_ID == id)
.Query(r => r.MANAGE_ID);
var control = await _database.From<IO_CONTROL>()
.Where(r => manageQuery.Contains(r.MANAGE_ID))
.Select();
if (control == null || ((System.Collections.Generic.List<Kean.Infrastructure.Database.Repository.Default.Entities.Interface.IO_CONTROL>)control).Count ==0)
{
return _mapper.Map<IEnumerable<Domain.Task.Models.Task>>(await _database.From<T_MANAGE_MAIN>()
.Where(m => m.PREVIOUS_ID == id)
.Select());
}
else
{
return _mapper.Map<IEnumerable<Domain.Task.Models.Task>>(await _database.From<T_MANAGE_MAIN>()
.Where(m => m.PREVIOUS_ID == -1)
.Select());
}
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetCancelFollows 方法
*/
public async Task<IEnumerable<Domain.Task.Models.Task>> GetCancelFollows(int id)
{
return _mapper.Map<IEnumerable<Domain.Task.Models.Task>>(await _database.From<T_MANAGE_MAIN>()
.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<int> CreateTask(Domain.Task.Models.Task task)
{
var entity = _mapper.Map<T_MANAGE_MAIN>(task);
entity.MANAGE_STATUS = nameof(Domain.Task.Enums.TaskState.Waiting);
entity.UPDATE_TIME = entity.CREATE_TIME = DateTime.Now;
return Convert.ToInt32(await _database.From<T_MANAGE_MAIN>().Add(entity));
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.DeleteTask 方法
*/
public async System.Threading.Tasks.Task DeleteTask(int id)
{
await _database.From<T_MANAGE_MAIN>()
.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<T_MANAGE_MAIN>()
.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<T_MANAGE_MAIN>()
.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<bool> HasTaskByRequestno(string requestno)
{
var schema = _database.From<T_MANAGE_MAIN>().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<Domain.Task.Models.Task> GetTaskByBarcode(string barcode)
{
var task = await _database.From<T_MANAGE_MAIN>()
.Where(m => m.STOCK_BARCODE == barcode)
.Single();
return task == null ? null : _mapper.Map<Domain.Task.Models.Task>(task);
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.UpdateTransitPlace 方法
*/
public async System.Threading.Tasks.Task UpdateTransitPlace(int id, int transitPlace)
{
await _database.From<T_MANAGE_MAIN>()
.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<int> GetOutAreaFromItem(string itemCode,string lineCode)
{
int resultArea = 0;
var item = await _database.From<V_SYS_ITEM_LIST>()
.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<string> GetBypassTag(string barcode)
{
string resultTag = null;
var stock = await _database.From<T_STORAGE_MAIN>()
.Where(r => r.STOCK_BARCODE == barcode)
.Single();
if (stock != null)
{
resultTag = stock.TAG;
}
return resultTag;
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasOutput 方法
*/
public async Task<bool> HasOutput(int task)
{
var schema = _database.From<IO_CONTROL>()
.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<T_MANAGE_MAIN>()
.Where(m => m.MANAGE_ID == id)
.Update(new
{
PRIORITY = priority,
UPDATE_TIME = DateTime.Now
});
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetLines 方法
*/
public async Task<IEnumerable<StockLine>> GetLines(string barcode)
{
var query = _database.From<T_STORAGE_MAIN>()
.Where(s => s.STOCK_BARCODE == barcode)
.Query(s => s.STORAGE_ID);
return _mapper.Map<IEnumerable<StockLine>>(await _database.From<T_STORAGE_LIST>()
.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<T_MANAGE_MAIN>()
.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<IEnumerable<StockLine>> GetStorageLinesForOrderNo(string orderNo)
{
var queryStockBarcode = _database.From<T_MANAGE_MAIN>()
.Where(s => s.REQUEST_NO == orderNo)
.Query(s => s.STOCK_BARCODE);
var query = _database.From<T_STORAGE_MAIN>()
.Where(s => queryStockBarcode.Contains(s.STOCK_BARCODE))
.Query(s => s.STORAGE_ID);
return _mapper.Map<IEnumerable<StockLine>>(await _database.From<T_STORAGE_LIST>()
.Where(s => query.Contains(s.STORAGE_ID))
.Select());
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetTaskByRequestNo 方法
*/
public async Task<IEnumerable<Domain.Task.Models.Task>> GetTaskByRequestNo(string requestNo)
{
var tasks = await _database.From<T_MANAGE_MAIN>()
.Where(m => m.REQUEST_NO == requestNo)
.Select();
return tasks == null ? null : _mapper.Map< IEnumerable<Domain.Task.Models.Task>>(tasks);
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.GetPalletOutManageCount 方法
*/
public async Task<int> GetPalletOutManageCount(string device)
{
var taskCount = await _database.From<T_MANAGE_MAIN>()
.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<bool> HasMovePalletFromLaXian(string device, int goodsId)
{
var taskCount = await _database.From<IO_CONTROL, V_STORAGE_LIST>()
.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<IEnumerable<Domain.Task.Models.Task>> GetRepairFollowed()
{
var previousManageQuery = _database.From<T_MANAGE_MAIN>()
.Query(r => r.MANAGE_ID);
var manageQuery = _database.From<T_MANAGE_MAIN>()
.Where(m => m.PREVIOUS_ID > 0 && !previousManageQuery.Contains(m.PREVIOUS_ID))
.Query(r => r.MANAGE_ID);
var control = await _database.From<IO_CONTROL>()
.Where(r => manageQuery.Contains(r.MANAGE_ID))
.Select();
if (control == null || ((System.Collections.Generic.List<Kean.Infrastructure.Database.Repository.Default.Entities.Interface.IO_CONTROL>)control).Count == 0)
{
return _mapper.Map<IEnumerable<Domain.Task.Models.Task>>(await _database.From<T_MANAGE_MAIN>()
.Where(m => m.PREVIOUS_ID > 0 && !previousManageQuery.Contains(m.PREVIOUS_ID))
.Select());
}
else
{
return _mapper.Map<IEnumerable<Domain.Task.Models.Task>>(await _database.From<T_MANAGE_MAIN>()
.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<T_STORAGE_MAIN>()
.Where(m => m.STOCK_BARCODE == originalStockBarcode)
.Update(new
{
STOCK_BARCODE = newStockBarcode,
UPDATE_TIME = DateTime.Now
});
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.HasAGVInput 方法
*/
public async Task<bool> HasAGVInput()
{
var schema = _database.From<IO_CONTROL_APPLY>();
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<string> GetStockbarcode(int station)
{
var stockBarcode = await _database.From<T_STORAGE_MAIN>()
.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<IO_CONTROL_APPLY>().Where(r => r.APPLY_TASK_STATUS == 3 && r.CONTROL_APPLY_TYPE == "3").Select();
foreach (var apply in applys)
{
var entity = _mapper.Map<T_IO_CONTROL>(apply);
entity.UPDATE_TIME = entity.CREATE_TIME = DateTime.Now;
await _database.From<T_IO_CONTROL>().Add(entity);
await _database.From<IO_CONTROL_APPLY>().Where(r => r.CONTROL_APPLY_ID == apply.CONTROL_APPLY_ID).Delete();
}
}
/*
* 实现 Kean.Domain.Task.Repositories.ITaskRepository.IsPallet 方法
*/
public async Task<bool> IsPallet(int goodsid)
{
return (await _database.From<T_GOODS_MAIN, T_GOODS_CLASS>()
.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;
}
}
}