xwt
2025-10-30 dabfdd9dbf0364b1134daaad86af7e13f6437295
XJ,SJ,RKJ检验项目序号,LLJ单个检验项目FTP附件信息
已修改13个文件
495 ■■■■ 文件已修改
StandardInterface/MES.Service/Dto/service/SJPageResult.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/service/XJPageResult.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QsItemIpiItem.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QsItemOqcItem.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QsQaItemXj01.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QC/BaseService.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QC/LljService.cs 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QC/RKJService.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QC/SJService.cs 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QC/XJService.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MESApplication/Controllers/QC/BaseController.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MESApplication/Controllers/QC/LljController.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MESApplication/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/service/SJPageResult.cs
@@ -114,4 +114,16 @@
    public string? searchField { get; set; }  // 搜索字段名
    [SugarColumn(IsIgnore = true)]
    public string? SearchValue { get; set; }  // 搜索值
    /// <summary>
    /// 车间ID,用于QC筛选
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? departmentId { get; set; }
    /// <summary>
    /// 线体ID,用于QC筛选
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? lineId { get; set; }
}
StandardInterface/MES.Service/Dto/service/XJPageResult.cs
@@ -25,5 +25,15 @@
    /// 搜索字段名,用于指定搜索哪个字段
    /// </summary>
    public string? searchField { get; set; }
    /// <summary>
    /// 车间ID,用于QC筛选
    /// </summary>
    public string? departmentId { get; set; }
    /// <summary>
    /// 线体ID,用于QC筛选
    /// </summary>
    public string? lineId { get; set; }
}
StandardInterface/MES.Service/Modes/QsItemIpiItem.cs
@@ -184,6 +184,13 @@
    [Column("SNUM")]
    [SugarColumn(ColumnName = "SNUM")]
    public decimal? Snum { get; set; }
    /// <summary>
    ///     顺序
    /// </summary>
    [Column("FORDER")]
    [SugarColumn(ColumnName = "FORDER")]
    public decimal? Forder { get; set; }
    /// <summary>
    ///     穴号信息(用于前端显示)
