zjh
2025-11-12 2914a3a86ce976e5b397ee41bd1553e45fe68831
产线提交代码上传
已修改1个文件
已添加3个文件
580 ■■■■■ 文件已修改
StandardPda/MES.Service/Dto/service/ProductionLineDot.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardPda/MES.Service/MES.Service.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardPda/MES.Service/service/QC/ProductionLineService.cs 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardPda/MESApplication/Controllers/QC/ProductionLineController.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardPda/MES.Service/Dto/service/ProductionLineDot.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#region DTO ç±»å®šä¹‰
namespace MES.Service.Dto.service;
/// <summary>
/// äº§çº¿æäº¤æŸ¥è¯¢å‚æ•°
/// </summary>
public class ProductionLineQueryDto
{
    public int PageIndex { get; set; } = 1;
    public int Limit { get; set; } = 20;
    public string StatusUser { get; set; }
    public int Status { get; set; }  // 0: æœªæäº¤, 1: å·²æäº¤
    public string SearchValue { get; set; }
}
/// <summary>
/// äº§çº¿æäº¤åˆ†é¡µç»“æžœ
/// </summary>
public class ProductionLinePageResult
{
    public decimal? ID { get; set; }
    public string DAA001 { get; set; }
    public string ItemNo { get; set; }
    public string DAA003 { get; set; }
    public string DAA004 { get; set; }
    public decimal? DAA008 { get; set; }
    public string DAA018 { get; set; }
    public string? DaA019 { get; set; }
    public string Line { get; set; }
    public DateTime? DAA024 { get; set; }
    public string BillNo { get; set; }
    public string Result { get; set; }
    public string StatusUser { get; set; }
    public DateTime? CreateTime { get; set; }
    public decimal? InspectionId { get; set; }
    public string? Pbaid { get; set; }
    public string ProjecT_CODE { get; set; }
    public string FName { get; set; }
    public int Urgent { get; set; }
    public int IsFirst { get; set; }
    public int SortOrder { get; set; }
}
public class WorkOrderQueryResult
{
    public decimal? ID { get; set; }
    public string DAA001 { get; set; }
    public string ItemNo { get; set; }
    public string DAA003 { get; set; }
    public string DAA004 { get; set; }
    public decimal? DAA008 { get; set; }
    public string DAA018 { get; set; }
    public string DaA019 { get; set; }    // æ”¹ä¸º string
    public string Line { get; set; }
    public DateTime? DAA024 { get; set; }
    public string Pbaid { get; set; }     // æ”¹ä¸º string
    public string ProjecT_CODE { get; set; }
    public string FName { get; set; }
    public int Urgent { get; set; }
    public int IsFirst { get; set; }
    public string BillNo { get; set; }
    public string Result { get; set; }
    public string StatusUser { get; set; }
    public DateTime? CreateTime { get; set; }
    public decimal? InspectionId { get; set; }
}
/// <summary>
/// æ£€éªŒç»“æžœDTO
/// </summary>
public class InspectionResultDto
{
    public decimal? ID { get; set; }
    public decimal Pbaid { get; set; }
    public string BillNo { get; set; }
    public string StatusUser { get; set; }
    public DateTime? CreateTime { get; set; }
    public string Result { get; set; }
}
#endregion
StandardPda/MES.Service/MES.Service.csproj
@@ -7,6 +7,10 @@
    </PropertyGroup>
    <ItemGroup>
      <Compile Remove="service\QC\ProductionLineController.cs" />
    </ItemGroup>
    <ItemGroup>
        <PackageReference Include="Masuit.Tools.Core" Version="2024.3.4"/>
        <PackageReference Include="RestSharp" Version="112.1.0"/>
        <PackageReference Include="SqlSugarCore" Version="5.1.4.158"/>
