using Aliyun.OSS;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using Infrastructure.Model;
using Microsoft.Data.SqlClient;
using RIZO.Model.Mes.Dto.WorkOrderInfo;
using RIZO.Model.Mes.MasterData;
using RIZO.Model.Mes.WorkOrderInfo;
using RIZO.Repository;
using RIZO.Service.Mes.IMesService.MasterData;
using RIZO.Service.Mes.IMesService.WorkOrderInfo;
using RIZO.Service.Mes.MasterData;
using MDM.Services.Process;
using MDM.Services.Material;
using SqlSugar;
using SqlSugar.Extensions;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace RIZO.Service.Mes.WorkOrderInfo
{
///
/// 工单主表Service业务层处理
///
[AppService(ServiceType = typeof(IWorkOrderService), ServiceLifetime = LifeTime.Transient)]
public class WorkOrderService : BaseService, IWorkOrderService
{
private WorkOrderItemService workOrderItemService = new WorkOrderItemService();
private MaterialListService materialListService = new MaterialListService();
private ProcessRoutingService processRoutingService = new ProcessRoutingService();
///
/// 查询工单主表列表
///
///
///
public PagedInfo GetList(WorkOrderQueryDto parm)
{
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage(parm);
return response;
}
public PagedInfo GetListExport(WorkOrderQueryDto parm)
{
var predicate = QueryExpExport(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage(parm);
return response;
}
///
/// 获取详情
///
///
///
public WorkOrder GetInfo(long Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
///
/// 添加工单主表
///
///
///
public WorkOrder AddWorkOrder(WorkOrder model)
{
return Insertable(model).ExecuteReturnEntity();
}
///
/// 修改工单主表
///
///
///
public int UpdateWorkOrder(WorkOrder model)
{
return Update(model, true);
}
///
/// 查询表达式
///
///
///
private static Expressionable QueryExp(WorkOrderQueryDto parm)
{
var predicate = Expressionable.Create();
if (!string.IsNullOrWhiteSpace(parm.LineCode))
{
predicate.And(it => it.LineCode.Contains(parm.LineCode));
}
if (!string.IsNullOrWhiteSpace(parm.LineName))
{
predicate.And(it => it.LineName.Contains(parm.LineName));
}
if (!string.IsNullOrWhiteSpace(parm.WorkOrderCode))
{
predicate.And(it => it.WorkOrderCode.Contains(parm.WorkOrderCode));
}
if (!string.IsNullOrWhiteSpace(parm.OrderDate))
{
predicate.And(it => it.OrderDate.Contains(parm.OrderDate));
}
return predicate;
}
private static Expressionable QueryExpExport(WorkOrderQueryDto parm)
{
var predicate = Expressionable.Create();
if (parm.StartTime != null && parm.StartTime.ToString().Length > 0)
{
predicate.And(it => it.CreateTime >= parm.StartTime);
}
if (parm.EndTime != null && parm.EndTime.ToString().Length > 0)
{
predicate.And(it => it.CreateTime < parm.EndTime);
}
return predicate;
}
public ApiResult CreateWorkOrderBySacnCode(FlowCard flowCard)
{
try
{
WorkOrder orderInfoNew = new WorkOrder();
//if (string.IsNullOrWhiteSpace(json))
//{
// return ApiResult.Error(400,"扫码数据为空,请重新扫码");
//}
//扫码信息转成FlowCard对象
//假设扫码结果是json形式
//{
// "FlowCardNo": "0001",
// "LineCode" : "001",
// "LineName" : "001",
// "MaterialCode": "GEAR-001",
// "MaterialName": "齿轮(A型)",
// "BatchNumber": "Batch-20251122-01",
// "TotalQty": 100
//}
//字符串转对象
//FlowCard flowCard = new FlowCard();
//try
//{
// flowCard = JsonConvert.DeserializeObject(json);
//}
//catch (Exception ex)
//{
// return ApiResult.Error(400, "扫码数据格式错误,无法解析");
//}
//工艺路线防错
//var routing = processRoutingService.Queryable().Where(it => it.FkProductMaterialCode == flowCard.MaterialCode.Trim()).First();
//if (routing != null)
//{
// //目前情况是工艺路线与物料未绑定
// return ApiResult.Error(400, "零件编码:" + flowCard.MaterialCode + "与工艺路线未绑定,请先绑定");
//}
//else
//{
// string strRouting = routing.RoutingCode.Trim();
// if (strRouting != flowCard.ProcessCode.Trim())
// {
// return ApiResult.Error(400, "零件编码:" + flowCard.MaterialCode + "的工艺路线是"+routing.RoutingName+"与所选工艺路线不一致,请重新选择工艺路线");
// }
//}
//看扫流卡码能否得到一个唯一的流卡编码,若得不到则自己生产202511280001
string strDay = DateTime.Now.ToString("yyyyMMdd");
int Sequcence = 1;
WorkOrder item = Queryable()
.Where(it => it.WorkOrderCode.Contains(strDay)).OrderByDescending(it => it.Sequcence).First();
if (item != null)
{
Sequcence = item.Sequcence;
Sequcence += 1;
}
string formattedSequence = Sequcence.ToString("D4");
string strWorkOrderCode = "WO"+strDay+ formattedSequence;
//检验流卡二维码生成的工单是否重复生成
var WorkOrder = Queryable()
.Where(it => it.FlowCardNo == flowCard.FlowCardNo).First(); ;
if (WorkOrder == null)
{
orderInfoNew.WorkOrderCode = strWorkOrderCode;
orderInfoNew.FlowCardNo = flowCard.FlowCardNo;
orderInfoNew.MaterialCode = flowCard.MaterialCode;
orderInfoNew.MaterialName = flowCard.MaterialName;
orderInfoNew.BatchNumber = flowCard.BatchNumber;
orderInfoNew.TotalQty = flowCard.TotalQty;
orderInfoNew.LineCode = flowCard.LineCode;
orderInfoNew.LineName = flowCard.LineName;
orderInfoNew.OrderDate = strDay;
//orderInfoNew.ProcessCode = flowCard.ProcessCode;
//orderInfoNew.ProcessName = flowCard.ProcessName;
orderInfoNew.OrderStatus = 1;
orderInfoNew.CreateBy = flowCard.UserId;
orderInfoNew.CreateName = flowCard.UserName;
orderInfoNew.UpdateBy = flowCard.UserId;
orderInfoNew.UpdateName = flowCard.UserName;
orderInfoNew.CreateTime = DateTime.Now;
orderInfoNew.UpdateTime = DateTime.Now;
int iFlag = Insert(orderInfoNew);
if (iFlag > 0)
{
return ApiResult.Success(orderInfoNew);
}
else
{
return ApiResult.Error("工单创建失败" );
}
}
else
{
return ApiResult.Success(WorkOrder);
}
}
catch (Exception ex)
{
return ApiResult.Error("工单创建失败"+ex.ToString());
}
}
///
/// OrderStatus 1执行中,2已完成
///
///
///
public int ChangeWorkOrderState(WorkOrderState parm)
{
int iResult = 0;
try
{
iResult = Update(where: it => it.Id == parm.Id,
columns: it => new WorkOrder
{
OrderStatus = parm.OrderStatus, // 目标状态
UpdateBy = parm.UserId, // 更新人ID
UpdateName = parm.UserName, // 更新人名称
UpdateTime = DateTime.Now // 更新时间
}
);
}
catch (Exception ex)
{
iResult = 0;
}
return iResult;
}
///
/// 按产线统计7天内每日合格率(折线图数据)
///
/// 合格率折线图格式(xAxisData + series)
public ChartResponse QueryQualityLineChart()
{
DateTime now = DateTime.Now;
List last7Days = Enumerable.Range(0, 7)
.Select(i => now.AddDays(-i).Date)
.OrderBy(date => date)
.ToList();
List xAxisData = last7Days.Select(date => date.ToString("yyyy-MM-dd")).ToList();
string sqlLine7 = @"SELECT DISTINCT
w.line_code LineCode,
w.line_name LineName
FROM
work_order w
WHERE
w.create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND w.create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY)";
var queryDataLine7 = SqlQueryToList(sqlLine7);
string sql = string.Format(@"SELECT
w.line_code LineCode,
w.line_name LineName,
w.create_time,
sum(w.ok_qty) OkQty,
sum(w.ng_qty) NgQty
FROM
work_order w
WHERE
w.create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND w.create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
GROUP BY
w.line_code,
w.line_name,
DATE_FORMAT(w.create_time, '%Y-%m-%d')");
var queryData = SqlQueryToList(sql);
List series = new List();
foreach (var lineItem in queryDataLine7)
{
string lineCode = lineItem.LineCode;
string lineName = lineItem.LineName;
List rateData = new List();
// 遍历7天日期,逐一匹配数据
foreach (string date in xAxisData)
{
var listResult = queryData.Where(it => it.LineCode == lineCode).ToList();
double rate = 0.0;
foreach(var item in listResult)
{
if (item.CreateTime.ObjToDate().ToString("yyyy-MM-dd").Contains(date))
{
int okQty = 0;
if (item.OkQty != null)
{
okQty = item.OkQty;
}
int ngQty = 0;
if (item.NgQty != null)
{
ngQty = item.NgQty;
}
int total = okQty + ngQty;
rate = total == 0 ? 0.0 : Math.Round(((double)okQty / total) * 100, 2);
}
}
rateData.Add(rate);
}
series.Add(new ChartSeries
{
Name = $"{lineName}({lineCode})",
Data = rateData
});
}
return new ChartResponse
{
xAxisData = xAxisData,
series = series
};
}
public ChartResponse QueryQualityBarChart()
{
DateTime now = DateTime.Now;
List last7Days = Enumerable.Range(0, 7)
.Select(i => now.AddDays(-i).Date)
.OrderBy(date => date)
.ToList();
List xAxisData = last7Days.Select(date => date.ToString("yyyy-MM-dd")).ToList();
string sql = string.Format(@"SELECT
w.create_time,
sum(w.ok_qty) OkQty,
sum(w.ng_qty) NgQty
FROM
work_order w
WHERE
w.create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
AND w.create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
GROUP BY
DATE_FORMAT(w.create_time, '%Y-%m-%d')");
var queryData = SqlQueryToList(sql);
List series = new List();
// 为7天的每个日期补全数据,计算合格率
List dataOk = new List();
List dataNG = new List();
foreach (string date in xAxisData)
{
double okNum = 0.0;
double ngNum = 0.0;
foreach (var lineKv in queryData)
{
if (lineKv.CreateTime.ObjToDate().ToString("yyyy-MM-dd").Contains(date))
{
if (lineKv.OkQty != null)
{
okNum = lineKv.OkQty;
}
if (lineKv.NgQty != null)
{
ngNum = lineKv.NgQty;
}
}
}
dataOk.Add(okNum);
dataNG.Add(ngNum);
}
series.Add(new ChartSeries
{
Name = $"合格数",
Data = dataOk
});
series.Add(new ChartSeries
{
Name = $"不合格数",
Data = dataNG
});
return new ChartResponse
{
xAxisData = xAxisData,
series = series
};
}
public List QueryWorkOrderMonth()
{
List workOrders = Queryable()
.Where(it => it.CreateTime <= DateTime.Now && it.CreateTime >= DateTime.Now.AddDays(-30)).ToList();
return workOrders;
}
public ApiResult QueryWorkOrderToDay()
{
try
{
var today = DateTime.Today;
DateTime startTime = new DateTime(today.Year, today.Month, today.Day, 0, 0, 0);
DateTime endTime = new DateTime(today.Year, today.Month, today.Day, 23, 59, 59);
List workOrders = Queryable()
.Where(it => it.CreateTime <= endTime && it.CreateTime >= startTime)
.ToList();
if (workOrders.Any())
{
return ApiResult.Success(workOrders);
}
else
{
return new ApiResult(201, "无工单数据");
}
}
catch (Exception ex)
{
return ApiResult.Error(ex.Message);
}
}
}
}