山东雷驰
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.
 
 
 
 

626 lines
24 KiB

using AutoMapper;
using Kean.Application.Query.Interfaces;
using Kean.Application.Query.Sockets;
using Kean.Infrastructure.Database;
using Kean.Infrastructure.Database.Repository.Default;
using Kean.Infrastructure.Database.Repository.Default.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Kean.Application.Query.Implements
{
/// <summary>
/// TV显示信息查询服务
/// </summary>
public sealed class StatisticsService : IStatisticsService
{
private readonly IMapper _mapper; // 模型映射
private readonly IDefaultDb _database; // 默认数据库
//private readonly IOnlineSocket _onlineSocket; // 连接管道
/// <summary>
/// 依赖注入
/// </summary>
public StatisticsService(
IDefaultDb database,
//IOnlineSocket onlineSocket,
IMapper mapper)
{
_database = database;
_mapper = mapper;
//_onlineSocket = onlineSocket;
}
/*
* 实现 Kean.Application.Query.Interfaces.IStatisticsService.GetTvStatistics 方法
*/
public async Task<object> GetTvStatistics(
int? area)
{
int tempArae = 0;
if (area.HasValue)
{
tempArae = area.Value;
if (area == 8 || area == 7)
{
tempArae = 6;
}
if (area == 3 || area == 2)
{
tempArae = 1;
}
}
////统计 库存-货期(过期 警告 正常)
var stockAgeSchema = _database.From<V_SYS_ITEM_LIST, V_STORAGE_LIST>();
if (area.HasValue)
{
if (area == 2 || area == 7)
{
stockAgeSchema.Join(Join.Left, (m, n) => n.AGE_STATUS == m.ITEM_LIST_CODE && n.AREA_ID == tempArae && (n.CLASS_ID == 2 || n.CLASS_ID == 3));
}
else
{
stockAgeSchema.Join(Join.Left, (m, n) => n.AGE_STATUS == m.ITEM_LIST_CODE && (n.AREA_ID == 1 || n.AREA_ID == 6) && (n.CLASS_ID == 2 || n.CLASS_ID == 3));
}
}
else
{
stockAgeSchema.Join(Join.Left, (m, n) => n.AGE_STATUS == m.ITEM_LIST_CODE && (n.AREA_ID == 1 || n.AREA_ID == 6) && (n.CLASS_ID == 2 || n.CLASS_ID == 3));
}
var stockAge = await stockAgeSchema
.Where((m, n) => m.ITEM_CODE == "goodsAgeStatus")
.GroupBy((m, n) => m.ITEM_LIST_NAME)
.GroupBy((m, n) => m.ITEM_LIST_CODE)
.OrderBy((m, n) => m.ITEM_LIST_CODE, Infrastructure.Database.Order.Descending)
.Select((m, n) => new
{
name = m.ITEM_LIST_NAME,
value = Function.Count(n.STORAGE_ID)
});
////统计 库存-膜卷编码
var stockTypeSchema = _database.From<V_STORAGE_LIST>().Lock(Lock.Nolock);
if (area.HasValue)
{
if (area == 2 || area == 7)
{
stockTypeSchema.Where(r => r.AREA_ID == tempArae);
}
}
var stockType = await stockTypeSchema
.Where(r=>(r.CLASS_ID == 2 || r.CLASS_ID == 3) && (r.AREA_ID == 1 || r.AREA_ID == 6))
.GroupBy(r => r.GOODS_NAME)
.OrderBy(r => r.GOODS_NAME, Infrastructure.Database.Order.Ascending)
.Select(r=>new {
name = r.GOODS_NAME,
value = Function.Count(r.GOODS_NAME)
});
////统计 货位使用率
var stockCellRateMaxSchema = _database.From<T_WH_CELL>().Lock(Lock.Nolock);
if (area.HasValue)
{
stockCellRateMaxSchema.Where(r => r.AREA_ID == tempArae);
}
var stockCellRateMax = await stockCellRateMaxSchema
.Where(r => r.CELL_TYPE == "Cell" && r.CELL_FLAG == true && r.RUN_STATUS != "Disabled")
.GroupBy(r => r.CELL_LANEWAY)
.OrderBy(r => r.CELL_LANEWAY, Infrastructure.Database.Order.Ascending)
.Select(r => new {
name = r.CELL_LANEWAY,
max = Function.Count(r.CELL_LANEWAY)
}) ;
//select CELL_LANEWAY, count(0) from T_WH_CELL with (nolock) where CELL_TYPE = 'Cell' and CELL_STATUS <> 'Empty' group by CELL_LANEWAY order by CELL_LANEWAY
var stockCellRateValueSchema = _database.From<T_WH_CELL>().Lock(Lock.Nolock);
if (area.HasValue)
{
stockCellRateValueSchema.Where(r => r.AREA_ID == tempArae);
}
var stockCellRateValueTemp = await stockCellRateValueSchema
.Where(r => r.CELL_TYPE == "Cell" && r.CELL_STATUS != "Empty" && r.CELL_FLAG == true && r.RUN_STATUS != "Disabled")
.GroupBy(r => r.CELL_LANEWAY)
.OrderBy(r => r.CELL_LANEWAY, Infrastructure.Database.Order.Ascending)
.Select(r => new {
name = r.CELL_LANEWAY,
value = Function.Count(r.CELL_LANEWAY)
});
List<int[]> lsStockCellRateValue = new List<int[]>();
List<int> stockCellRateValue = new List<int>();
int cellSummaryMax = 0;
int cellSummaryFull = 0;
foreach (var m in stockCellRateMax)
{
cellSummaryMax += m.max;
var temp = stockCellRateValueTemp.Where(r => r.name == m.name);
if (temp.Count() > 0)
{
cellSummaryFull += temp.First().value;
stockCellRateValue.Add(temp.First().value);
}
else
{
stockCellRateValue.Add(0);
}
}
lsStockCellRateValue.Add(stockCellRateValue.ToArray());
//货位使用率文字信息
var stockCellRateSummary = new
{
max = cellSummaryMax,
full = cellSummaryFull
};
////汇总信息-今日入库 今日出库 在途入库 在途出库 剩余货位 在库膜卷
//今日入库
var todayRecordInCountSchema = _database.From<V_RECORD>().Lock(Lock.Nolock);
if (area.HasValue)
{
todayRecordInCountSchema.Where(r => r.START_AREA_ID == area);
}
var todayRecordInCount = (await todayRecordInCountSchema
.Where(r => r.BEGIN_TIME >= System.DateTime.Now.Date && r.BEGIN_TIME <= DateTime.Now.Date.AddDays(1))
.Where(r => r.RECORD_TYPE == "Infeed")
.Single(r => new { Count = Function.Count(r.RECORD_ID) }))
.Count();
//今日出库
var todayRecordOutCountSchema = _database.From<V_RECORD>().Lock(Lock.Nolock);
if (area.HasValue)
{
todayRecordOutCountSchema.Where(r => r.END_AREA_ID == area);
}
var todayRecordOutCount = (await todayRecordOutCountSchema
.Where(r => r.BEGIN_TIME >= System.DateTime.Now.Date && r.BEGIN_TIME <= DateTime.Now.Date.AddDays(1))
.Where(r => (r.RECORD_TYPE == "ApplyOut" || r.RECORD_TYPE == "PalletOut"))
.Single(r => new { Count = Function.Count(r.RECORD_ID) }))
.Count();
//在途入库
var todayManageInCountSchema = _database.From<V_MANAGE_MAIN>().Lock(Lock.Nolock);
if (area.HasValue)
{
todayManageInCountSchema.Where(r => r.START_AREA_ID == area);
}
var todayManageInCount = (await todayManageInCountSchema
.Where(r => r.BEGIN_TIME >= DateTime.Now.Date && r.BEGIN_TIME <= DateTime.Now.Date.AddDays(1))
.Where(r => r.END_AREA_ID == 1 || r.END_AREA_ID == 6)
.Single(r => new { Count = Function.Count(r.MANAGE_ID) }))
.Count();
var todayStorageCacheCountSchema = _database.From<V_STORAGE>().Lock(Lock.Nolock);
if (area.HasValue)
{
todayStorageCacheCountSchema.Where(r=>r.APPLYIN_AREA == area);
}
var todayStorageCacheCount = (await todayStorageCacheCountSchema
.Where(r => r.CREATE_TIME >= DateTime.Now.Date && r.CREATE_TIME <= DateTime.Now.Date.AddDays(1))
.Single(r => new { Count = Function.Count(r.STORAGE_ID) }))
.Count();
todayManageInCount = (todayManageInCount + todayStorageCacheCount);
//在途出库
var todayManageOutCountSchema = _database.From<V_MANAGE_MAIN>().Lock(Lock.Nolock);
if (area.HasValue)
{
todayManageOutCountSchema.Where(r => r.END_AREA_ID == area);
}
var todayManageOutCount = (await todayManageInCountSchema
.Where(r => r.START_AREA_ID == 1 || r.START_AREA_ID == 6)
.Single(r => new { Count = Function.Count(r.MANAGE_ID) }))
.Count();
//剩余货位
var emptyCellCount = cellSummaryMax - cellSummaryFull;
//在库膜卷
var productionCount = 0;
foreach (var r in stockType)
{
productionCount += r.value;
}
////历史任务-图表
//manage_his_xAxis_data
var manage_his_xAxis_data = new string[] {System.DateTime.Now.Date.AddDays(-6).ToString("dd")
,System.DateTime.Now.Date.AddDays(-5).ToString("dd")
,System.DateTime.Now.Date.AddDays(-4).ToString("dd")
,System.DateTime.Now.Date.AddDays(-3).ToString("dd")
,System.DateTime.Now.Date.AddDays(-2).ToString("dd")
,System.DateTime.Now.Date.AddDays(-1).ToString("dd")
,System.DateTime.Now.Date.ToString("dd")};
//manage_his_in_data
var manageHisInDataSchema = _database.From<V_RECORD_LIST>().Lock(Lock.Nolock);
if (area.HasValue)
{
manageHisInDataSchema.Where(r => r.START_AREA_ID == area);
}
var manageHisInData = await manageHisInDataSchema
.Where(r => r.BEGIN_TIME >= System.DateTime.Now.Date.AddDays(-6) && r.BEGIN_TIME <= DateTime.Now.Date.AddDays(1))
.Where(r => r.RECORD_TYPE == "Infeed")
.GroupBy(r => r.BEGIN_DATE)
.OrderBy(r => r.BEGIN_DATE, Infrastructure.Database.Order.Ascending)
.Select(r => new
{
name = r.BEGIN_DATE,
value = Function.Sum(r.QTY)
});
//manage_his_out_data
var manageHisOutDataSchema = _database.From<V_RECORD_LIST>().Lock(Lock.Nolock);
if (area.HasValue)
{
manageHisOutDataSchema.Where(r => r.END_AREA_ID == area);
}
var manageHisOutData = await manageHisInDataSchema
.Where(r => r.BEGIN_TIME >= System.DateTime.Now.Date.AddDays(-6) && r.BEGIN_TIME <= DateTime.Now.Date.AddDays(1))
.Where(r => r.RECORD_TYPE == "ApplyOut" || r.RECORD_TYPE == "PalletOut")
.GroupBy(r => r.BEGIN_DATE)
.OrderBy(r => r.BEGIN_DATE, Infrastructure.Database.Order.Ascending)
.Select(r => new
{
name = r.BEGIN_DATE,
value = Function.Sum(r.QTY)
});
decimal[] manage_his_in_data = new decimal[manage_his_xAxis_data.Length];
decimal[] manage_his_out_data = new decimal[manage_his_xAxis_data.Length];
for (int i=0;i< manage_his_xAxis_data.Length;i++)
{
var tempIn = manageHisInData.Where(m => m.name.Substring(8) == manage_his_xAxis_data[i]);
if (tempIn.Count() > 0)
{
try
{
manage_his_in_data[i] = tempIn.First().value / 2;
}
catch
{
manage_his_in_data[i] = 0;
}
}
var tempOut = manageHisOutData.Where(m => m.name.Substring(8) == manage_his_xAxis_data[i]);
if (tempOut.Count() > 0)
{
try
{
manage_his_out_data[i] = tempOut.First().value / 2;
}
catch
{
manage_his_out_data[i] = 0;
}
}
}
//库存统计
var stockListSchema = _database.From<V_STORAGE_LIST>().Lock(Lock.Nolock);
if (area.HasValue)
{
if (area == 2 || area == 7)
{
stockListSchema.Where(r => r.AREA_ID == tempArae);
}
}
var stockList = await stockListSchema
.Where(r => (r.CLASS_ID == 2 || r.CLASS_ID == 3) && (r.AREA_ID == 1 || r.AREA_ID == 6))
.GroupBy(r => r.GOODS_NAME)
.GroupBy(r => r.GOODS_CODE)
.OrderBy(r => r.GOODS_NAME, Infrastructure.Database.Order.Ascending)
.Select(r => new {
name = r.GOODS_NAME,
code = r.GOODS_CODE,
value = Function.Count(r.GOODS_NAME)
});
//当前任务
var magageListSchema = _database.From<V_MANAGE_MAIN>().Lock(Lock.Nolock);
if (area.HasValue)
{
magageListSchema.Where(r => (r.START_AREA_ID == area || r.END_AREA_ID == area));
}
var magageList = await magageListSchema
//.Where(r => r.CLASS_ID == 2 || r.CLASS_ID == 3)
.OrderBy(r => r.BEGIN_TIME, Infrastructure.Database.Order.Ascending)
.Select(r => new {
STOCK_BARCODE = r.STOCK_BARCODE,
END_CELL_NAME = r.END_CELL_CODE,
GOODS_NAME = r.GOODS_NAME,
REQUEST_NO = (string.IsNullOrEmpty(r.REQUEST_NO)? "": r.REQUEST_NO)
});
//报警统计
var magageAlarmSchema = _database.From<V_MANAGE_MAIN>().Lock(Lock.Nolock);
if (area.HasValue)
{
magageListSchema.Where(r => (r.START_AREA_ID == area || r.END_AREA_ID == area));
}
var magageAlarm = (await magageAlarmSchema
.Where(r => (r.MANAGE_STATUS == "Blocked" || r.MANAGE_STATUS == "WaiteWmsResult"
|| r.MANAGE_STATUS == "UploadError" || r.MANAGE_STATUS == "WmsResultFail"
|| r.MANAGE_STATUS == "ScanError"
|| r.MANAGE_STATUS == "AgvFail"))
.OrderBy(r => r.BEGIN_TIME, Infrastructure.Database.Order.Ascending)
.Select())
.Select(r => new
{
alarmInfo = $"{r.STOCK_BARCODE}-{r.START_CELL_NAME}-{ r.MANAGE_REMARK}"
});
//await _onlineSocket.Statistics(new
//{
// stock_age = stockAge,
// stock_type = stockType,
// stock_cellRate_max = stockCellRateMax,
// stock_cellRate_value = lsStockCellRateValue,
// stock_cellRate_summary = stockCellRateSummary,
// summary_data = new int[] { todayRecordInCount, todayRecordOutCount, todayManageInCount, todayManageOutCount, emptyCellCount, productionCount },
// manage_his_xAxis_data,
// manage_his_in_data,
// manage_his_out_data,
// storage_list = stockList,
// manage_list = magageList,
// alarm = new
// {
// storage_type = "报警",
// count = magageAlarm.Count()
// },
// alarm_list = magageAlarm
//});
return new
{
stock_age = stockAge,
stock_type = stockType,
stock_cellRate_max = stockCellRateMax,
stock_cellRate_value = lsStockCellRateValue,
stock_cellRate_summary = stockCellRateSummary,
summary_data = new int[] { todayRecordInCount, todayRecordOutCount, todayManageInCount, todayManageOutCount, emptyCellCount, productionCount },
manage_his_xAxis_data,
manage_his_in_data,
manage_his_out_data,
storage_list = stockList,
manage_list = magageList,
alarm = new
{
storage_type = "报警",
count = magageAlarm.Count()
},
alarm_list = magageAlarm
};
}
/*
* 实现 Kean.Application.Query.Interfaces.IStatisticsService.GetTVLedInfo 方法
*/
public async Task<object> GetTVLedInfo(string ip)
{
//当前任务
var ledMainSchema = _database.From<T_LED_MAIN>().Lock(Lock.Nolock)
.Where(r=>r.IS_SEND == "0" && r.LED_STATUS == "1");
if (!string.IsNullOrEmpty(ip))
{
ledMainSchema.Where(r => r.LED_IP == ip);
}
var ledMains = await ledMainSchema.Select();
List<T_LED_LIST> ledListInfo = new List<T_LED_LIST>();
foreach (var m in ledMains)
{
var ledList = await _database.From<T_LED_LIST>().Lock(Lock.Nolock)
.Where(r => r.LED_ID == m.LED_ID && r.LINE_NO == "1")
.Select();
foreach (var n in ledList)
{
ledListInfo.Add((T_LED_LIST)n);
}
}
return new
{
manage_list = ledListInfo
};
}
/*
* 实现 Kean.Application.Query.Interfaces.IStatisticsService.StockStatistics 方法
*/
public async Task<object> StockStatistics(bool bQC)
{
List<string> xDates = new List<string>();
xDates.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//库存
var stockSchema = _database.From<V_STORAGE_LIST>().Lock(Lock.Nolock)
.Where(r => r.AREA_ID != 300000)
.Where(r => r.GOODS_ID != 5 && r.GOODS_ID != 9)
.GroupBy(r => r.GOODS_NAME)
.OrderBy(r => r.GOODS_NAME, Infrastructure.Database.Order.Ascending);
if (bQC)
{
stockSchema = stockSchema.GroupBy(r => r.GOODS_STATUS);
stockSchema = stockSchema.OrderBy(r => r.GOODS_STATUS, Infrastructure.Database.Order.Ascending);
}
object stockData = null;
if (bQC)
{
stockData = (await stockSchema.Select(r => new
{
r.GOODS_NAME,
r.GOODS_STATUS,
value = Function.Sum(r.QTY)
})).Select(r => new
{
name = ((string)r.GOODS_NAME).Contains("托盘") ? $"{r.GOODS_NAME}数量" : $"{r.GOODS_STATUS}{r.GOODS_NAME}EA",
value = r.value
});
}
else
{
stockData = (await stockSchema.Select(r => new
{
r.GOODS_NAME,
value = Function.Sum(r.QTY)
})).Select(r => new
{
name = ((string)r.GOODS_NAME).Contains("托盘") ? $"{r.GOODS_NAME}数量" : $"{r.GOODS_NAME}EA",
value = r.value
});
}
List<StockStatisticsData> dataList = new List<StockStatisticsData>();
foreach (var n in (IEnumerable<dynamic>)stockData)
{
StockStatisticsData data = new StockStatisticsData();
data.Name = n.name;
data.Data = new string[1];
data.Data[0] = Convert.ToString(n.value);
dataList.Add(data);
}
return new
{
xDates = xDates.ToArray(),
dataList
};
}
/*
* 实现 Kean.Application.Query.Interfaces.IStatisticsService.StockPalletStatistics 方法
*/
public async Task<object> StockPalletStatistics(bool bQC)
{
List<string> xDates = new List<string>();
xDates.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//库存
var stockSchema = _database.From<V_STORAGE_LIST>().Lock(Lock.Nolock)
.Where(r => r.AREA_ID != 300000)
.Where(r => r.GOODS_ID != 5 && r.GOODS_ID != 9)
.GroupBy(r => r.STOCK_BARCODE)
.GroupBy(r => r.GOODS_NAME)
.OrderBy(r => r.GOODS_NAME, Infrastructure.Database.Order.Ascending);
if (bQC)
{
stockSchema = stockSchema.GroupBy(r => r.GOODS_STATUS);
stockSchema = stockSchema.OrderBy(r => r.GOODS_STATUS, Infrastructure.Database.Order.Ascending);
}
object stockData = null;
if (bQC)
{
var preStockData = (await stockSchema.Select(r => new
{
r.GOODS_STATUS,
r.GOODS_NAME
}));
List<PreData> preDataList = new List<PreData>();
foreach (var n in preStockData)
{
if (preDataList.Where(r => r.name == $"{n.GOODS_STATUS}{n.GOODS_NAME}托盘数").Count() == 0)
{
PreData preData = new PreData();
preData.name = $"{n.GOODS_STATUS}{n.GOODS_NAME}托盘数";
preData.value = preStockData.Where(r => r.GOODS_NAME == n.GOODS_NAME && r.GOODS_STATUS == n.GOODS_STATUS).Count();
preDataList.Add(preData);
}
}
stockData = preDataList.ToArray();
}
else
{
var preStockData = (await stockSchema.Select(r => new
{
r.GOODS_NAME
}));
List<PreData> preDataList = new List<PreData>();
foreach (var n in preStockData)
{
if (preDataList.Where(r => r.name == $"{n.GOODS_NAME}托盘数").Count() == 0)
{
PreData preData = new PreData();
preData.name = $"{n.GOODS_NAME}托盘数";
preData.value = preStockData.Where(r => r.GOODS_NAME == n.GOODS_NAME).Count();
preDataList.Add(preData);
}
}
stockData = preDataList.ToArray();
}
List<StockStatisticsData> dataList = new List<StockStatisticsData>();
foreach (var n in (IEnumerable<dynamic>)stockData)
{
StockStatisticsData data = new StockStatisticsData();
data.Name = n.name;
data.Data = new string[1];
data.Data[0] = Convert.ToString(n.value);
dataList.Add(data);
}
return new
{
xDates = xDates.ToArray(),
dataList
};
}
private class StockStatisticsData
{
public string Name
{
get; set;
}
public string[] Data
{
get; set;
}
}
private class PreData
{
public string name
{
get; set;
}
public int value
{
get; set;
}
}
}
}