StandardInterface/MES.Service/Modes/QsItemOqcItem.cs
@@ -185,4 +185,11 @@
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     顺序
    /// </summary>
    [Column("FORDER")]
    [SugarColumn(ColumnName = "FORDER")]
    public decimal? Forder { get; set; }
}
StandardInterface/MES.Service/Modes/QsQaItemXj01.cs
@@ -168,4 +168,11 @@
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     顺序
    /// </summary>
    [Column("FORDER")]
    [SugarColumn(ColumnName = "FORDER")]
    public decimal? Forder { get; set; }
}
StandardInterface/MES.Service/service/QC/BaseService.cs
@@ -49,4 +49,81 @@
        });
        return mesQsImages;
    }
    /// <summary>
    /// 获取QC车间列表(根据视图 V_MES_QC_CJ)
    /// </summary>
    /// <returns>车间列表</returns>
    public List<dynamic> GetQCDepartments()
    {
        var db = SqlSugarHelper.GetInstance();
        var sql = @"
            SELECT
                T.DEPARTMENTNAME as departmentname,
                T.DEPARTMENTID as departmentid
            FROM SYS_DEPARTMENT T
            WHERE T.DEPARTMENTID IN (
                2951904,2951874,2973564,3131720,3252567,3306857,3335722,2306534,2670262,
                2365021,2365022,2749927,2306535,2558979,2558980,2558981,2558982,1606194,
                1608020,1608021,1606193,1608022,1638037,1682634,1802281,1802278,1802279,
                1802280,1999190,1999191,2272979,2513368,2513369,2513370,2513371,2558971,
                2558972,2558973,2558974,2558975,2558976,2558977,2749970,2749946,2749947,
                2749948,2670253,2670258,2670260,2513372,2513373,2513374,2513375,2513376,
                2670261,139517,139518,139519,209814,211639,221640,378794,440720,441918,
                441919,502188,507542,507545,507546,139524
            )
            ORDER BY T.DEPARTMENTNAME";
        return db.Ado.SqlQuery<dynamic>(sql);
    }
    /// <summary>
    /// 获取QC线体列表(根据车间ID筛选,基于视图 V_MES_QC_XT)
    /// </summary>
    /// <param name="departmentId">车间ID,如果为空则返回所有QC线体</param>
    /// <returns>线体列表</returns>
    public List<MesLine> GetQCLines(string? departmentId)
    {
        var db = SqlSugarHelper.GetInstance();
        if (string.IsNullOrEmpty(departmentId))
        {
            // 如果没有指定车间,返回所有QC线体
            var sql = @"
                SELECT E.LINE_NO as LineNo, E.LINE_NAME as LineName, E.DEPOT_ID as DepotId
                FROM MES_LINE E
                LEFT JOIN (
                    SELECT T.DEPARTMENTID
                    FROM SYS_DEPARTMENT T
                    WHERE T.DEPARTMENTID IN (
                        2951904,2951874,2973564,3131720,3252567,3306857,3335722,2306534,2670262,
                        2365021,2365022,2749927,2306535,2558979,2558980,2558981,2558982,1606194,
                        1608020,1608021,1606193,1608022,1638037,1682634,1802281,1802278,1802279,
                        1802280,1999190,1999191,2272979,2513368,2513369,2513370,2513371,2558971,
                        2558972,2558973,2558974,2558975,2558976,2558977,2749970,2749946,2749947,
                        2749948,2670253,2670258,2670260,2513372,2513373,2513374,2513375,2513376,
                        2670261,139517,139518,139519,209814,211639,221640,378794,440720,441918,
                        441919,502188,507542,507545,507546,139524
                    )
                ) C ON C.DEPARTMENTID = E.DEPOT_ID
                WHERE C.DEPARTMENTID IS NOT NULL
                ORDER BY E.LINE_NO DESC";
            return db.Ado.SqlQuery<MesLine>(sql);
        }
        else
        {
            // 如果指定了车间,只返回该车间下的线体
            return db.Queryable<MesLine>()
                .Where(e => e.DepotId.ToString() == departmentId)
                .OrderBy(e => e.LineNo, SqlSugar.OrderByType.Desc)
                .Select(e => new MesLine
                {
                    LineNo = e.LineNo,
                    LineName = e.LineName,
                    DepotId = e.DepotId
                })
                .ToList();
        }
    }
}
StandardInterface/MES.Service/service/QC/LljService.cs
@@ -89,7 +89,9 @@
                    // 添加评审状态
                    PSZT = a.PSZT,
                    // 添加检验项目维护状态
                    Jyxm = a.Jyxm
                    Jyxm = a.Jyxm,
                    // 添加版本号(用于FTP路径)
                    Fversion = a.Fversion
                })
                .OrderBy("IQC_DATE DESC")
                .OrderBy("CASE WHEN EMERGENCY = 1 THEN 0 ELSE 1 END")
@@ -164,7 +166,9 @@
                    // 添加评审状态
                    PSZT = a.PSZT,
                    // 添加检验项目维护状态
                    Jyxm = a.Jyxm
                    Jyxm = a.Jyxm,
                    // 添加版本号(用于FTP路径)
                    Fversion = a.Fversion
                })
                .OrderBy("IQC_DATE DESC")
                .OrderBy("CASE WHEN EMERGENCY = 1 THEN 0 ELSE 1 END")
