Files
2025-11-20 13:11:05 +08:00

566 lines
26 KiB
C#

using AUTS.Domain.Entities;
using AUTS.Domain.ViewModels;
using AUTS.Services.DBUtility.Custom;
using AUTS.Services.Enums;
using AUTS.Services.Extensions;
using AUTS.Services.Tool;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace AUTS.Services.Manager
{
public partial class AutsChart
{
private static string TestLogTbName = "TBL_{0}_{1}_TestLog";//测试记录表名
/// <summary>
/// 图表-未完成订单生产进度统计
/// </summary>
/// <param name="reqModel">查询条件实体</param>
/// <param name="cacheUserProject">机型缓存</param>
/// <param name="cacheUserOrder">订单缓存</param>
/// <param name="cacheUserCustomer">客户缓存</param>
/// <param name="cacheUserStationList">工作站缓存</param>
/// <returns></returns>
public static ReturnResult<object> GetOrderStats(RequestOrderStats reqModel, List<TBL_Project> cacheUserProject, List<TBL_Orders> cacheUserOrder, List<TBL_Customer> cacheUserCustomer, List<TBL_StationList> cacheUserStationList)
{
ReturnResult<object> result = new ReturnResult<object>();
try
{
var project = cacheUserProject.SingleOrDefault(x => x.ID == reqModel.ProjectID);
if (!reqModel.IsOrder)//如果不是按照订单
{
if (project == null)
{
result.Message = "无效或不存在的机型";
return result;
}
if (reqModel.StartDate == null)
{
result.Message = "请输入起始时间";
return result;
}
}
var orderNotList = cacheUserOrder.Where(x => x.OrderStatus == (int)OrderStatus.InProduction);//取出该机型未完成订单
var minTime = reqModel.StartDate ?? DateTime.Now;//起始时间
if (project != null)
{
orderNotList = orderNotList.Where(x => x.ProductID == project.ID);
}
if (!reqModel.IsOrder)
{
orderNotList = orderNotList.Where(x => x.CreateTime <= minTime && x.DeliveryTime >= minTime);//取出未完成订单
//minTime = orderNotList.Min(m => m.CreateTime);//订单最早日期
}
else
{
if (reqModel.StartDate == null && orderNotList.Count() > 0)
{
minTime = orderNotList.Min(m => m.CreateTime);//订单最早日期
}
}
if (orderNotList.Count() == 0)
{
result.Status = 200;
return result;
}
var maxTime = reqModel.EndDate ?? DateTime.Now;//最晚日期
minTime = Convert.ToDateTime(minTime.ToString("yyyy/MM/dd"));//订单最早日期
maxTime = Convert.ToDateTime(maxTime.ToString("yyyy/MM/dd"));//订单最晚日期
TimeSpan ts = maxTime - minTime;
int differenceInDays = ts.Days + 1;
DataTable tblDatas = new DataTable("Datas");
tblDatas.Columns.Add("ID", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("单号", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("机型", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("客户", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("数量", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("已完成", Type.GetType("System.String"));//新列
for (var i = 0; i < differenceInDays; i++)
{
tblDatas.Columns.Add(minTime.AddDays(i).ToString("yy/MM/dd"), Type.GetType("System.String"));//新列
}
var dbTableName = "";
var sumTotal = 0;
var dalHelperCustom = new DALHelperCustom<VM_PlannedSpeed>();
var thisDataList = new List<VM_PlannedSpeed>();
string connectionString = Users.GerOnUserCofin();//当前库连接串
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
connection.Open();
MySqlDataAdapter command = new MySqlDataAdapter();
var strSql = "";
foreach (var item in orderNotList)
{
strSql = "";
dataSet.Clear();
sumTotal = 0;
DataRow newRow = tblDatas.NewRow();//新行
newRow["ID"] = item.ID;
newRow["单号"] = item.OrderNo;
newRow["机型"] = cacheUserProject.Single(x => x.ID == item.ProductID).ProjectName;
newRow["客户"] = cacheUserCustomer.Single(x => x.ID == item.CompanyID).CustomerAbbr;
newRow["数量"] = item.OrderCount;
var endTestStation = cacheUserStationList.Where(x => x.ProjectID == item.ProductID && (x.StationType == StationType.Test.GetEnumDesc() || x.StationType == StationType.Test2.GetEnumDesc())).OrderByDescending(o => o.ArtworkOrder).FirstOrDefault();//最大测试站
dbTableName = string.Format(TestLogTbName, item.ProductID, endTestStation.ID);//最大测试站表名
//strSql = "select StartTime,DATE_FORMAT(StartTime,'%Y%m%d') DAYS,COUNT(*) Total from `" + dbTableName + "` Where OrderID=" + item.OrderID + " AND TestResult=1 GROUP BY DAYS;";//查询语句
strSql = "select {0} StartTime,DATE_FORMAT({0},'%Y%m%d') DAYS,COUNT(*) Total from `" + dbTableName + "` Where TestResult=1";//查询语句
if (reqModel.StartDate != null)
{
strSql += " AND (DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') >='" + minTime.ToString("yyyy-MM-dd 00:00:00") + "')";
//strSql += (string.Format(" AND (DATE_FORMAT(StartTime, '%Y-%m-%d %H:%i:%s') >='{0}')", minTime.ToString("yyyy-MM-dd 00:00:00")));
}
if (reqModel.EndDate != null && reqModel.StartDate != null)
{
strSql += " AND (DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') <='" + maxTime.ToString("yyyy-MM-dd 23:59:59") + "')";
//strSql += (string.Format(" AND (DATE_FORMAT(StartTime, '%Y-%m-%d %H:%i:%s') <='{0}')", maxTime.ToString("yyyy-MM-dd 23:59:59")));
}
if (reqModel.IsOrder)
{
strSql += " AND OrderID=" + item.ID;
}
strSql += " GROUP BY DAYS;";
if (endTestStation.StationType == StationType.Test2.GetEnumDesc())
{
strSql = string.Format(strSql, "DateTime_2nd");
}
else
{
strSql = string.Format(strSql, "StartTime");
}
command = new MySqlDataAdapter(strSql, connection);
command.Fill(dataSet, "ds");
if (dataSet.Tables[0].Rows.Count > 0)
{
thisDataList = dalHelperCustom.DataRowToModels(dataSet.Tables[0]);
foreach (var itemData in thisDataList)
{
newRow[itemData.StartTime.ToString("yy/MM/dd")] = itemData.Total;
sumTotal += itemData.Total;
}
}
newRow["已完成"] = sumTotal;
tblDatas.Rows.Add(newRow);
}
}
var rows = ModelHelper.TableToRow(tblDatas);
result.Data = rows;
result.Status = 200;
}
catch (MySqlException ex)
{
result.Message = ex.Message;
Logs.WriteErrorLog(ex);
}
catch (Exception ex)
{
result.Message = "网络系统繁忙,请稍候再试!";
LogHelp.WriteExceptionLog(ex);
}
return result;
}
/// <summary>
/// 图表-该订单各站生产进度统计
/// </summary>
/// <param name="reqModel">查询条件实体</param>
/// <param name="cacheUserProject">机型缓存</param>
/// <param name="cacheUserOrder">订单缓存</param>
/// <param name="cacheUserCustomer">客户缓存</param>
/// <param name="cacheUserStationList">工作站缓存</param>
/// <param name="connectionString">数据库连接串</param>
/// <returns></returns>
public static ReturnResult<object> GetOrdersPlannedSpeedDetails(RequestOrdersPlanned reqModel, List<TBL_Project> cacheUserProject, List<TBL_Orders> cacheUserOrder, List<TBL_Customer> cacheUserCustomer, List<TBL_StationList> cacheUserStationList, string connectionString)
{
ReturnResult<object> result = new ReturnResult<object>();
try
{
var id = reqModel.id;
var order = cacheUserOrder.Single(x => x.ID == id);//取出订单
var stationList = cacheUserStationList.Where(x => x.StationType != StationType.QA.GetEnumDesc() && x.ProjectID == order.ProductID);//不为该机型QA的测试站
var minTime = reqModel.StartDate ?? order.CreateTime;//订单最早日期
var maxTime = reqModel.EndDate ?? DateTime.Now;//订单最晚日期
minTime = Convert.ToDateTime(minTime.ToString("yyyy/MM/dd"));//订单最早日期
maxTime = Convert.ToDateTime(maxTime.ToString("yyyy/MM/dd"));//订单最晚日期
TimeSpan ts = maxTime - minTime;
int differenceInDays = ts.Days + 1;
DataTable tblDatas = new DataTable("Datas");
tblDatas.Columns.Add("测试站", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("数量", Type.GetType("System.String"));//新列
for (var i = 0; i < differenceInDays; i++)
{
tblDatas.Columns.Add(minTime.AddDays(i).ToString("yy/MM/dd"), Type.GetType("System.String"));//新列
}
var dbTableName = "";
var strSql = "";
var sumTotal = 0;
var dalHelperCustom = new DALHelperCustom<VM_PlannedSpeed>();
//string connectionString = Users.GerOnUserCofin();//当前库连接串
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
MySqlDataAdapter command = new MySqlDataAdapter();
connection.Open();
//测试站列表
foreach (var itemStation in stationList)
{
strSql = "";
sumTotal = 0;
dataSet.Clear();
DataRow newRow = tblDatas.NewRow();//新行
newRow["测试站"] = itemStation.StationName;
newRow["数量"] = "当日";
DataRow newRow2 = tblDatas.NewRow();//新行
newRow2["测试站"] = itemStation.StationName;
newRow2["数量"] = "累计";
dbTableName = string.Format(TestLogTbName, itemStation.ProjectID, itemStation.ID);//测试站表名
//strSql = "select StartTime,DATE_FORMAT(StartTime,'%Y%m%d') DAYS,COUNT(*) Total from `" + dbTableName + "` Where OrderID=" + id + " AND TestResult=1 GROUP BY DAYS;";//查询语句
strSql = "select {0},DATE_FORMAT({0},'%Y%m%d') DAYS,COUNT(*) Total from `" + dbTableName + "` Where TestResult=1";//查询语句
if (reqModel.IsOrder)
{
strSql += " AND OrderID=" + id;
}
if (reqModel.StartDate != null)
{
strSql += " AND (DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') >='" + minTime.ToString("yyyy-MM-dd 00:00:00") + "')";
}
if (reqModel.EndDate != null && reqModel.StartDate != null)
{
strSql += " AND (DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') <='" + maxTime.ToString("yyyy-MM-dd 23:59:59") + "')";
}
strSql += " GROUP BY DAYS;";
if (itemStation.StationType == StationType.Test2.GetEnumDesc())
{
strSql = string.Format(strSql, "DateTime_2nd");
}
else
{
strSql = string.Format(strSql, "StartTime");
}
command = new MySqlDataAdapter(strSql, connection);
command.Fill(dataSet, "ds");
if (dataSet.Tables[0].Rows.Count > 0)
{
var thisDataList = dalHelperCustom.DataRowToModels(dataSet.Tables[0]).OrderBy(x => x.StartTime);
foreach (var itemData in thisDataList)
{
newRow[itemData.StartTime.ToString("yy/MM/dd")] = itemData.Total;
sumTotal += itemData.Total;
newRow2[itemData.StartTime.ToString("yy/MM/dd")] = sumTotal;
}
}
tblDatas.Rows.Add(newRow);
tblDatas.Rows.Add(newRow2);
}
}
var rows = ModelHelper.TableToRow(tblDatas);
result.Data = rows;
result.Status = 200;
}
catch (MySqlException ex)
{
result.Message = ex.Message;
Logs.WriteErrorLog(ex);
}
catch (Exception ex)
{
result.Message = "网络系统繁忙,请稍候再试!";
LogHelp.WriteExceptionLog(ex);
}
return result;
}
/// <summary>
/// 生产实时统计
/// </summary>
/// <param name="reqModel"></param>
/// <param name="cacheUserProject"></param>
/// <param name="cacheUserOrder"></param>
/// <param name="cacheUserCustomer"></param>
/// <param name="cacheUserStationList"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
public static ReturnResult<object> GetOrdersStatsDetails(RequestOrdersRealTime reqModel, List<TBL_Project> cacheUserProject, List<TBL_Orders> cacheUserOrder, List<TBL_Customer> cacheUserCustomer, List<TBL_StationList> cacheUserStationList, string connectionString)
{
ReturnResult<object> result = new ReturnResult<object>();
try
{
//var vModelList = new VM_OrderPlannedSpeed();
var id = reqModel.Order;
var order = cacheUserOrder.SingleOrDefault(x => x.ID == id);//取出订单
if (order == null)
{
result.Message = "无订单或无效订单";
return result;
}
var project = cacheUserProject.Single(x => x.ID == order.ProductID);//取出订单
var customer = cacheUserCustomer.Single(x => x.ID == order.CompanyID);//取出订单
var stationList = cacheUserStationList.Where(x => x.StationType != StationType.QA.GetEnumDesc() && x.ProjectID == order.ProductID).OrderBy(o => o.ArtworkOrder);//不为该机型QA的测试站
//vModelList.ProjectName = project.ProjectName;
//vModelList.OrderNo = order.OrderNo;
//vModelList.CustomerAbbr = customer.CustomerAbbr;
//vModelList.OrderCount = order.OrderCount;
//vModelList.CreateTime = order.CreateTime.ToString("yyyy/MM/dd");
//vModelList.DeliveryTime = order.DeliveryTime.ToString("yyyy/MM/dd");
////测试站列表
//foreach (var itemStation in stationList)
//{
// vModelList.StationDes += itemStation.StationName + "-" + itemStation.StationDesc + "&nbsp;";
//}
DataTable tblDatas = new DataTable("Datas");
tblDatas.Columns.Add("DataType", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("日期", Type.GetType("System.String"));//新列
tblDatas.Columns.Add("数据类型", Type.GetType("System.String"));//新列
//foreach (var station in stationList)
//{
// tblDatas.Columns.Add(station.StationName, Type.GetType("System.String"));//新列
//}
var strSql = "";//查询语句
var dbTableName = "";//测试记录表名
var timeStr = "";//日期
var totalDic = new Dictionary<string, TbTotalDic>();//计算字典
var ppNum = 0;
var actualNum = 0;
var thisRow = 1;
var rowKey = 0;
var pPlan = new TBL_ProductionPlan();
var testLog = new OrderTestLogData();
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
MySqlDataAdapter command = new MySqlDataAdapter();
connection.Open();
strSql = "SELECT * FROM `TBL_ProductionPlan` WHERE OrderID=" + order.ID + ";";
command = new MySqlDataAdapter(strSql, connection);
command.Fill(dataSet, "ds");
var dalHelperPP = new DALHelperCustom<TBL_ProductionPlan>();
var dalHelperPSpeed = new DALHelperCustom<OrderTestLogData>();
var pSpeed = new List<OrderTestLogData>();
var ppList = dalHelperPP.DataRowToModels(dataSet.Tables[0]);//计划列表
var ppListGroup = ppList.GroupBy(g => g.ProductionTime).OrderBy(x => x.Key);//计划列表按时间分组
if (ppListGroup.Count() > 0)
{
foreach (var dateTime in ppListGroup)
{
timeStr = dateTime.Key.ToString("yyyy/MM/dd");
DataRow planRow = tblDatas.NewRow();//新行 计划行
planRow["DataType"] = "plan";
planRow["日期"] = timeStr;
planRow["数据类型"] = "计划";
tblDatas.Rows.Add(planRow);
DataRow planTotalRow = tblDatas.NewRow();//新行 累计计划行
planTotalRow["DataType"] = "plantotal";
planTotalRow["日期"] = timeStr;
planTotalRow["数据类型"] = "累计计划";
tblDatas.Rows.Add(planTotalRow);
DataRow testNumRow = tblDatas.NewRow();//新行 累计计划行
testNumRow["DataType"] = "test";
testNumRow["日期"] = timeStr;
testNumRow["数据类型"] = "当日";
tblDatas.Rows.Add(testNumRow);
DataRow testNumTotalRow = tblDatas.NewRow();//新行 累计计划行
testNumTotalRow["DataType"] = "testtotal";
testNumTotalRow["日期"] = timeStr;
testNumTotalRow["数据类型"] = "累计当日";
tblDatas.Rows.Add(testNumTotalRow);
}
var minTime = ppList.Min(m => m.ProductionTime);//订单最早日期
var maxTime = ppList.Max(m => m.ProductionTime);//订单最晚日期
var timeWhere = " AND(DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') >= '" + minTime.ToString("yyyy-MM-dd 00:00:00") + "') AND (DATE_FORMAT({0}, '%Y-%m-%d %H:%i:%s') <='" + maxTime.ToString("yyyy-MM-dd 23:59:59") + "')";
//测试站列表
foreach (var itemStation in stationList)
{
tblDatas.Columns.Add(itemStation.StationName, Type.GetType("System.String"));//新列
totalDic.Add(itemStation.StationName, new TbTotalDic());
dataSet.Clear();
dbTableName = string.Format(TestLogTbName, order.ProductID, itemStation.ID);//测试站表名
strSql = "select {0} StartTime,DATE_FORMAT({0},'%Y/%m/%d') DAYS,COUNT(*) Total from `" + dbTableName + "` Where TestResult=1";//查询语句
strSql += timeWhere;
if (itemStation.StationType == StationType.Test2.GetEnumDesc())
{
strSql = string.Format(strSql, "DateTime_2nd");
}
else
{
strSql = string.Format(strSql, "StartTime");
}
strSql += " GROUP BY DAYS;";
command = new MySqlDataAdapter(strSql, connection);
command.Fill(dataSet, "ds");
pSpeed = dalHelperPSpeed.DataRowToModels(dataSet.Tables[0]);//测试记录数据
thisRow = 1;
foreach (var dateTime in ppListGroup)
{
rowKey = (thisRow * 4);
pPlan = null;
testLog = null;
if (dateTime.ToList().Count > 0)
{
pPlan = dateTime.ToList().SingleOrDefault(x => x.StationID == itemStation.ID);
}
testLog = pSpeed.SingleOrDefault(x => x.DAYS == timeStr);
timeStr = dateTime.Key.ToString("yyyy/MM/dd");
ppNum = pPlan == null ? 0 : pPlan.ObjectiveYield;
totalDic[itemStation.StationName].PlanTotal += ppNum;
if (ppNum > 0)
{
tblDatas.Rows[(rowKey - 4)][itemStation.StationName] = ppNum;//计划
tblDatas.Rows[(rowKey - 3)][itemStation.StationName] = totalDic[itemStation.StationName].PlanTotal;//累计计划
}
actualNum = testLog == null ? 0 : testLog.Total;
totalDic[itemStation.StationName].ActualTotal += actualNum;
if (actualNum > 0)
{
tblDatas.Rows[(rowKey - 2)][itemStation.StationName] = actualNum;//当日
tblDatas.Rows[(rowKey - 1)][itemStation.StationName] = totalDic[itemStation.StationName].ActualTotal;//累计
}
thisRow += 1;
}
}
}
}
var rows = ModelHelper.TableToRow(tblDatas);
//vModelList.Rows = ModelHelper.TableToRow(tblDatas);
result.Data = rows;
result.Status = 200;
}
catch (MySqlException ex)
{
result.Message = ex.Message;
Logs.WriteErrorLog(ex);
}
catch (Exception ex)
{
result.Message = "网络系统繁忙,请稍候再试!";
LogHelp.WriteExceptionLog(ex);
}
return result;
}
/// <summary>
/// 更新生产进度
/// </summary>
public static void UpdateOrderProductionSchedule()
{
//取所有库
var dbList = Cache.CacheHelp.GetSysDBList();
if (dbList != null && dbList.Count > 0)
{
IEnumerable<TBL_Orders> orderList = null;//
//var orderList = new List<TBL_Orders>();
foreach (var item in dbList)
{
orderList = Cache.CacheHelp.GetUserDBOrderList(item.DatabaseName).Where(x => x.OrderStatus == (int)OrderStatus.ProductionPlan && x.OrderStatus == (int)OrderStatus.InProduction);
}
}
}
}
}