StandardPda/MES.Service/service/QC/ProductionLineService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,398 @@
using Masuit.Tools;
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.util;
using SqlSugar;
namespace MES.Service.service.QC;
/// <summary>
/// äº§çº¿æäº¤æœåŠ¡
/// </summary>
public class ProductionLineService
{
    private readonly BaseService _baseService = new();
    /// <summary>
    /// èŽ·å–äº§çº¿æäº¤é¡µé¢æ•°æ®ï¼ˆæœªæäº¤/已提交)
    /// </summary>
    /// <param name="queryObj">查询参数</param>
    /// <returns></returns>
    public (List<ProductionLinePageResult> item, int TotalCount) GetProductionLinePage(ProductionLineQueryDto queryObj)
    {
        var db = SqlSugarHelper.GetInstance();
        if (queryObj.Status == 0)
        {
            // æœªæäº¤é¡µé¢æŸ¥è¯¢
            return GetUnsubmittedData(queryObj, db);
        }
        else
        {
            // å·²æäº¤é¡µé¢æŸ¥è¯¢
            return GetSubmittedData(queryObj, db);
        }
    }
    /// <summary>
    /// èŽ·å–æœªæäº¤æ•°æ®ï¼ˆä»Žå·¥å•è¡¨æŸ¥è¯¢ï¼ŒåŒ…å«ä¸åˆæ ¼çš„é¦–æ£€å•ï¼‰
    /// </summary>
    private (List<ProductionLinePageResult> 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 A.DAA002 LIKE :SearchValue)";
        }
        var workOrders = db.SqlQueryable<ProductionLinePageResult>(workOrderSql)
            .AddParameters(new { SearchValue = $"%{queryObj.SearchValue}%" })
            .ToList();
        if (!workOrders.Any())
        {
            return (new List<ProductionLinePageResult>(), 0);
        }
        // è½¬æ¢ä¸ºå­—符串用于IN查询
        var workOrderIdStrings = workOrders
            .Where(w => !string.IsNullOrEmpty(w.ID.ToString()))
            .Select(w => w.ID)
            .ToList();
        if (!workOrderIdStrings.Any())
        {
            return (new List<ProductionLinePageResult>(), 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<InspectionResultDto>(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);
    }
    /// <summary>
    /// èŽ·å–å·²æäº¤æ•°æ®ï¼ˆä»Žé¦–æ£€å•è¡¨æŸ¥è¯¢ï¼‰
    /// </summary>
    private (List<ProductionLinePageResult> 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 += " AND (A.BILL_NO LIKE :SearchValue OR DA.DAA001 LIKE :SearchValue OR DA.DAA002 LIKE :SearchValue)";
        }
        sql += " ORDER BY A.CREATE_TIME DESC";
        var data = db.SqlQueryable<ProductionLinePageResult>(sql)
            .AddParameters(new { SearchValue = $"%{queryObj.SearchValue}%" })
            .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
        return (data, totalCount);
    }
    /// <summary>
    /// æäº¤æ£€éªŒï¼ˆè°ƒç”¨å­˜å‚¨è¿‡ç¨‹ç”Ÿæˆé¦–检单)
    /// </summary>
    /// <param name="workOrderId">工单ID</param>
    /// <param name="userNo">用户账号</param>
    /// <returns></returns>
    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}");
        }
    }
}
StandardPda/MESApplication/Controllers/QC/ProductionLineController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Modes;
using MES.Service.service.QC;
using MES.Service.util;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using SqlSugar;
using System.Data;
using System.Dynamic;
namespace MESApplication.Controllers.QC;
/// <summary>
/// äº§çº¿æäº¤æŽ¥å£æŽ§åˆ¶å™¨
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class ProductionLineController : ControllerBase
{
    /// <summary>
    /// èŽ·å–äº§çº¿æäº¤é¡µé¢æ•°æ®
    /// </summary>
    [HttpPost("GetProductionLinePage")]
    public ResponseResult GetProductionLinePage([FromBody] ProductionLineQueryDto queryObj)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (item, totalCount) = new ProductionLineService().GetProductionLinePage(queryObj);
            resultInfos.tbBillList = item;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos,
                TotalCount = totalCount
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æäº¤æ£€éªŒï¼ˆç”Ÿæˆé¦–检单)
    /// </summary>
    [HttpPost("SubmitInspection")]
    public ResponseResult SubmitInspection([FromBody] JObject data)
    {
        try
        {
            var gid = data["gid"]?.ToString();
            var userNo = data["userNo"]?.ToString();
            if (string.IsNullOrEmpty(gid) || string.IsNullOrEmpty(userNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "参数错误:gid和userNo不能为空",
                    data = null
                };
            }
            var workOrderId = Convert.ToDecimal(gid);
            var (success, message) = new ProductionLineService().SubmitInspection(workOrderId, userNo);
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = success;
            return new ResponseResult
            {
                status = success ? 0 : 1,
                message = message,
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
}