@@ -504,7 +508,13 @@
        return input.Substring(startIndex + 1, length);
    }
    public List<QamftpDto> GetAttachments(string ItemNo)
    /// <summary>
    /// 获取附件信息
    /// </summary>
    /// <param name="ItemNo">物料编码</param>
    /// <param name="fversion">版本号(可选,用于过滤)</param>
    /// <returns>附件列表</returns>
    public List<QamftpDto> GetAttachments(string ItemNo, string fversion = null)
    {
        //if (string.IsNullOrEmpty(ItemNo))
        //{
@@ -514,8 +524,17 @@
        var db = SqlSugarHelper.GetInstance();
        try
        {
            return db.Queryable<MesQamftp>()
            var query = db.Queryable<MesQamftp>()
                .Where(x => x.ItemNo == ItemNo)
                .Where(x => x.Ftype == "来料检");  // 添加FTYPE = '来料检'的限制
            // 如果传入了fversion,则按Fversion过滤
            if (!string.IsNullOrEmpty(fversion))
            {
                query = query.Where(x => x.Fversion == fversion);
            }
            return query
                .OrderBy(x => x.Fdate, OrderByType.Desc)
                // .ThenBy(x => x.CreateDate, OrderByType.Desc)
                .Select(x => new QamftpDto
@@ -543,7 +562,7 @@
        }
    }
    public byte[] GetFtpFile(string itemNo, string fileName, string ftpServer)
    public byte[] GetFtpFile(string itemNo, string fileName, string ftpServer, string fversion = null)
    {
        // 参数验证
        if (string.IsNullOrEmpty(itemNo) || string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(ftpServer))
@@ -557,8 +576,16 @@
        // 标准化FTP服务器地址
        string normalizedServer = NormalizeFtpServer(ftpServer);
        
        // 构建FTP文件路径
        string ftpPath = $"{normalizedServer}/IQC/{itemNo}/{fileName}";
        // 构建FTP文件路径 - 来料检使用IQC目录,使用fversion作为子目录
        string ftpPath;
        if (!string.IsNullOrEmpty(fversion))
        {
            ftpPath = $"{normalizedServer}/IQC/{itemNo}/{fversion}/{fileName}";
        }
        else
        {
            ftpPath = $"{normalizedServer}/IQC/{itemNo}/{fileName}";
        }
        
        try
        {
StandardInterface/MES.Service/service/QC/RKJService.cs
@@ -291,7 +291,8 @@
                a.FcheckLevel,
                a.FacLevel,
                a.QsCode,
                a.QsName
                a.QsName,
                a.Forder
            }).Select((a, b) => new QsItemOqcItem
            {
                ProjName = a.ProjName,
@@ -308,10 +309,11 @@
                FacLevel = a.FacLevel,
                QsCode = a.QsCode,
                QsName = a.QsName,
                Forder = a.Forder,
                isCheck = SqlFunc.AggregateCount(b.Id),
                Result = SqlFunc.AggregateCount(b.Id) == 0 ? "未完成" :
                         a.IsPass == 1 ? "合格" : "不合格"
            }).OrderBy("result desc").ToList();
            }).OrderBy("FORDER").ToList();
    }
    public dynamic save(RKJDto rkjDto)
