shgx_tz_mom/ZR.Service/mes/qc/CommonFQCService.cs
2024-11-18 20:14:00 +08:00

1615 lines
66 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Infrastructure.Attribute;
using SqlSugar;
using ZR.Model;
using ZR.Model.MES.pro;
using ZR.Model.MES.qc;
using ZR.Model.MES.qc.DTO;
using ZR.Model.MES.qu;
using ZR.Model.MES.wms;
using ZR.Service.mes.qc.IService;
using ZR.Service.Utils;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ZR.Service.mes.qc
{
[AppService(ServiceType = typeof(ICommonFQCService), ServiceLifetime = LifeTime.Transient)]
public class CommonFQCService : BaseService<FirstFQCService>, ICommonFQCService
{
public int CheckPackageWorkOrderStatus(string workOrderId)
{
try
{
// 检查对应工单是否存在
ProWorkorder_v2 proWorkorder = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
if (proWorkorder == null)
{
return -1;
}
return proWorkorder.Status;
}
catch (Exception ex)
{
return -1;
}
}
/// <summary>
/// 根据年周日生成当日全部工单列表
/// </summary>
/// <param name="year">年</param>
/// <param name="week">周</param>
/// <param name="date">日</param>
/// <param name="type">0-不读取status 1-读取status 2- 查询status为1,2时</param>
/// <param name="status">-1-全部 0-初态 1-上线 2-包装完成</param>
/// <returns></returns>
public List<ProWorkorder_v2> GenerateWorkOrderListUtil(
int year,
int week,
int date,
int type = 0,
int status = -1
)
{
try
{
var predicate = Expressionable
.Create<ProWorkorder_v2>()
.And(it => it.Year == year)
.And(it => it.Week == week)
.And(it => it.Date == date)
.And(it => it.Remark3 == "是")
.AndIF(type == 1, it => it.Status == status)
.AndIF(type == 2, it => it.Status == 1 || it.Status == 2)
.ToExpression();
return Context
.Queryable<ProWorkorder_v2>()
.Where(predicate)
.OrderBy(it => it.Sort)
.ToList();
}
catch (Exception ex)
{
return null;
}
}
public int CheckPackageWorkOrderInListStatus(string workOrderId)
{
try
{
// 检查对应工单是否存在
ProWorkorder_v2 proWorkOrder = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
if (proWorkOrder == null)
{
return -1;
}
// 提取工单年周日,组成数组
int year = proWorkOrder.Year;
int week = proWorkOrder.Week;
int date = proWorkOrder.Date;
List<ProWorkorder_v2> proWorkorders = GenerateWorkOrderListUtil(
year,
week,
date,
2
);
if (proWorkorders == null)
{
return -1;
}
// 提取目标工单号所在工单列表的位置
int index = -1;
for (int i = 0; i < proWorkorders.Count; i++)
{
if (workOrderId == proWorkorders[i].ClientWorkorder)
{
index = i;
break;
}
}
if (index == 0)
{
return 2;
}
for (int i = 0; i < index; i++)
{
if (proWorkorders[i].Status == 1)
{
return 1;
}
}
if (index == proWorkorders.Count - 1)
{
return 3;
}
return 0;
}
catch (Exception ex)
{
return -1;
}
}
public int[] CheckWorkOrderInDayListNum(string workOrderId)
{
try
{
int[] result = new int[4];
// 工单总数
int workOrderTotal = 0;
// 当前位置
int index = 0;
// 已完成
int finishNum = 0;
// 未完成
int noFinishNum = 0;
// 检查对应工单是否存在
ProWorkorder_v2 proWorkOrder = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
if (proWorkOrder == null)
{
return result;
}
// 提取工单年周日,组成数组
int year = proWorkOrder.Year;
int week = proWorkOrder.Week;
int date = proWorkOrder.Date;
List<ProWorkorder_v2> proWorkorders = GenerateWorkOrderListUtil(
year,
week,
date,
2
);
if (proWorkorders == null)
{
return result;
}
workOrderTotal = proWorkorders.Count;
// 提取目标工单号所在工单列表的位置
for (int i = 0; i < proWorkorders.Count; i++)
{
if (workOrderId == proWorkorders[i].ClientWorkorder)
{
index = i + 1;
break;
}
}
List<ProWorkorder_v2> finishWorkorders = GenerateWorkOrderListUtil(
year,
week,
date,
1,
2
);
if (finishWorkorders == null)
{
return result;
}
finishNum = finishWorkorders.Count;
noFinishNum = workOrderTotal - finishNum;
// 最终赋值
result.SetValue(index, 0);
result.SetValue(workOrderTotal, 1);
result.SetValue(finishNum, 2);
result.SetValue(noFinishNum, 3);
return result;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 工单需要打印标签总数
/// </summary>
/// <param name="workOrderId">工单号</param>
/// <param name="previousNumber">上件数</param>
/// <returns></returns>
public int GetWorkOrderNeedPackingTotal(string workOrderId)
{
try
{
ProWorkorder_v2 workOrder = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
var res = Context
.Queryable<QcFirstinspectionRecord>()
.Where(it => it.FKWorkorderId.Equals(workOrderId))
.GroupBy(it => it.FKWorkorderId)
.Select(it => new { sum = SqlFunc.AggregateSum(it.Counter ?? 0) })
.First();
if (res == null)
{
return workOrder.PreviousNumber;
}
else
{
return workOrder.PreviousNumber - res.sum;
}
}
catch (Exception ex)
{
return 0;
}
}
/// <summary>
/// 工单已打印标签数
/// </summary>
/// <param name="workOrderId"></param>
/// <returns></returns>
public int GetWorkOrderPackingrecordCount(string workOrderId)
{
try
{
string[] Machines = new string[] { "0", "1", "2", "3" };
return Context
.Queryable<WmPackingrecord>()
.Where(it => it.WorkOrderNum == workOrderId)
.Where(it => Machines.Contains(it.Machine))
.Where(it => it.Standby3 == null)
.OrderBy(it => it.Id)
.Count();
}
catch (Exception ex)
{
return 0;
}
}
public QcCommonFqcBoardDto GetWorkOrderBoardData(string workOrderId)
{
try
{
// 检查对应工单是否存在
ProWorkorder_v2 proWorkOrder = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
if (proWorkOrder == null)
{
throw new Exception("未在生产工单中找到该工单!");
}
//
QcCommonFqcBoardDto boardData = new QcCommonFqcBoardDto();
boardData.WorkOrderId = workOrderId;
// 提取工单年周日,组成数组
int year = proWorkOrder.Year;
int week = proWorkOrder.Week;
int date = proWorkOrder.Date;
List<ProWorkorder_v2> proWorkorders = GenerateWorkOrderListUtil(
year,
week,
date,
2
);
if (proWorkorders == null)
{
return null;
}
boardData.WorkOrderDayListCount = proWorkorders.Count;
// 提取目标工单号所在工单列表的位置
for (int i = 0; i < proWorkorders.Count; i++)
{
if (workOrderId == proWorkorders[i].ClientWorkorder)
{
boardData.WorkOrderIndex = i + 1;
break;
}
}
boardData.WorkOrderPackageCount = GetWorkOrderNeedPackingTotal(workOrderId);
boardData.WorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(workOrderId);
boardData.WorkOrderNotFinishPackageNum =
boardData.WorkOrderPackageCount - boardData.WorkOrderFinishPackageNum;
// 如果不是第一个工单,找到上一个工单号
if (boardData.WorkOrderIndex > 1)
{
boardData.LastWorkOrderId = proWorkorders[
(boardData.WorkOrderIndex - 2) ?? 0
].ClientWorkorder;
boardData.LastWorkOrderPackageCount = GetWorkOrderNeedPackingTotal(
boardData.LastWorkOrderId
);
boardData.LastWorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(
boardData.LastWorkOrderId
);
boardData.LastWorkOrderNotFinishPackageNum =
boardData.LastWorkOrderPackageCount
- boardData.LastWorkOrderFinishPackageNum;
}
List<ProWorkorder_v2> finishWorkorders = GenerateWorkOrderListUtil(
year,
week,
date,
1,
2
);
if (finishWorkorders == null)
{
return null;
}
boardData.WorkOrderFinishNum = finishWorkorders.Count;
boardData.WorkOrderNotFinishNum =
boardData.WorkOrderDayListCount - boardData.WorkOrderFinishNum;
boardData.UpdatedTime = DateTime.Now;
return boardData;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public PagedInfo<QcCommonFqcWorkerOrderDataDto> GetWorkOrderFqcData(
QcCommonFqcWorkerOrderDataQuery query
)
{
try
{
// 时间解析 年 周(第几周) 日(星期) 转换
int year = -1;
int week = -1;
int date = -1;
if (query.StartTime != null)
{
DateTime dateTime = query.StartTime ?? DateTime.Now;
GregorianCalendar gregorianCalendar = new GregorianCalendar();
year = gregorianCalendar.GetYear(dateTime);
week = gregorianCalendar.GetWeekOfYear(
dateTime,
CalendarWeekRule.FirstDay,
DayOfWeek.Monday
);
date = (int)gregorianCalendar.GetDayOfWeek(dateTime);
if (date == 0)
{
date = 7;
}
}
// 获取当天全部工单数据
bool isCheckData = true;
if (!string.IsNullOrEmpty(query.WorkOrderId))
{
isCheckData = false;
}
var predicate = Expressionable
.Create<ProWorkorder_v2>()
.AndIF(isCheckData, it => it.Year == year)
.AndIF(isCheckData, it => it.Week == week)
.AndIF(isCheckData, it => it.Date == date)
.And(it => it.Remark3 == "是")
.AndIF(query.Status > -1, it => it.Status == query.Status)
.AndIF(
!string.IsNullOrEmpty(query.WorkOrderId),
it => it.ClientWorkorder.Contains(query.WorkOrderId)
)
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber.Contains(query.Partnumber)
)
.AndIF(
!string.IsNullOrEmpty(query.Description),
it =>
it.ProductDescription.Contains(query.Description)
|| it.Colour.Contains(query.Description)
|| it.Specifications.Contains(query.Description)
)
.ToExpression();
List<ProWorkorder_v2> orderList = Context
.Queryable<ProWorkorder_v2>()
.Where(predicate)
.OrderBy(it => it.Sort)
.ToList();
//TODO 分页暂不实现
//转换数据
PagedInfo<QcCommonFqcWorkerOrderDataDto> resultPage =
new PagedInfo<QcCommonFqcWorkerOrderDataDto>();
List<QcCommonFqcWorkerOrderDataDto> resultList =
new List<QcCommonFqcWorkerOrderDataDto>();
foreach (var item in orderList)
{
if (item != null)
{
string Remark = "";
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.FinishedPartNumber)
.First();
string Description = "";
string Color = "";
string Specification = "";
if (material != null)
{
Description = material.Description;
Color = material.Color;
Specification = material.Specification;
}
else
{
Remark += "物料不在清单内 ";
}
// 首检报表数据拉取
QcQualityStatisticsFirst QcFirstData = Context
.Queryable<QcQualityStatisticsFirst>()
.Where(it => it.WorkorderId == item.ClientWorkorder)
.First();
string Team = "";
DateTime? startTime = null;
DateTime? endTime = null;
if (QcFirstData != null)
{
Team = QcFirstData.Team;
startTime = QcFirstData.StartTime;
endTime = QcFirstData.EndTime;
if (startTime == null)
{
Remark += "工单开始时间为空 ";
}
}
int WorkOrderPackageCount = GetWorkOrderNeedPackingTotal(
item.ClientWorkorder
);
int WorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(
item.ClientWorkorder
);
int WorkOrderNotFinishPackageNum =
WorkOrderPackageCount - WorkOrderFinishPackageNum;
if (WorkOrderNotFinishPackageNum < 0)
{
WorkOrderNotFinishPackageNum = 0;
}
bool IsFinish = WorkOrderNotFinishPackageNum == 0;
QcCommonFqcWorkerOrderDataDto newItem =
new()
{
WorkOrderId = item.ClientWorkorder,
Partnumber = item.FinishedPartNumber,
Description = Description,
Color = Color,
Specification = Specification,
Team = Team,
StartTime = startTime,
EndTime = endTime,
Status = item.Status,
Remark = Remark,
IsFinish = IsFinish,
WorkOrderPackageCount = WorkOrderPackageCount,
WorkOrderFinishPackageNum = WorkOrderFinishPackageNum,
WorkOrderNotFinishPackageNum = WorkOrderNotFinishPackageNum
};
resultList.Add(newItem);
}
}
resultPage.Result = resultList;
resultPage.TotalNum = resultPage.Result.Count;
resultPage.PageSize = query.PageSize;
resultPage.PageIndex = query.PageNum;
return resultPage;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取产线相关数据
/// </summary>
/// <param name="boardData"></param>
/// <param name="query"></param>
/// <returns></returns>
public QcProductAndPolishAndOneTimeFqcBoardDto GetProductTotal(
QcProductAndPolishAndOneTimeFqcBoardDto boardData,
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
// 投入数
var predicate1 = Expressionable
.Create<QcQualityStatisticsFirst>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
// 门把手提取
string[] checkStrArray =
{
"门把手",
"面盖",
"T22",
"T26",
"A58",
"A60",
"C01",
"B02",
"V71",
"T1EJ"
};
var DoorknobPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray)
{
DoorknobPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
DoorknobPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> DoorknobPartNumberList = Context
.Queryable<WmMaterial>()
.Where(DoorknobPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicate2 = Expressionable
.Create<QcQualityStatisticsFirst>()
.And(it => DoorknobPartNumberList.Contains(it.FinishedPartNumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
// 倒车雷达提取
string[] checkStrArray2 = { "倒车雷达" };
var ParkingSensorPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray2)
{
ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> ParkingSensorPartNumberList = Context
.Queryable<WmMaterial>()
.Where(ParkingSensorPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicateParkingSensor = Expressionable
.Create<QcQualityStatisticsFirst>()
.And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
boardData.ProductRequireTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate1)
.Sum(it => it.RequireNumber) ?? 0;
boardData.ProductQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate1)
.Sum(it => it.QualifiedNumber) ?? 0;
// 门把手合格
boardData.ProductDoorknobQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate2)
.Sum(it => it.QualifiedNumber) ?? 0;
// 倒车雷达合格
boardData.ProductParkingSensorbQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicateParkingSensor)
.Sum(it => it.QualifiedNumber) ?? 0;
boardData.ProductPolishTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate1)
.Sum(it => it.PaoguangTotal) ?? 0;
boardData.ProductSandingTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate1)
.Sum(it => it.DamoTotal) ?? 0;
boardData.ProductDiscardTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicate1)
.Sum(it => it.BaofeiTotal) ?? 0;
// 除三优化
boardData.ProductRequireTotal = boardData.ProductRequireTotal / 3;
boardData.ProductQualifiedTotal = boardData.ProductQualifiedTotal / 3;
boardData.ProductDoorknobQualifiedTotal = boardData.ProductDoorknobQualifiedTotal / 3;
boardData.ProductParkingSensorbQualifiedTotal =
boardData.ProductParkingSensorbQualifiedTotal / 3;
boardData.ProductPolishTotal = boardData.ProductPolishTotal / 3;
boardData.ProductSandingTotal = boardData.ProductSandingTotal / 3;
boardData.ProductDiscardTotal = boardData.ProductDiscardTotal / 3;
// 投入数,合格数补正(合格数 = 总合格数 - 倒车雷达)[倒车雷达不参与合格率统计]
boardData.ProductRequireTotal -= boardData.ProductParkingSensorbQualifiedTotal;
boardData.ProductQualifiedTotal -= boardData.ProductParkingSensorbQualifiedTotal;
if (boardData.ProductRequireTotal > 0)
{
double passRate =
((double)boardData.ProductQualifiedTotal / boardData.ProductRequireTotal) * 100;
boardData.ProductQualifiePassRate = passRate.ToString("0") + "%";
}
return boardData;
}
// 获取抛光相关数据
public QcProductAndPolishAndOneTimeFqcBoardDto GetPolishTotal(
QcProductAndPolishAndOneTimeFqcBoardDto boardData,
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
var predicateInventory = Expressionable
.Create<WmPolishInventory>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.ToExpression();
var predicate1 = Expressionable
.Create<WmPolishWorkQualityStatistics>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
var predicate2 = Expressionable
.Create<WmPolishQualityStatistics>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
string[] checkStrArray =
{
"门把手",
"面盖",
"T22",
"T26",
"A58",
"A60",
"C01",
"B02",
"V71",
"T1EJ"
};
var DoorknobPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray)
{
DoorknobPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
DoorknobPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> DoorknobPartNumberList = Context
.Queryable<WmMaterial>()
.Where(DoorknobPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
// 倒车雷达提取
string[] checkStrArray2 = { "倒车雷达" };
var ParkingSensorPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray2)
{
ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> ParkingSensorPartNumberList = Context
.Queryable<WmMaterial>()
.Where(ParkingSensorPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicateParkingSensor1 = Expressionable
.Create<WmPolishWorkQualityStatistics>()
.And(it => ParkingSensorPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
var predicateParkingSensor2 = Expressionable
.Create<WmPolishQualityStatistics>()
.And(it => ParkingSensorPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
var predicate3 = Expressionable
.Create<WmPolishQualityStatistics>()
.And(it => DoorknobPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
var predicate4 = Expressionable
.Create<WmPolishWorkQualityStatistics>()
.And(it => DoorknobPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
boardData.PolishWarehouseTotal =
Context
.Queryable<WmPolishInventory>()
.Where(predicateInventory)
.Sum(it => it.Quantity) ?? 0;
boardData.PolishRequireTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicate1)
.Sum(it => it.RequireNumber) ?? 0;
// 抛光合格
boardData.PolishQualifiedTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicate1)
.Sum(it => it.QualifiedNumber) ?? 0;
// 抛光门把手
boardData.PolishDoorknobQualifiedTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicate4)
.Sum(it => it.QualifiedNumber) ?? 0;
// 抛光倒车雷达
boardData.PolishParkingSensorbQualifiedTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicateParkingSensor1)
.Sum(it => it.QualifiedNumber) ?? 0;
boardData.PolishSandingTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicate1)
.Sum(it => it.DamoTotal) ?? 0;
boardData.PolishDiscardTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(predicate1)
.Sum(it => it.BaofeiTotal) ?? 0;
boardData.AfterPolishRequireTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate2)
.Sum(it => it.RequireNumber) ?? 0;
// 后道合格
boardData.AfterPolishQualifiedTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate2)
.Sum(it => it.QualifiedNumber) ?? 0;
// 后道门把手合格数
boardData.AfterPolishDoorknobQualifiedTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate3)
.Sum(it => it.QualifiedNumber) ?? 0;
// 后道倒车雷达合格数
boardData.AfterPolishParkingSensorbQualifiedTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicateParkingSensor2)
.Sum(it => it.QualifiedNumber) ?? 0;
boardData.AfterPolishPolishTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate2)
.Sum(it => it.PaoguangTotal) ?? 0;
boardData.AfterPolishSandingTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate2)
.Sum(it => it.DamoTotal) ?? 0;
boardData.AfterPolishDiscardTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate2)
.Sum(it => it.BaofeiTotal) ?? 0;
// 合格数修正 去掉倒车雷达
boardData.PolishRequireTotal -= boardData.PolishParkingSensorbQualifiedTotal;
boardData.PolishQualifiedTotal -= boardData.PolishParkingSensorbQualifiedTotal;
boardData.AfterPolishQualifiedTotal -=
boardData.AfterPolishParkingSensorbQualifiedTotal;
boardData.AfterPolishRequireTotal -= boardData.AfterPolishParkingSensorbQualifiedTotal;
if (boardData.PolishRequireTotal > 0)
{
double passRate =
((double)boardData.PolishQualifiedTotal / boardData.PolishRequireTotal) * 100;
boardData.PolishQualifiePassRate = passRate.ToString("0") + "%";
}
if (boardData.AfterPolishRequireTotal > 0)
{
double passRate =
(
(double)boardData.AfterPolishQualifiedTotal
/ boardData.AfterPolishRequireTotal
) * 100;
boardData.AfterPolishQualifiePassRate = passRate.ToString("0") + "%";
}
return boardData;
}
// 获取一次合格品相关数据
public QcProductAndPolishAndOneTimeFqcBoardDto GetOneTimeTotal(
QcProductAndPolishAndOneTimeFqcBoardDto boardData,
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
var predicate1 = Expressionable
.Create<WmOneTimeInventory>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.ToExpression();
var predicate2 = Expressionable
.Create<WmGp12QualityStatistics>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
// 门把手提取
string[] checkStrArray =
{
"门把手",
"面盖",
"T22",
"T26",
"A58",
"A60",
"C01",
"B02",
"V71",
"T1EJ"
};
var DoorknobPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray)
{
DoorknobPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
DoorknobPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> DoorknobPartNumberList = Context
.Queryable<WmMaterial>()
.Where(DoorknobPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicate3 = Expressionable
.Create<WmGp12QualityStatistics>()
.And(it => DoorknobPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
// 倒车雷达提取
string[] checkStrArray2 = { "倒车雷达" };
var ParkingSensorPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray2)
{
ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> ParkingSensorPartNumberList = Context
.Queryable<WmMaterial>()
.Where(ParkingSensorPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicateParkingSensor = Expressionable
.Create<WmGp12QualityStatistics>()
.And(it => ParkingSensorPartNumberList.Contains(it.Partnumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
boardData.OneTimeWarehouseTotal =
Context.Queryable<WmOneTimeInventory>().Where(predicate1).Sum(it => it.Quantity)
?? 0;
boardData.GP12RequireTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.RequireNumber) ?? 0;
// GP12合格数
boardData.GP12QualifiedTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.QualifiedNumber) ?? 0;
// GP12门把手
boardData.GP12DoorknobQualifiedTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate3)
.Sum(it => it.QualifiedNumber) ?? 0;
// GP12倒车雷达
boardData.GP12ParkingSensorQualifiedTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicateParkingSensor)
.Sum(it => it.QualifiedNumber) ?? 0;
boardData.GP12PolishTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.PaoguangTotal) ?? 0;
boardData.GP12SandingTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.DamoTotal) ?? 0;
boardData.GP12DiscardTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.BaofeiTotal) ?? 0;
// 倒车雷达去除
boardData.GP12QualifiedTotal -= boardData.GP12ParkingSensorQualifiedTotal;
boardData.GP12RequireTotal -= boardData.GP12ParkingSensorQualifiedTotal;
if (boardData.GP12RequireTotal > 0)
{
double passRate =
((double)boardData.GP12QualifiedTotal / boardData.GP12RequireTotal) * 100;
boardData.GP12QualifiePassRate = passRate.ToString("0") + "%";
}
return boardData;
}
// 获取成品仓库相关数据
public QcProductAndPolishAndOneTimeFqcBoardDto GetFinishProductTotal(
QcProductAndPolishAndOneTimeFqcBoardDto boardData,
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
var predicate1 = Expressionable
.Create<WmGoodsNowProduction>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.EntryWarehouseTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.EntryWarehouseTime <= query.EndTime.Value.ToLocalTime()
)
.ToExpression();
var predicate2 = Expressionable
.Create<WmGoodsOutRecord>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.OutTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(query.EndTime != null, it => it.OutTime <= query.EndTime.Value.ToLocalTime())
.ToExpression();
boardData.FinishProductPartTotal =
Context
.Queryable<WmGoodsNowProduction>()
.Where(predicate1)
.Sum(it => it.GoodsNumAction) ?? 0;
boardData.FinishProductPackageTotal = Context
.Queryable<WmGoodsNowProduction>()
.Where(predicate1)
.Count();
boardData.FinishProductPartOutTotal =
Context.Queryable<WmGoodsOutRecord>().Where(predicate2).Sum(it => it.GoodsNumAction)
?? 0;
boardData.FinishProductPackageOutTotal = Context
.Queryable<WmGoodsOutRecord>()
.Where(predicate2)
.Count();
return boardData;
}
/// <summary>
/// 获取二次统计数据
/// </summary>
/// <param name="boardData"></param>
/// <param name="query"></param>
/// <returns></returns>
public QcProductAndPolishAndOneTimeFqcBoardDto GetStatisticsTotal(
QcProductAndPolishAndOneTimeFqcBoardDto boardData,
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
var predicate1 = Expressionable
.Create<WmPolishQualityStatistics>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.And(it => it.Type == 1)
.ToExpression();
var predicate2 = Expressionable
.Create<WmGp12QualityStatistics>()
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.AndIF(
query.StartTime != null,
it => it.StartTime >= query.StartTime.Value.ToLocalTime()
)
.AndIF(
query.EndTime != null,
it => it.StartTime <= query.EndTime.Value.ToLocalTime()
)
.And(it => it.Type == 1)
.ToExpression();
boardData.AfterPolishInTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate1)
.Sum(it => it.QualifiedNumber) ?? 0;
boardData.AfterPolishOutTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate1)
.Sum(it => it.RequireNumber) ?? 0;
boardData.StatisticsPolishQualifiedTotal =
(
Context
.Queryable<WmPolishQualityStatistics>()
.Where(predicate1)
.Sum(it => it.QualifiedNumber) ?? 0
)
+ (
Context
.Queryable<WmGp12QualityStatistics>()
.Where(predicate2)
.Sum(it => it.QualifiedNumber) ?? 0
);
boardData.StatisticsProductAndPolishQualifiedTotal =
boardData.StatisticsPolishQualifiedTotal + boardData.ProductQualifiedTotal;
// 盘点后库存计算值
// 抛光库盘点时间
boardData.PolishStockTime =
Context
.Queryable<WmPolishInventory>()
.Where(it => it.Status == 1)
.Select(it => it.CreatedTime)
.First() ?? new DateTime(2024, 10, 19, 0, 0, 0);
// 抛光盘点库存
int polishWarehouseTotal =
Context
.Queryable<WmPolishInventory>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Sum(it => it.Quantity) ?? 0;
boardData.StockPolishWarehouseCount = polishWarehouseTotal;
// 产线抛光
int productPolishTotal =
(
Context
.Queryable<QcQualityStatisticsFirst>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.PolishStockTime)
.Sum(it => it.PaoguangTotal) ?? 0
) / 3;
// 后道反抛
int afterPolishPolishTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.PolishStockTime)
.Sum(it => it.PaoguangTotal) ?? 0;
// GP12反抛
int gP12PolishTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.PolishStockTime)
.Sum(it => it.PaoguangTotal) ?? 0;
// 抛光总投入数
int polishRequireTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.PolishStockTime)
.Sum(it => it.RequireNumber) ?? 0;
// 抛光实际库存
boardData.RealPolishWarehouseCount =
polishWarehouseTotal
+ productPolishTotal
+ afterPolishPolishTotal
+ gP12PolishTotal
- polishRequireTotal;
// 一次合格库盘点时间
boardData.OneTimeStockTime =
Context
.Queryable<WmOneTimeInventory>()
.Where(it => it.Status == 1)
.Select(it => it.CreatedTime)
.First() ?? new DateTime(2024, 10, 19, 0, 0, 0);
// 一次合格盘点库存
int oneTimeWarehouseTotal =
Context
.Queryable<WmOneTimeInventory>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Sum(it => it.Quantity) ?? 0;
boardData.StockOneTimeWarehouseCount = oneTimeWarehouseTotal;
// 产线合格
int productQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.OneTimeStockTime)
.Sum(it => it.QualifiedNumber) ?? 0;
// 倒车雷达
string[] checkStrArray2 = { "倒车雷达" };
var ParkingSensorPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray2)
{
ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> ParkingSensorPartNumberList = Context
.Queryable<WmMaterial>()
.Where(ParkingSensorPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
var predicateParkingSensor = Expressionable
.Create<QcQualityStatisticsFirst>()
.And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber))
.AndIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.FinishedPartNumber == query.Partnumber
)
.And(it => it.StartTime >= boardData.OneTimeStockTime)
.ToExpression();
// 倒车雷达
int productParkingSensorbQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicateParkingSensor)
.Sum(it => it.QualifiedNumber) ?? 0;
// 产线合格 - 倒车雷达
productQualifiedTotal =
(productQualifiedTotal - productParkingSensorbQualifiedTotal) / 3;
// 抛光合格
int polishQualifiedTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.OneTimeStockTime)
.Sum(it => it.QualifiedNumber) ?? 0;
// GP12总投入
int gP12RequireTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.StartTime >= boardData.OneTimeStockTime)
.Sum(it => it.RequireNumber) ?? 0;
// 后道直接出库
int afterPolishOutTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.WhereIF(
!string.IsNullOrEmpty(query.Partnumber),
it => it.Partnumber == query.Partnumber
)
.Where(it => it.Type == 1)
.Where(it => it.StartTime >= boardData.OneTimeStockTime)
.Sum(it => it.RequireNumber) ?? 0;
boardData.RealOneTimeWarehouseCount =
oneTimeWarehouseTotal
+ productQualifiedTotal
+ polishQualifiedTotal
- gP12RequireTotal
- afterPolishOutTotal;
return boardData;
}
/// <summary>
/// 获取产线,抛光,一次合格品质量报表看板数据
/// </summary>
/// <returns></returns>
public QcProductAndPolishAndOneTimeFqcBoardDto GetProductAndPolishAndOneTimeFqcBoardData(
QcProductAndPolishAndOneTimeFqcBoardQuery query
)
{
QcProductAndPolishAndOneTimeFqcBoardDto result = new();
result = GetProductTotal(result, query);
result = GetPolishTotal(result, query);
result = GetOneTimeTotal(result, query);
result = GetFinishProductTotal(result, query);
result = GetStatisticsTotal(result, query);
result.SandingTotal =
result.ProductSandingTotal
+ result.PolishSandingTotal
+ result.AfterPolishSandingTotal
+ result.GP12SandingTotal;
result.DiscardTotal =
result.ProductDiscardTotal
+ result.PolishDiscardTotal
+ result.AfterPolishDiscardTotal
+ result.GP12DiscardTotal;
result.UpdatedTime = DateTime.Now.ToLocalTime();
return result;
}
// 获取抛光报表变动后 每个零件 的实际库存 startTime 必填
public Dictionary<string, int> GetBatchPolishPartRealStock(
List<string> partNumbers,
DateTime startTime
)
{
var result = new Dictionary<string, int>();
try
{
foreach (var partNumber in partNumbers)
{
startTime =
Context
.Queryable<WmPolishInventory>()
.Where(it => it.Partnumber == partNumber)
.Select(it => it.UpdatedTime)
.First() ?? startTime;
// 盘点数
int polishWarehouseTotal =
Context
.Queryable<WmPolishInventory>()
.Where(it => it.Partnumber == partNumber)
.Sum(it => it.Quantity) ?? 0;
// 产线抛光
int productPolishTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(it => it.FinishedPartNumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.PaoguangTotal) ?? 0;
productPolishTotal = productPolishTotal / 3;
// 后道反抛
int afterPolishPolishTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.PaoguangTotal) ?? 0;
// GP12 反抛
int gP12PolishTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.PaoguangTotal) ?? 0;
// 抛光出库
int polishRequireTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.RequireNumber) ?? 0;
int realStock =
polishWarehouseTotal
+ productPolishTotal
+ afterPolishPolishTotal
+ gP12PolishTotal
- polishRequireTotal;
result.Add(partNumber, realStock);
}
return result;
}
catch (Exception ex)
{
// 此处应记录日志而不是直接抛出异常或返回0否则调用者无法区别正常0库存与错误
Console.WriteLine($"An error occurred: {ex.Message}");
throw; // 重新抛出异常以告知调用者
}
}
// 获取GP12报表变动后 一次合格品 每个零件 的实际库存 startTime 必填
public Dictionary<string, int> GetBatchOneTimePartRealStock(
List<string> partNumbers,
DateTime startTime
)
{
var result = new Dictionary<string, int>();
try
{
foreach (var partNumber in partNumbers)
{
startTime =
Context
.Queryable<WmOneTimeInventory>()
.Where(it => it.Partnumber == partNumber)
.Select(it => it.UpdatedTime)
.First() ?? startTime;
// 基本值
int oneTimeWarehouseTotal =
Context
.Queryable<WmOneTimeInventory>()
.Where(it => it.Partnumber == partNumber)
.Sum(it => it.Quantity) ?? 0;
// 产线倒车雷达
// 倒车雷达剔除数据
string[] checkStrArray2 = { "倒车雷达" };
var ParkingSensorPartNumberCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray2)
{
ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr));
}
;
ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1);
List<string> ParkingSensorPartNumberList = Context
.Queryable<WmMaterial>()
.Where(ParkingSensorPartNumberCheck.ToExpression())
.Select(it => it.Partnumber)
.ToList();
/* var predicateParkingSensor = Expressionable
.Create<QcQualityStatisticsFirst>()
.And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber))
.And(it => it.FinishedPartNumber == partNumber)
.And(it => it.StartTime >= startTime.ToLocalTime())
.ToExpression();
int productParkingSensorbQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(predicateParkingSensor)
.Sum(it => it.QualifiedNumber) ?? 0;
productParkingSensorbQualifiedTotal = productParkingSensorbQualifiedTotal / 3;*/
// 产线合格
int productQualifiedTotal =
Context
.Queryable<QcQualityStatisticsFirst>()
.Where(it =>
!ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)
)
.Where(it => it.FinishedPartNumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.QualifiedNumber) ?? 0;
productQualifiedTotal = productQualifiedTotal / 3;
// 抛光合格
int polishQualifiedTotal =
Context
.Queryable<WmPolishWorkQualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.QualifiedNumber) ?? 0;
// gp12投入
int gP12RequireTotal =
Context
.Queryable<WmGp12QualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Sum(it => it.RequireNumber) ?? 0;
// 后道直接出库
int afterPolishOutTotal =
Context
.Queryable<WmPolishQualityStatistics>()
.Where(it => it.Partnumber == partNumber)
.Where(it => it.StartTime >= startTime)
.Where(it => it.Type == 1)
.Sum(it => it.RequireNumber) ?? 0;
int realStock =
oneTimeWarehouseTotal
+ productQualifiedTotal
+ polishQualifiedTotal
- gP12RequireTotal
- afterPolishOutTotal;
result.Add(partNumber, realStock);
}
return result;
}
catch (Exception ex)
{
// 此处应记录日志而不是直接抛出异常或返回0否则调用者无法区别正常0库存与错误
Console.WriteLine($"An error occurred: {ex.Message}");
throw; // 重新抛出异常以告知调用者
}
}
/// <summary>
/// 检查零件号是否是门把手
/// </summary>
/// <returns></returns>
public bool CheckIsDoorknob(string partnumber)
{
string[] checkStrArray =
{
"门把手",
"面盖",
"T22",
"T26",
"A58",
"A60",
"C01",
"B02",
"V71",
"T1EJ",
"倒车雷达"
};
var isDoorknobCheck = Expressionable.Create<WmMaterial>();
foreach (string checkStr in checkStrArray)
{
isDoorknobCheck.Or(it => it.Description.Contains(checkStr));
}
;
isDoorknobCheck
.And(it => it.Partnumber == partnumber)
.And(it => it.Type == 1)
.And(it => it.Status == 1);
return Context.Queryable<WmMaterial>().Where(isDoorknobCheck.ToExpression()).Any();
}
}
}