using Masuit.Tools;
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.util;
using SqlSugar;
namespace MES.Service.service.QC;
///
/// 产线提交服务
///
public class ProductionLineService
{
private readonly BaseService _baseService = new();
///
/// 获取产线提交页面数据(未提交/已提交)
///
/// 查询参数
///
public (List item, int TotalCount) GetProductionLinePage(ProductionLineQueryDto queryObj)
{
var db = SqlSugarHelper.GetInstance();
if (queryObj.Status == 0)
{
// 未提交页面查询
return GetUnsubmittedData(queryObj, db);
}
else
{
// 已提交页面查询
return GetSubmittedData(queryObj, db);
}
}
///
/// 获取未提交数据(从工单表查询,包含不合格的首检单)
///
private (List item, int TotalCount) GetUnsubmittedData(ProductionLineQueryDto queryObj, SqlSugarClient db)
{
var totalCount = 0;
//// 第一步:查询工单基础数据
//var workOrderSql = @"
//SELECT
// A.ID,
// A.DAA001,
// A.DAA002 AS ItemNo,
// A.DAA003,
// A.DAA004,
// A.DAA008,
// A.DAA018,
// A.DAA019 AS DaA019,
// A.DAA020 AS Line,
// A.DAA024,
// A.PID AS Pbaid,
// T.PROJECT_CODE AS ProjecT_CODE,
// u.FNAME AS FName,
// 0 AS Urgent,
// 0 AS IsFirst,
// CAST(NULL AS VARCHAR2(50)) AS BillNo,
// CAST(NULL AS VARCHAR2(50)) AS Result,
// CAST(NULL AS VARCHAR2(50)) AS StatusUser,
// CAST(NULL AS DATE) AS CreateTime,
// CAST(NULL AS NUMBER) AS InspectionId
//FROM WOMDAA A
//LEFT JOIN WOMCAA c ON c.CAA001 = A.DAA021
//LEFT JOIN MES_PROJECT T ON C.PROJECT = T.ID
//LEFT JOIN MES_UNIT u ON TO_CHAR(u.ID) = TO_CHAR(A.DAA005)
//WHERE A.DAA018 LIKE '%已开工%'
// AND A.FSTATUS = 1
// AND A.F_TYPE = 0
// AND CASE
// WHEN C.CAA023 = '0' THEN '开立'
// WHEN C.CAA023 = '1' THEN '已核准'
// WHEN C.CAA023 = '2' THEN '开工'
// WHEN C.CAA023 = '3' THEN '完工'
// WHEN C.CAA023 = '4' THEN '核准中'
// END LIKE '%开工%'";
// 第一步:查询工单基础数据
// 第一步:查询工单基础数据
// var workOrderSql = @"
// SELECT
// A.ID,
// A.DAA001,
// item.ITEM_NO AS ItemNo,
// A.DAA003,
// A.DAA004,
// A.DAA008,
// A.DAA018,
// A.DAA019 AS DaA019,
// A.DAA020 AS Line,
// A.PID AS Pbaid,
// T.PROJECT_CODE AS ProjecT_CODE,
// u.FNAME AS FName,
// 0 AS Urgent,
// 0 AS IsFirst,
// CAST(NULL AS VARCHAR2(50)) AS BillNo,
// CAST(NULL AS VARCHAR2(50)) AS Result,
// CAST(BE1.FNAME AS VARCHAR2(50)) AS StatusUser,
// CAST(NULL AS DATE) AS CreateTime,
// CAST(NULL AS NUMBER) AS InspectionId
// FROM WOMDAA A
// LEFT JOIN WOMCAA c ON c.CAA001 = A.DAA021
// LEFT JOIN MES_PROJECT T ON C.PROJECT = T.ID
// LEFT JOIN MES_UNIT u ON TO_CHAR(u.ID) = TO_CHAR(A.DAA005)
//left join MES_ITEMS item on item.ITEM_ID=c.CAA006
// LEFT JOIN IQC_BEFORE_SJ BE ON BE.ITEM_ID = item.ITEM_ID
// LEFT JOIN IQC_BEFORE_FROM_SJ BE2 ON BE.PID = BE2.ID
// LEFT JOIN SYS_USER BE1 ON BE2.SID = BE1.FID
// WHERE A.DAA018 LIKE '%已开工%'
// AND A.FSTATUS = 1
// AND A.F_TYPE = 0
// AND CASE
// WHEN C.CAA023 = '0' THEN '开立'
// WHEN C.CAA023 = '1' THEN '已核准'
// WHEN C.CAA023 = '2' THEN '开工'
// WHEN C.CAA023 = '3' THEN '完工'
// WHEN C.CAA023 = '4' THEN '核准中'
// END LIKE '%开工%'";
// // 添加搜索条件
// if (StringUtil.IsNotNullOrEmpty(queryObj.SearchValue))
// {
// workOrderSql += @"
// AND (
// A.DAA001 LIKE :SearchValue
// OR T.PROJECT_CODE LIKE '%' || :SearchValue || '%' -- 项目(来自MES_PROJECT表)
// OR A.DAA001 LIKE '%' || :SearchValue || '%' -- 工单号(来自WOMDAA表)
// OR item.ITEM_NO LIKE '%' || :SearchValue || '%' -- 物料号(来自MES_ITEMS表)
// OR item.ITEM_NAME LIKE '%' || :SearchValue || '%' -- 物料名称(来自MES_ITEMS表)
// )";
// }
var workOrderSql = @"
SELECT
A.ID,
A.DAA001,
item.ITEM_NO AS ItemNo,
A.DAA003,
A.DAA004,
A.DAA008,
A.DAA018,
A.DAA019 AS DaA019,
A.DAA020 AS Line,
A.PID AS Pbaid,
T.PROJECT_CODE AS ProjecT_CODE,
u.FNAME AS FName,
0 AS Urgent,
0 AS IsFirst,
CAST(NULL AS VARCHAR2(50)) AS BillNo,
CAST(NULL AS VARCHAR2(50)) AS Result,
CAST(BE1.FNAME AS VARCHAR2(50)) AS StatusUser,
CAST(NULL AS DATE) AS CreateTime,
CAST(NULL AS NUMBER) AS InspectionId
FROM WOMDAA A
LEFT JOIN WOMCAA c ON c.CAA001 = A.DAA021
LEFT JOIN MES_PROJECT T ON C.PROJECT = T.ID
LEFT JOIN MES_UNIT u ON TO_CHAR(u.ID) = TO_CHAR(A.DAA005)
LEFT JOIN MES_ITEMS item ON item.ITEM_ID = c.CAA006
LEFT JOIN MES_LINE ml ON ml.LINE_NO = A.DAA020
LEFT JOIN IQC_BEFORE_SJ BE ON BE.ITEM_ID = item.ITEM_ID
LEFT JOIN IQC_BEFORE_FROM_SJ BE2 ON BE.PID = BE2.ID
LEFT JOIN SYS_USER BE1 ON BE2.SID = BE1.FID
WHERE A.DAA018 LIKE '%已开工%'
AND A.FSTATUS = 1
AND A.F_TYPE = 0
AND CASE
WHEN C.CAA023 = '0' THEN '开立'
WHEN C.CAA023 = '1' THEN '已核准'
WHEN C.CAA023 = '2' THEN '开工'
WHEN C.CAA023 = '3' THEN '完工'
WHEN C.CAA023 = '4' THEN '核准中'
END LIKE '%开工%'";
// 添加搜索条件
if (!string.IsNullOrEmpty(queryObj.SearchValue))
{
switch (queryObj.SelectedIndex)
{
case "2": // 工单号
workOrderSql += " AND A.DAA001 LIKE '%' || :SearchValue || '%'";
break;
case "3": // 物料号
workOrderSql += " AND item.ITEM_NO LIKE '%' || :SearchValue || '%'";
break;
case "4": // 物料名称
workOrderSql += " AND item.ITEM_NAME LIKE '%' || :SearchValue || '%'";
break;
case "0": // 项目编码
workOrderSql += " AND T.PROJECT_CODE LIKE '%' || :SearchValue || '%'";
break;
case "1": // 线体
workOrderSql += " AND A.DAA020 LIKE '%' || :SearchValue || '%'";
break;
default:
return (new List(), 0);
}
}
// 根据 selectedIndex 添加额外的搜索条件
var workOrders = db.SqlQueryable(workOrderSql)
.AddParameters(new { SearchValue = $"%{queryObj.SearchValue}%" })
.ToList();
if (!workOrders.Any())
{
return (new List(), 0);
}
// 转换为字符串用于IN查询
var workOrderIdStrings = workOrders
.Where(w => !string.IsNullOrEmpty(w.ID.ToString()))
.Select(w => w.ID)
.ToList();
if (!workOrderIdStrings.Any())
{
return (new List(), 0);
}
// 第二步:查询这些工单对应的首检单及检验结果
var inspectionResultSql = $@"
SELECT
A.ID,
A.BILL_NO AS BillNo,
A.PBAID,
A.STATUS_USER AS StatusUser,
A.CREATE_TIME AS CreateTime,
CASE
WHEN RES.检验结果 IS NULL THEN '未完成'
ELSE RES.检验结果
END AS Result
FROM (
-- 只取每个工单(PBAID)最新一条首检单
SELECT *
FROM (
SELECT
R.*,
ROW_NUMBER() OVER(PARTITION BY R.PBAID ORDER BY R.CREATE_TIME DESC) AS RN
FROM QS_ITEM_IPI_REQ R
) WHERE RN = 1
) A
LEFT JOIN (
SELECT
PID,
CASE
WHEN (COUNT(CASE WHEN PASSED = -1 THEN 1 END) > 0) THEN NULL
WHEN (COUNT(CASE WHEN PASSED = 1 THEN 1 END) = COUNT(*)) THEN '合格'
ELSE '不合格'
END AS 检验结果
FROM (
SELECT
A.PID,
CASE
WHEN (A.IS_PASS IS NULL OR B.完成状态 IS NULL) THEN -1
WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 1) THEN 1
WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 0) THEN 0
ELSE -1
END AS PASSED
FROM QS_ITEM_IPI_ITEM A
LEFT JOIN (
SELECT
PID,
CASE
WHEN (COUNT(CASE WHEN FSTAND IS NULL THEN 1 END) > 0) THEN NULL
WHEN (COUNT(CASE WHEN FSTAND = '√' THEN 1 END) = COUNT(1)) THEN 1
ELSE 0
END AS 完成状态
FROM QS_ITEM_IPI_ITEM_DETAIL
GROUP BY PID
) B ON A.ID = B.PID
)
GROUP BY PID
) RES ON RES.PID = A.ID
WHERE A.PBAID IN ({string.Join(",", workOrderIdStrings)})";
var inspections = db.SqlQueryable(inspectionResultSql).ToList();
// 第三步:合并数据并过滤
var result = (from wo in workOrders
join ins in inspections on wo.ID.ToString() equals ins.Pbaid.ToString() into insGroup
from ins in insGroup.DefaultIfEmpty()
where ins == null || ins.Result == "不合格" // 未提交或不合格的显示
select new ProductionLinePageResult
{
ID = wo.ID,
DAA001 = wo.DAA001,
ItemNo = wo.ItemNo,
DAA003 = wo.DAA003,
DAA004 = wo.DAA004,
DAA008 = wo.DAA008,
DAA018 = wo.DAA018,
DaA019 = wo.DaA019,
Line = wo.Line,
DAA024 = wo.DAA024,
ProjecT_CODE = wo.ProjecT_CODE,
FName = wo.FName,
BillNo = ins?.BillNo,
Result = ins?.Result,
StatusUser = wo?.StatusUser,
CreateTime = ins?.CreateTime,
InspectionId = ins?.ID,
Pbaid = wo.Pbaid,
Urgent = wo.Urgent,
IsFirst = wo.IsFirst,
SortOrder = ins?.Result == "不合格" ? 1 : 0 // 不合格置顶
})
.OrderByDescending(x => x.SortOrder)
.ThenByDescending(x => x.DAA024)
.ToList();
totalCount = result.Count;
// 分页
var pagedData = result
.Skip((queryObj.PageIndex - 1) * queryObj.Limit)
.Take(queryObj.Limit)
.ToList();
return (pagedData, totalCount);
}
///
/// 获取已提交数据(从首检单表查询)
///
private (List item, int TotalCount) GetSubmittedData(ProductionLineQueryDto queryObj, SqlSugarClient db)
{
var totalCount = 0;
// var sql = @"
// SELECT
// A.ID AS InspectionId,
// A.BILL_NO AS BillNo,
// A.PBAID AS Pbaid,
// DA.DAA001,
// item.ITEM_NO AS ItemNo,
// DA.DAA003,
// DA.DAA004,
// DA.DAA008,
// DA.DAA018,
// DA.DAA019 AS DaA019,
// DA.DAA020 AS Line,
// A.CREATE_TIME AS CreateTime,
// NVL(BE3.FNAME, BE1.FNAME) AS StatusUser,
// A.FSUBMIT,
// A.CREATE_BY,
// 0 AS Urgent,
// 0 AS IsFirst,
// T.PROJECT_CODE AS ProjecT_CODE,
// CASE
// WHEN 检验结果 IS NULL THEN '未完成'
// ELSE 检验结果
// END AS Result
// FROM QS_ITEM_IPI_REQ A
// LEFT JOIN WOMDAA DA ON DA.ID = A.PBAID
// LEFT JOIN WOMCAA c ON c.CAA001 = DA.DAA021
// LEFT JOIN MES_PROJECT T ON C.PROJECT = T.ID
// left join MES_ITEMS item on item.ITEM_ID=c.CAA006
//--变更后
//LEFT JOIN INSPECTOR_CHANGE_SJ_LOG chlog
// ON chlog.INSPECTION_NO = a.BILL_NO AND chlog.IS_VALID = 'Y'
// LEFT JOIN SYS_USER BE3 ON chlog.INSPECTOR = BE3.FCODE
//--变更前
// LEFT JOIN IQC_BEFORE_SJ BE ON BE.ITEM_ID = item.ITEM_ID
// LEFT JOIN IQC_BEFORE_FROM_SJ BE2 ON BE.PID = BE2.ID
// LEFT JOIN SYS_USER BE1 ON BE2.SID = BE1.FID
// LEFT JOIN (
// SELECT
// PID,
// CASE
// WHEN (COUNT(CASE WHEN PASSED = -1 THEN 1 END) > 0) THEN NULL
// WHEN (COUNT(CASE WHEN PASSED = 1 THEN 1 END) = COUNT(*)) THEN '合格'
// ELSE '不合格'
// END AS 检验结果
// FROM (
// SELECT
// A.PID,
// CASE
// WHEN (A.IS_PASS IS NULL OR B.完成状态 IS NULL) THEN -1
// WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 1) THEN 1
// WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 0) THEN 0
// ELSE -1
// END AS PASSED
// FROM QS_ITEM_IPI_ITEM A
// LEFT JOIN (
// SELECT
// PID,
// CASE
// WHEN (COUNT(CASE WHEN FSTAND IS NULL THEN 1 END) > 0) THEN NULL
// WHEN (COUNT(CASE WHEN FSTAND = '√' THEN 1 END) = COUNT(1)) THEN 1
// ELSE 0
// END AS 完成状态
// FROM QS_ITEM_IPI_ITEM_DETAIL
// GROUP BY PID
// ) B ON A.ID = B.PID
// )
// GROUP BY PID
// ) RES ON RES.PID = A.ID
// WHERE A.ID IS NOT NULL";
// // 添加搜索条件
// if (StringUtil.IsNotNullOrEmpty(queryObj.SearchValue))
// {
// sql += sql += @"
// AND (
// A.BILL_NO LIKE :SearchValue
// OR DA.DAA001 LIKE :SearchValue
// OR DA.DAA002 LIKE :SearchValue
// OR T.PROJECT_CODE LIKE '%' || :SearchValue || '%' -- 项目(来自MES_PROJECT表)
// OR ml.LINE_NAME LIKE '%' || :SearchValue || '%' -- 线体(来自MES_LINE表)
// OR A.DAA001 LIKE '%' || :SearchValue || '%' -- 工单号(来自WOMDAA表)
// OR item.ITEM_NO LIKE '%' || :SearchValue || '%' -- 物料号(来自MES_ITEMS表)
// OR item.ITEM_NAME LIKE '%' || :SearchValue || '%' -- 物料名称(来自MES_ITEMS表)
// )";
// }
var sql = @"
SELECT
A.ID AS InspectionId,
A.BILL_NO AS BillNo,
A.PBAID AS Pbaid,
DA.DAA001,
item.ITEM_NO AS ItemNo,
DA.DAA003,
DA.DAA004,
DA.DAA008,
DA.DAA018,
DA.DAA019 AS DaA019,
DA.DAA020 AS Line,
A.CREATE_TIME AS CreateTime,
NVL(BE3.FNAME, BE1.FNAME) AS StatusUser,
A.FSUBMIT,
A.CREATE_BY,
0 AS Urgent,
0 AS IsFirst,
T.PROJECT_CODE AS ProjecT_CODE,
CASE
WHEN 检验结果 IS NULL THEN '未完成'
ELSE 检验结果
END AS Result
FROM QS_ITEM_IPI_REQ A
LEFT JOIN WOMDAA DA ON DA.ID = A.PBAID
LEFT JOIN WOMCAA c ON c.CAA001 = DA.DAA021
LEFT JOIN MES_PROJECT T ON C.PROJECT = T.ID
LEFT JOIN MES_ITEMS item ON item.ITEM_ID = c.CAA006
LEFT JOIN MES_LINE ml ON ml.LINE_NO = DA.DAA020
--变更后
LEFT JOIN INSPECTOR_CHANGE_SJ_LOG chlog
ON chlog.INSPECTION_NO = a.BILL_NO AND chlog.IS_VALID = 'Y'
LEFT JOIN SYS_USER BE3 ON chlog.INSPECTOR = BE3.FCODE
--变更前
LEFT JOIN IQC_BEFORE_SJ BE ON BE.ITEM_ID = item.ITEM_ID
LEFT JOIN IQC_BEFORE_FROM_SJ BE2 ON BE.PID = BE2.ID
LEFT JOIN SYS_USER BE1 ON BE2.SID = BE1.FID
LEFT JOIN (
SELECT
PID,
CASE
WHEN (COUNT(CASE WHEN PASSED = -1 THEN 1 END) > 0) THEN NULL
WHEN (COUNT(CASE WHEN PASSED = 1 THEN 1 END) = COUNT(*)) THEN '合格'
ELSE '不合格'
END AS 检验结果
FROM (
SELECT
A.PID,
CASE
WHEN (A.IS_PASS IS NULL OR B.完成状态 IS NULL) THEN -1
WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 1) THEN 1
WHEN (NVL(A.IS_PASS, -1) = NVL(B.完成状态, -1) AND A.IS_PASS = 0) THEN 0
ELSE -1
END AS PASSED
FROM QS_ITEM_IPI_ITEM A
LEFT JOIN (
SELECT
PID,
CASE
WHEN (COUNT(CASE WHEN FSTAND IS NULL THEN 1 END) > 0) THEN NULL
WHEN (COUNT(CASE WHEN FSTAND = '√' THEN 1 END) = COUNT(1)) THEN 1
ELSE 0
END AS 完成状态
FROM QS_ITEM_IPI_ITEM_DETAIL
GROUP BY PID
) B ON A.ID = B.PID
)
GROUP BY PID
) RES ON RES.PID = A.ID
WHERE A.ID IS NOT NULL";
// 添加搜索条件
if (!string.IsNullOrEmpty(queryObj.SearchValue))
{
switch (queryObj.SelectedIndex)
{
case "2": // 工单号
sql += " AND DA.DAA001 LIKE '%' || :SearchValue || '%'";
break;
case "3": // 物料号
sql += " AND item.ITEM_NO LIKE '%' || :SearchValue || '%'";
break;
case "4": // 物料名称
sql += " AND item.ITEM_NAME LIKE '%' || :SearchValue || '%'";
break;
case "0": // 项目编码
sql += " AND T.PROJECT_CODE LIKE '%' || :SearchValue || '%'";
break;
case "1": // 线体
sql += " AND DA.DAA020 LIKE '%' || :SearchValue || '%'";
break;
default:
return (new List(), 0);
}
}
sql += " ORDER BY A.CREATE_TIME DESC";
var data = db.SqlQueryable(sql)
.AddParameters(new { SearchValue = $"%{queryObj.SearchValue}%" })
.ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
return (data, totalCount);
}
///
/// 提交检验(调用存储过程生成首检单)
///
/// 工单ID
/// 用户账号
///
public (bool success, string message) SubmitInspection(decimal workOrderId, string userNo)
{
var db = SqlSugarHelper.GetInstance();
try
{
// 定义存储过程参数
var pId = new SugarParameter("P_ID", workOrderId);
var pUser = new SugarParameter("P_USER", userNo);
var pIsh = new SugarParameter("P_ISH", 0); // 0表示首检
var pFlag = new SugarParameter("P_FLAG", null, true) { Direction = System.Data.ParameterDirection.Output };
var pText = new SugarParameter("P_TEXT", null, true)
{
Direction = System.Data.ParameterDirection.Output,
Size = 255
};
// 调用存储过程
db.Ado.UseStoredProcedure().ExecuteCommand(
"PRC_SJ_GENERATE",
pId, pUser, pIsh, pFlag, pText
);
// 获取输出参数
var flag = pFlag.Value != null ? Convert.ToInt32(pFlag.Value) : 1;
var text = pText.Value?.ToString() ?? "未知错误";
if (flag == 0)
{
return (true, text);
}
else
{
return (false, text);
}
}
catch (Exception ex)
{
return (false, $"提交检验失败: {ex.Message}");
}
}
}