@@ -610,49 +612,55 @@
        return db
            .Queryable<QsItemOqcReq, Womdaa, MesItems>((a, da, b) =>
            .Queryable<QsItemOqcReq, Womdaa, MesItems, MesLine>((a, da, b, m) =>
                new JoinQueryInfos(
                    JoinType.Left, da.Daa001 == a.BillNo,
                    JoinType.Left, a.ItemId == b.Id
                    JoinType.Left, a.ItemId == b.Id,
                    JoinType.Left, da.Daa015 == m.LineNo
                ))
            .WhereIF(lineNo != null && lineNo.Length > 0,
                (a, da, b) => lineNo.Contains(da.Daa015))
                (a, da, b, m) => lineNo.Contains(da.Daa015))
            // 添加QC筛选条件:车间和线体
            .WhereIF(!string.IsNullOrEmpty(queryObj.departmentId),
                (a, da, b, m) => m.DepotId.ToString() == queryObj.departmentId)
            .WhereIF(!string.IsNullOrEmpty(queryObj.lineId),
                (a, da, b, m) => m.LineNo == queryObj.lineId)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                "未完成".Equals(queryObj.result),
                (a, da, b) => a.FcheckResu == null || a.FcheckResu == "")
                (a, da, b, m) => a.FcheckResu == null || a.FcheckResu == "")
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                !"未完成".Equals(queryObj.result),
                (a, da, b) => a.FcheckResu != null && a.FcheckResu != "")
            .WhereIF(id > 0, (a, da, b) => a.Id == id)
                (a, da, b, m) => a.FcheckResu != null && a.FcheckResu != "")
            .WhereIF(id > 0, (a, da, b, m) => a.Id == id)
            // 添加fsubmit字段过滤逻辑 - 只有在明确指定fsubmit参数时才过滤,且没有传递id时才过滤
            .WhereIF(
                id <= 0 && StringUtil.IsNotNullOrEmpty(queryObj.fsubmit) && queryObj.fsubmit == "1",
                (a, da, b) => a.Fsubmit == 1)
                (a, da, b, m) => a.Fsubmit == 1)
            .WhereIF(
                id <= 0 && StringUtil.IsNotNullOrEmpty(queryObj.fsubmit) && queryObj.fsubmit == "0",
                (a, da, b) => a.Fsubmit == 0 || a.Fsubmit == null)
                (a, da, b, m) => a.Fsubmit == 0 || a.Fsubmit == null)
            // 添加搜索条件 - 根据选择的搜索字段进行精确搜索
            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField) && queryObj.searchField == "billNo",  // 工单
                (a, da, b) => a.BillNo.Contains(queryObj.SearchValue))
                (a, da, b, m) => a.BillNo.Contains(queryObj.SearchValue))
            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField) && queryObj.searchField == "releaseNo",  // 检验单号
                (a, da, b) => a.ReleaseNo.Contains(queryObj.SearchValue))
                (a, da, b, m) => a.ReleaseNo.Contains(queryObj.SearchValue))
            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField) && queryObj.searchField == "daa015",  // 产线
                (a, da, b) => da.Daa015.Contains(queryObj.SearchValue))
                (a, da, b, m) => da.Daa015.Contains(queryObj.SearchValue))
            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField) && queryObj.searchField == "itemNo",  // 物料编码
                (a, da, b) => a.ItemNo.Contains(queryObj.SearchValue))
                (a, da, b, m) => a.ItemNo.Contains(queryObj.SearchValue))
            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField) && queryObj.searchField == "itemName",  // 物料名称
                (a, da, b) => b.ItemName.Contains(queryObj.SearchValue))
                (a, da, b, m) => b.ItemName.Contains(queryObj.SearchValue))
            // 为了兼容旧版本,如果没有传递 searchField,使用原来的查询逻辑
            .WhereIF(string.IsNullOrEmpty(queryObj.searchField) && !string.IsNullOrEmpty(queryObj.SearchValue),
                (a, da, b) =>
                (a, da, b, m) =>
                    a.ItemNo.Contains(queryObj.SearchValue) ||
                    b.ItemName.Contains(queryObj.SearchValue) ||
                    a.BillNo.Contains(queryObj.SearchValue) ||
                    a.ReleaseNo.Contains(queryObj.SearchValue) ||
                    da.Daa015.Contains(queryObj.SearchValue))
            .Select((a, da, b) => new QsItemOqcReq
            .Select((a, da, b, m) => new QsItemOqcReq
            {
                Id = a.Id,
                ReleaseNo = a.ReleaseNo,
StandardInterface/MES.Service/service/QC/SJService.cs
@@ -44,69 +44,145 @@
        if (StringUtil.IsNotNullOrEmpty(queryObj.StatusUser))
            lineNo = _baseService.getUserLineNo(queryObj.StatusUser);
        var query = db.Queryable<SJPageResult>()
            .WhereIF(lineNo != null && lineNo.Length > 0,
                a => lineNo.Contains(a.line))
            .WhereIF(queryObj.Id != null, a => a.Id == queryObj.Id)
            .WhereIF(StringUtil.IsNotNullOrEmpty(queryObj.BillNo),
                a => a.BillNo == queryObj.BillNo)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                "未完成".Equals(queryObj.Result),
                a => a.Fsubmit == 0)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                !"未完成".Equals(queryObj.Result),
                a => a.Fsubmit == 1);
        // 新增的动态搜索逻辑
        if (!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField))
        // 如果有车间或线体筛选,需要联接 MES_LINE 表
        if (!string.IsNullOrEmpty(queryObj.departmentId) || !string.IsNullOrEmpty(queryObj.lineId))
        {
            switch (queryObj.searchField)
            var query = db.Queryable<SJPageResult, MesLine>((a, m) =>
                    new JoinQueryInfos(JoinType.Left, a.line == m.LineNo))
                .WhereIF(lineNo != null && lineNo.Length > 0,
                    (a, m) => lineNo.Contains(a.line))
                .WhereIF(queryObj.Id != null, (a, m) => a.Id == queryObj.Id)
                .WhereIF(StringUtil.IsNotNullOrEmpty(queryObj.BillNo),
                    (a, m) => a.BillNo == queryObj.BillNo)
                .WhereIF(
                    StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                    "未完成".Equals(queryObj.Result),
                    (a, m) => a.Fsubmit == 0)
                .WhereIF(
                    StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                    !"未完成".Equals(queryObj.Result),
                    (a, m) => a.Fsubmit == 1)
                // 添加车间筛选
                .WhereIF(!string.IsNullOrEmpty(queryObj.departmentId),
                    (a, m) => m.DepotId.ToString() == queryObj.departmentId)
                // 添加线体筛选
                .WhereIF(!string.IsNullOrEmpty(queryObj.lineId),
                    (a, m) => m.LineNo == queryObj.lineId);
            // 添加搜索条件
            if (!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField))
            {
                case "daa001":  // 工单
                    query = query.Where(x => x.daa001.Contains(queryObj.SearchValue));
                    break;
                case "billNo":  // 检验单号
                    query = query.Where(x => x.BillNo.Contains(queryObj.SearchValue));
                    break;
                case "line":    // 产线
                    query = query.Where(x => x.line.Contains(queryObj.SearchValue));
                    break;
                case "itemNo":  // 物料编码
                    query = query.Where(x => x.ItemNo.Contains(queryObj.SearchValue));
                    break;
                case "daa003":  // 物料名称
                    query = query.Where(x => x.Daa003.Contains(queryObj.SearchValue));
                    break;
                default:
                    // 如果没有指定字段或字段不匹配,使用原有的模糊查询逻辑作为兜底方案
                    query = query.Where(x =>
                        x.ItemNo.Contains(queryObj.SearchValue) ||
                        x.Daa003.Contains(queryObj.SearchValue) ||
                        x.daa001.Contains(queryObj.SearchValue) ||
                        x.BillNo.Contains(queryObj.SearchValue) ||
                        x.line.Contains(queryObj.SearchValue));
                    break;
                switch (queryObj.searchField)
                {
                    case "daa001":  // 工单
                        query = query.Where((a, m) => a.daa001.Contains(queryObj.SearchValue));
                        break;
                    case "billNo":  // 检验单号
                        query = query.Where((a, m) => a.BillNo.Contains(queryObj.SearchValue));
                        break;
                    case "line":    // 产线
                        query = query.Where((a, m) => a.line.Contains(queryObj.SearchValue));
                        break;
                    case "itemNo":  // 物料编码
                        query = query.Where((a, m) => a.ItemNo.Contains(queryObj.SearchValue));
                        break;
                    case "daa003":  // 物料名称
                        query = query.Where((a, m) => a.Daa003.Contains(queryObj.SearchValue));
                        break;
                    default:
                        query = query.Where((a, m) =>
                            a.ItemNo.Contains(queryObj.SearchValue) ||
                            a.Daa003.Contains(queryObj.SearchValue) ||
                            a.daa001.Contains(queryObj.SearchValue) ||
                            a.BillNo.Contains(queryObj.SearchValue) ||
                            a.line.Contains(queryObj.SearchValue));
                        break;
                }
            }
            else if (string.IsNullOrEmpty(queryObj.searchField) && !string.IsNullOrEmpty(queryObj.SearchValue))
            {
                query = query.Where((a, m) =>
                    a.ItemNo.Contains(queryObj.SearchValue) ||
                    a.Daa003.Contains(queryObj.SearchValue) ||
                    a.daa001.Contains(queryObj.SearchValue) ||
                    a.BillNo.Contains(queryObj.SearchValue) ||
                    a.line.Contains(queryObj.SearchValue));
            }
            var totalCount = 0;
            var data = query.OrderBy((a, m) => a.BillNo, OrderByType.Desc)
                .Select((a, m) => a)
                .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
            return (data, totalCount);
        }
        // 为了兼容旧版本,如果没有传递 searchField,使用原来的查询逻辑
        else if (string.IsNullOrEmpty(queryObj.searchField) && !string.IsNullOrEmpty(queryObj.SearchValue))
        else
        {
            // 保持原有的多字段模糊查询逻辑
            query = query.Where(x =>
                x.ItemNo.Contains(queryObj.SearchValue) ||
                x.Daa003.Contains(queryObj.SearchValue) ||
                x.daa001.Contains(queryObj.SearchValue) ||
                x.BillNo.Contains(queryObj.SearchValue) ||
                x.line.Contains(queryObj.SearchValue));
            // 没有车间和线体筛选时,使用原来的查询逻辑
            var query = db.Queryable<SJPageResult>()
                .WhereIF(lineNo != null && lineNo.Length > 0,
                    a => lineNo.Contains(a.line))
                .WhereIF(queryObj.Id != null, a => a.Id == queryObj.Id)
                .WhereIF(StringUtil.IsNotNullOrEmpty(queryObj.BillNo),
                    a => a.BillNo == queryObj.BillNo)
                .WhereIF(
                    StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                    "未完成".Equals(queryObj.Result),
                    a => a.Fsubmit == 0)
                .WhereIF(
                    StringUtil.IsNotNullOrEmpty(queryObj.Result) &&
                    !"未完成".Equals(queryObj.Result),
                    a => a.Fsubmit == 1);
            // 新增的动态搜索逻辑
            if (!string.IsNullOrEmpty(queryObj.SearchValue) && !string.IsNullOrEmpty(queryObj.searchField))
            {
                switch (queryObj.searchField)
                {
                    case "daa001":  // 工单
                        query = query.Where(x => x.daa001.Contains(queryObj.SearchValue));
                        break;
                    case "billNo":  // 检验单号
                        query = query.Where(x => x.BillNo.Contains(queryObj.SearchValue));
                        break;
                    case "line":    // 产线
                        query = query.Where(x => x.line.Contains(queryObj.SearchValue));
                        break;
                    case "itemNo":  // 物料编码
                        query = query.Where(x => x.ItemNo.Contains(queryObj.SearchValue));
                        break;
                    case "daa003":  // 物料名称
                        query = query.Where(x => x.Daa003.Contains(queryObj.SearchValue));
                        break;
                    default:
                        // 如果没有指定字段或字段不匹配,使用原有的模糊查询逻辑作为兜底方案
                        query = query.Where(x =>
                            x.ItemNo.Contains(queryObj.SearchValue) ||
                            x.Daa003.Contains(queryObj.SearchValue) ||
                            x.daa001.Contains(queryObj.SearchValue) ||
                            x.BillNo.Contains(queryObj.SearchValue) ||
                            x.line.Contains(queryObj.SearchValue));
                        break;
                }
            }
            // 为了兼容旧版本,如果没有传递 searchField,使用原来的查询逻辑
            else if (string.IsNullOrEmpty(queryObj.searchField) && !string.IsNullOrEmpty(queryObj.SearchValue))
            {
                // 保持原有的多字段模糊查询逻辑
                query = query.Where(x =>
                    x.ItemNo.Contains(queryObj.SearchValue) ||
                    x.Daa003.Contains(queryObj.SearchValue) ||
                    x.daa001.Contains(queryObj.SearchValue) ||
                    x.BillNo.Contains(queryObj.SearchValue) ||
                    x.line.Contains(queryObj.SearchValue));
            }
            var totalCount = 0;
            var data = query.OrderBy(a => a.BillNo, OrderByType.Desc)
                .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
            return (data, totalCount);
        }
        var totalCount = 0;
        var data = query.OrderBy(a => a.BillNo, OrderByType.Desc)
            .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
        return (data, totalCount);
    }
@@ -208,7 +284,8 @@
                Mnum = b.Mnum,  // 从主表获取MNUM
                Dnum = b.Dnum,  // 从子表获取DNUM
                Snum = a.Snum,  // 送检批数
                Remarks = a.Remarks
                Remarks = a.Remarks,
                Forder = a.Forder  // 顺序字段
            }).ToList();
        var array = qsItemIpiItems.Select(s => s.Id).ToArray();
@@ -300,8 +377,10 @@
                qsItemIpiItem.imageData = Convert.ToBase64String(s.Picture);
            });
        //排序,未完成的排在前面
        qsItemIpiItems = qsItemIpiItems.OrderBy(s => s.isCheck).ToList();
        //排序:只按FORDER顺序排序
        qsItemIpiItems = qsItemIpiItems
            .OrderBy(s => s.Forder ?? 0)
            .ToList();
        // 为每个检验项目生成穴号信息
        qsItemIpiItems.ForEach(item =>
StandardInterface/MES.Service/service/QC/XJService.cs
@@ -153,10 +153,23 @@
                )
            );
            
        // 添加线体筛选条件
        // 添加线体筛选条件(基于用户权限)
        if (lineNo != null && lineNo.Length > 0)
        {
            query = query.Where((s, a, c, b) => lineNo.Contains(c.LineNo));
        }
        // 添加QC筛选条件:车间和线体
        if (!string.IsNullOrEmpty(queryObj.departmentId))
        {
            // 如果指定了车间,筛选该车间下的线体
            query = query.Where((s, a, c, b) => c.DepotId.ToString() == queryObj.departmentId);
        }
        if (!string.IsNullOrEmpty(queryObj.lineId))
        {
            // 如果指定了线体,直接筛选线体
            query = query.Where((s, a, c, b) => c.LineNo == queryObj.lineId);
        }
        
        // 添加状态筛选条件 - 明确匹配前端传递的值
@@ -287,6 +300,7 @@
        var qsQaItemXj01s = db.Queryable<QsQaItemXj01>()
            .WhereIF(pid > 0, a => a.Pid == pid)
            .WhereIF(id > 0, a => a.Id == id)
            .OrderBy(a => a.Forder ?? 0)
            .ToList();
        var array = qsQaItemXj01s.Select(s => s.Id).ToArray();
@@ -323,8 +337,10 @@
                s.imageData = Convert.ToBase64String(s.Picture);
        });
        //排序,未完成的排在前面
        qsQaItemXj01s = qsQaItemXj01s.OrderBy(s => s.isCheck).ToList();
        //排序:只按FORDER顺序排序
        qsQaItemXj01s = qsQaItemXj01s
            .OrderBy(s => s.Forder ?? 0)
            .ToList();
        return qsQaItemXj01s;
    }
StandardInterface/MESApplication/Controllers/QC/BaseController.cs
@@ -81,4 +81,52 @@
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// 获取QC车间列表
    /// </summary>
    /// <returns>车间列表</returns>
    [HttpPost("GetQCDepartments")]
    public ResponseResult GetQCDepartments()
    {
        try
        {
            var departments = new BaseService().GetQCDepartments();
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = departments
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// 获取QC线体列表(根据车间ID筛选)
    /// </summary>
    /// <param name="data">包含 departmentId 的请求数据</param>
    /// <returns>线体列表</returns>
    [HttpPost("GetQCLines")]
    public ResponseResult GetQCLines([FromBody] JObject data)
    {
        try
        {
            string? departmentId = data["departmentId"]?.ToString();
            var lines = new BaseService().GetQCLines(departmentId);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = lines
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
}
StandardInterface/MESApplication/Controllers/QC/LljController.cs
@@ -366,10 +366,21 @@
    public ResponseResult GetAttachments([FromBody] JObject data)
    {
        var itemNo = data["itemNo"]?.ToString();
        var fversion = data["fversion"]?.ToString();
        var fromPage = data["fromPage"]?.ToString();
        // 根据来源页面决定是否过滤
        string filterFversion = null;
        if (fromPage == "Detail" && !string.IsNullOrEmpty(fversion))
        {
            filterFversion = fversion;  // Detail页面需要过滤
        }
        // Add页面不传递filterFversion,显示所有附件
        try
        {
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            var tbBillList = new LljService().GetAttachments(itemNo);
            var tbBillList = new LljService().GetAttachments(itemNo, filterFversion);
            if (tbBillList == null || tbBillList.Count == 0)
            {
                return new ResponseResult
@@ -394,7 +405,7 @@
    }
    [HttpGet("PreviewFtpFile")]
    public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string fversion = null)
    {
        try
        {
@@ -405,7 +416,7 @@
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Type, Content-Length");
            
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer, fversion);
            
            if (fileBytes == null || fileBytes.Length == 0)
            {
@@ -424,7 +435,7 @@
    }
    [HttpGet("DownloadFtpFile")]
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string fversion = null)
    {
        try
        {
@@ -435,7 +446,7 @@
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition, Content-Length, Content-Type");
            
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer, fversion);
            
            if (fileBytes == null || fileBytes.Length == 0)
            {
StandardInterface/MESApplication/appsettings.json
@@ -10,6 +10,6 @@
  "AppSettings": {
    "TestErpUrl": "http://192.168.11.120:8098/WebService1.asmx/mesToErpinfo",
    "ProductionErpUrl": "http://192.168.11.120:8098/WebService1.asmx/mesToErpinfoFormal",
    "DataBaseConn": "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.22)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ORCL))); Persist Security Info=True;User ID = hm_prd; Password=hmprd"
    "DataBaseConn": "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.22)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ORCL))); Persist Security Info=True;User ID = test_dev; Password=hmprd"
  }
}