zyf
2025-06-18 91489875fc8c9fd2b44c3791ca6f67dcf559675f
MES.Service/service/QC/RKJService.cs
@@ -1,4 +1,5 @@
using MES.Service.DB;
using Masuit.Tools.Models;
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Modes;
using MES.Service.util;
@@ -57,11 +58,10 @@
    public List<RkDaa002> GetDaa001s(string lineNo)
    {
        var db = SqlSugarHelper.GetInstance();
        // return db.Queryable<RKJDaa001>()
        //     .Where(t => t.LineNo == lineNo)
        //     .OrderBy(t => t.BillNo, OrderByType.Desc)
        //     .ToList();
        return null;
        return db.Queryable<RkDaa002>()
            .Where(t => lineNo.Contains(t.Daa020))
            .OrderBy(t => t.BillNo, OrderByType.Desc)
            .ToList();
    }
    //根据检验标准来计算检验个数
@@ -106,31 +106,37 @@
            string LEV = null;
            switch (item.FcheckLevel)
            {
                case string s when s.Contains("S1"):
                case null:
                    LEV = ""; // 默认值
                    break;
                case { } s when s.Contains("S1"):
                    LEV = "B.FLEVEL_S1";
                    break;
                case string s when s.Contains("S2"):
                case { } s when s.Contains("S2"):
                    LEV = "B.FLEVEL_S2";
                    break;
                case string s when s.Contains("S3"):
                case { } s when s.Contains("S3"):
                    LEV = "B.FLEVEL_S3";
                    break;
                case string s when s.Contains("S4"):
                case { } s when s.Contains("S4"):
                    LEV = "B.FLEVEL_S4";
                    break;
                case string s when s.Contains("(I)"):
                case { } s when s.Contains("(I)"):
                    LEV = "B.FLEVEL_I";
                    break;
                case string s when s.Contains("(II)"):
                case { } s when s.Contains("(II)"):
                    LEV = "B.FLEVEL_II";
                    break;
                case string s when s.Contains("(III)"):
                case { } s when s.Contains("(III)"):
                    LEV = "B.FLEVEL_III";
                    break;
                default:
                    LEV = ""; // 默认值
                    break;
            }
            if (string.IsNullOrEmpty(LEV))
                throw new Exception(item.QsCode + "下的检验水平维护的不正确");
            var sql =
                "SELECT " + LEV +
@@ -140,9 +146,15 @@
            var maxBillNo = db.Ado.SqlQuerySingle<string>(sql);
            if (string.IsNullOrEmpty(maxBillNo))
                throw new Exception(
                    item.QsCode + "下没有" + quantity + "这个范围的抽样基准");
            var result = ExtractSubstring(item.FacLevel, '(', ')');
            if (string.IsNullOrEmpty(result))
                throw new Exception(item.QsCode +
                                    "维护的接收水平不正确,应该是0.010---(AQL_0_0010)这样");
            sql = "SELECT FSAMPLE_SIZE_WORD, " + result +
                  " Result FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL3 C ON C.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO= '" +
@@ -302,6 +314,22 @@
    public int SetQSItemDetail(QsItemOqcItemDetail detail)
    {
        var db = SqlSugarHelper.GetInstance();
        var qsItemOqcReq = db.Queryable<QsItemOqcReq>()
            .Where(o => o.Id == detail.Gid)
            .First();
        if (qsItemOqcReq == null)
        {
            throw new Exception("该检验单不存在,请回到入库检列表重新查看");
        }
        if (!string.IsNullOrEmpty(qsItemOqcReq.FcheckResu))
        {
            throw new Exception("该检验单已" + qsItemOqcReq.FcheckResu + ",不允许修改结果");
        }
        var oracle = SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            List<QsItemOqcItemDetail> result = new();
@@ -402,11 +430,135 @@
                .ExecuteCommand();
        });
        if (FcheckResu.Equals("不合格"))
            //自动生成入库检异常对策
            saveDetect02(detail.Gid, detail.CreateBy);
        // if (FcheckResu.Equals("不合格"))
        //     //自动生成入库检异常对策
        //     saveDetect02(detail.Gid, detail.CreateBy);
        setBarCodes(FcheckResu, detail, db);
        return useTransactionWithOracle;
    }
    /// <summary>
    ///  当检验单不合格时,
    /// 取消mes_inv_item_barcodes 的报工标识 WORK_FLG
    /// womdaa 已生产量 DAA011加回条码报工数量
    /// MES_SCGD_GX 检验标识 CHECK_FLAG,('√','×')
    /// 通过mes_inv_item_in_c_details2的MES_SCGD_GX_ID连接
    ///
    /// 20250602更新 现在不合格不会更新工单生产数量,合格会增加对应工单生产数量
    ///</summary>
    private void setBarCodes(string? FcheckResu, QsItemOqcItemDetail detail,
        SqlSugarClient db)
    {
        var oqcReqList = db.Queryable<QsItemOqcReq, MesInvItemIns, Womdaa>(
                (a, b, c) =>
                    new JoinQueryInfos(
                        JoinType.Left, a.BillNo == b.BillNo,
                        JoinType.Left, c.Daa001 == b.RbillNo
                    ))
            .Where(a => a.Id == detail.Gid)
            .Select((a, b, c) =>
                new
                {
                    a.Id, a.BillNo, c.Daa001
                })
            .ToList();
        if (oqcReqList.Count <= 0)
        {
            return;
        }
        var qsItemOqcReq = oqcReqList.First(); // 获取第一个元素
        if (qsItemOqcReq.Id is null or 0) return;
        var mesInvItemInsList = db
            .Queryable<MesInvItemIns, MesInvItemInCDetails2>((a, b) =>
                new JoinQueryInfos(
                    JoinType.Left, a.Id == b.ItemInId))
            .Where((a, b) => a.BillNo == qsItemOqcReq.BillNo)
            .Select((a, b) => new
                { b.ItemBarcode, b.Quantity, b.MesScgdGxId })
            .ToList();
        var barCodes = mesInvItemInsList.Select(s => s.ItemBarcode).ToList();
        var count = db.Queryable<MesInvItemBarcodes>()
            .Where(s => barCodes.Contains(s.ItemBarcode))
            .Count();
        var gxId = mesInvItemInsList.Select(s => s.MesScgdGxId).ToList();
        var sumQty = mesInvItemInsList.Sum(s => s.Quantity);
        if ("合格".Equals(FcheckResu))
        {
            //根据工序id更新工序表的检验结果
            db.Updateable<MesScgdGx>()
                .SetColumns(s => s.CheckFlag == "√")
                .Where(s => gxId.Contains(s.Id))
                .ExecuteCommand();
            if (count <= 0) return;
            //更新mes_inv_item_barcodes 的报工标识 WORK_FLG 使用条码
            var executeCommand = db.Updateable<MesInvItemBarcodes>()
                .SetColumns(a => a.WorkFlg == 1)
                .Where(a => barCodes.Contains(a.ItemBarcode))
                .ExecuteCommand();
            if (executeCommand > 0)
            {
                //womdaa 已生产量 DAA011加上条码报工数量
                db.Updateable<Womdaa>()
                    .SetColumns(b => b.Daa011 == SqlFunc.IsNull(b.Daa011, 0) + sumQty)
                    .Where(b => b.Daa001 == qsItemOqcReq.Daa001)
                    .ExecuteCommand();
                //判断是否完工
                var complete = db.Queryable<Womdaa>()
                            .Where(a => a.Daa008 == a.Daa011 && a.Daa001== qsItemOqcReq.Daa001)
                            .Count();
                var WqtQty = db.Queryable<Womdab>()
                            .Where(a => a.Dab001 == qsItemOqcReq.Daa001)
                            .Sum(a => a.Dab006- SqlFunc.IsNull(a.Dab007, 0));
                if (complete > 0 && WqtQty == 0)  //齐套且工单生产数量=工单数量,工单更改为完工
                {
                    db.Updateable<Womdaa>()
                    .SetColumns(b => b.Daa018 == "完工")
                    .SetColumns(b => b.Daa017 == DateTime.Now)
                    .Where(b => b.Daa001 == qsItemOqcReq.Daa001)
                    .ExecuteCommand();
                }
            }
        }
        else if ("不合格".Equals(FcheckResu))
        {
            //根据工序id更新工序表的检验结果
            db.Updateable<MesScgdGx>()
                .SetColumns(s => s.CheckFlag == "×")
                .Where(s => gxId.Contains(s.Id))
                .ExecuteCommand();
            //取消mes_inv_item_barcodes 的报工标识 WORK_FLG 使用条码
            var executeCommand = db.Updateable<MesInvItemBarcodes>()
                .SetColumns(a => a.WorkFlg == 0)
                .Where(a => barCodes.Contains(a.ItemBarcode))
                .ExecuteCommand();
            /*if (executeCommand > 0)
            {
                //womdaa 已生产量 DAA011扣除条码报工数量
                db.Updateable<Womdaa>()
                    .SetColumns(b => b.Daa011 == b.Daa011 - sumQty)
                    .Where(b => b.Daa001 == qsItemOqcReq.Daa001)
                    .ExecuteCommand();
            }*/
        }
    }
    public int saveDetect02(decimal? gid, string? createBy)
@@ -454,26 +606,58 @@
    }
    public List<QsItemOqcReq> getPage(XJPageResult queryObj)
    public (List<QsItemOqcReq> items, int TotalCount) getPage(
        XJPageResult queryObj)
    {
        var db = SqlSugarHelper.GetInstance();
        return db
            .Queryable<QsItemOqcReq, Womdaa, MesItems, MesInvItemIns, Womdab,
                MesInvTransaction, RKJDaa001>(
                (a, da, b, c, d, ca, m) => new JoinQueryInfos(
                    JoinType.Left, da.Daa001 == a.BillNo,
                    JoinType.Left, a.ItemId == b.Id,
        var totalCount = 0;
        string[]? lineNo = null;
        if (StringUtil.IsNotNullOrEmpty(queryObj.createUser))
            lineNo = _baseService.getUserLineNo(queryObj.createUser);
        var qsItemOqcReqs = db
            .Queryable<QsItemOqcReq, MesItems, MesInvItemIns, MesInvTransaction,
                RKJDaa001, Womdaa, VLineUser,MesDeptUser, Womcaa, ExZzCaaFiled>(
                (a, b, c, ca, m, da, z,d, caa,zf) => new JoinQueryInfos(
                    JoinType.Left, a.ItemNo == b.ItemNo,
                    JoinType.Left, a.BillNo == c.BillNo,
                    JoinType.Left, c.CbillNo == d.Dab001,
                    JoinType.Left,
                    c.TransctionNo == ca.TransactionNo.ToString() &&
                    c.Company == ca.Company && c.Factory == ca.Factory,
                    JoinType.Left, c.Id == m.ItemInId && a.ItemNo == m.ItemNo
                    c.Company == ca.Company &&
                    c.Factory == ca.Factory,
                    JoinType.Left, c.Id == m.ItemInId && a.ItemNo == m.ItemNo,
                    JoinType.Left, da.Daa001 == c.RbillNo,
                    JoinType.Left, da.Daa015 == z.LineNo,
                    JoinType.Left,c.Bgr == d.UserNo,
                    JoinType.Left, da.Daa021 == caa.Caa020,
                    JoinType.Left, caa.Erpid == zf.Erpid
                ))
            .Select((a, da, b, c, d, ca, m) => new QsItemOqcReq
            // .WhereIF(lineNo != null && lineNo.Length > 0,
            //     (a, b, c, ca, m, da) => lineNo.Contains(da.Daa015))
            .WhereIF(!"PL017".Equals(queryObj.createUser),
                (a, b, c, ca, m, da, z, d, caa, zf) => lineNo.Contains(da.Daa015))
            .WhereIF(!string.IsNullOrEmpty(queryObj.id),
                (a, b, c, ca, m, da, z, d, caa, zf) => a.Id.ToString() == queryObj.id)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                "未完成".Equals(queryObj.result),
                (a, b, c, ca, m, da, z, d, caa, zf) => a.FcheckResu == null)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                !"未完成".Equals(queryObj.result),
                (a, b, c, ca, m, da, z, d, caa, zf) => a.FcheckResu != null)
            //加筛选条件,根据供应商,物料编码,物料名称搜索
            //.WhereIF(queryObj.SearchValue!=null && queryObj.SearchValue!="", (a) => a.SuppName == queryObj.SearchValue|| a.ItemName == queryObj.SearchValue || a.ItemNo == queryObj.SearchValue )
            .WhereIF(queryObj.SearchValue != null && queryObj.SearchValue != "",
            (a, b, c, ca, m, da, z, d, caa, zf) => b.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())
            || a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower()))
            .Select((a, b, c, ca, m, da, z, d, caa, zf) => new QsItemOqcReq
            {
                BillNo = a.BillNo,
                Fsubmit = a.Fsubmit,
                Remarks = a.Remarks,
                Id = a.Id,
                CreateDate = a.CreateDate,
@@ -483,19 +667,21 @@
                FcheckBy = a.FcheckBy,
                FcheckDate = a.FcheckDate,
                ReleaseNo = a.ReleaseNo,
                // 添加其他字段
                // 如果在 QsItemOqcReq 中定义了额外字段,则需要将它们赋值
                // 例如:
                ItemName = b.ItemName,
                ItemModel = b.ItemModel,
                TaskNo = c.TaskNo,
                CbillNo = c.CbillNo,
                Dab001 = d.Dab001,
                Dab001 = m.LotNo,
                ItemInId = m.ItemInId,
                Daa015 = da.Daa015,
                LineNo = c.LineNo,
                Quantity = m.Quantity
            }).OrderBy(a => a.CreateDate, OrderByType.Desc)
            .ToPageList(queryObj.PageIndex, queryObj.Limit);
                Quantity = m.Quantity,
                Caa015 = caa.Caa015,
                cust = da.Cust == null ? zf.Cust : da.Cust,
                Bgr = d.UserName
            })
            .OrderBy(a => a.CreateDate, OrderByType.Desc)
            .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
        return (qsItemOqcReqs, totalCount);
    }
    //删除主表并且连级删除子表和孙表
@@ -558,6 +744,24 @@
    public int UpdateQSItemDetail(QsItemOqcItemDetail detail)
    {
        if (isRk(detail.ItemInId)) throw new Exception("已有条码入库,不允许修改检验结果");
        var db = SqlSugarHelper.GetInstance();
        var qsItemOqcReq = db.Queryable<QsItemOqcReq>()
            .Where(o => o.Id == detail.Gid)
            .First();
        if (qsItemOqcReq == null)
        {
            throw new Exception("该检验单不存在,请回到入库检列表重新查看");
        }
        if (!string.IsNullOrEmpty(qsItemOqcReq.FcheckResu))
        {
            throw new Exception("该检验单已" + qsItemOqcReq.FcheckResu + ",不允许修改结果");
        }
        var withOracle = SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcItemDetail>()
@@ -576,6 +780,14 @@
        withOracle += autoResult(detail);
        return withOracle;
    }
    //修改结果前验证是否入库
    private bool isRk(decimal? ItemInId)
    {
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<MesInvItemInCDetails>()
            .Where(s => s.ItemInId == ItemInId).Count() > 0;
    }
@@ -618,7 +830,7 @@
        });
    }
    public int saveItem(RKJDto rkjDto)
    public int saveItem(RKJDto rkjDto) //自动生成合格的检验项
    {
        var items = rkjDto.items;
        var userNo = rkjDto.userNo;
@@ -646,6 +858,158 @@
            SetQSItemDetail(detail);
        });
        //因为默认合格,在这里增加工单生产数量
        var db = SqlSugarHelper.GetInstance();
        var oqcReqList = db.Queryable<QsItemOqcReq, MesInvItemIns, Womdaa>(
               (a, b, c) =>
                   new JoinQueryInfos(
                       JoinType.Left, a.BillNo == b.BillNo,
                       JoinType.Left, c.Daa001 == b.RbillNo
               ))
           .Where(a => a.Id == rkjDto.gid)
           .Select((a, b, c) =>
               new
               {
                   a.Id,
                   a.BillNo,
                   c.Daa001
               })
           .First();
        if (oqcReqList.Id is null or 0) return 0;
        //查询检验数量
        var sumQty = db
            .Queryable<MesInvItemIns, MesInvItemInCDetails2>((a, b) =>
                new JoinQueryInfos(
                    JoinType.Left, a.Id == b.ItemInId))
            .Where((a, b) => a.BillNo == oqcReqList.BillNo)
            .Select((a, b) => new {b.Quantity })
            .MergeTable().Sum( a=> a.Quantity);
        /*
        //更新生产量
        db.Updateable<Womdaa>()
                    .SetColumns(b => b.Daa011 == SqlFunc.IsNull(b.Daa011, 0) + sumQty)
                    .Where(b => b.Daa001 == oqcReqList.Daa001)
                    .ExecuteCommand();
        //判断是否完工
        var complete = db.Queryable<Womdaa>()
                    .Where(a => a.Daa008 == a.Daa011 && a.Daa001 == oqcReqList.Daa001)
                    .Count();
        if (complete > 0)
        {
            db.Updateable<Womdaa>()
            .SetColumns(b => b.Daa018 == "完工")
            .Where(b => b.Daa001 == oqcReqList.Daa001)
            .ExecuteCommand();
        }
        */
        return Convert.ToInt32(rkjDto.gid);
    }
    public int cleanReqResult(RKJDto dto) //清除检验结果
    {
        if (isRk(dto.gid)) throw new Exception("已有条码入库,不允许清除检验结果");
        var db = SqlSugarHelper.GetInstance();
        //查询检验结果
        var oqcReqList = db.Queryable<QsItemOqcReq, MesInvItemIns, Womdaa>(
               (a, b, c) =>
                   new JoinQueryInfos(
                       JoinType.Left, a.BillNo == b.BillNo,
                       JoinType.Left, c.Daa001 == b.RbillNo
               ))
           .Where(a => a.Id == dto.gid)
           .Select((a, b, c) =>
               new
               {
                   a.FcheckResu,
                   a.Id,
                   a.BillNo,
                   c.Daa001
               })
           .First();
        if (oqcReqList.Id is null or 0) return 0;
        var FcheckResu = oqcReqList.FcheckResu; //检验结果
        //查询检验数量
        var mesInvItemInsList = db
            .Queryable<MesInvItemIns, MesInvItemInCDetails2>((a, b) =>
                new JoinQueryInfos(
                    JoinType.Left, a.Id == b.ItemInId))
            .Where((a, b) => a.BillNo == oqcReqList.BillNo)
            .Select((a, b) => new
            { b.ItemBarcode, b.Quantity, b.MesScgdGxId })
            .ToList();
        var barCodes = mesInvItemInsList.Select(s => s.ItemBarcode).ToList();
        var count = db.Queryable<MesInvItemBarcodes>()
            .Where(s => barCodes.Contains(s.ItemBarcode))
            .Count();
        var gxId = mesInvItemInsList.Select(s => s.MesScgdGxId).ToList();
        var sumQty = mesInvItemInsList.Sum(s => s.Quantity);
        //根据工序id更新工序表的检验结果
        db.Updateable<MesScgdGx>()
            .SetColumns(s => s.CheckFlag == "未检验")
            .Where(s => gxId.Contains(s.Id))
            .ExecuteCommand();
        if (count <= 0) return 0;
        //更新mes_inv_item_barcodes 的报工标识 WORK_FLG 为已报工(主要是针对不合格的检验结果)
        var executeCommand = db.Updateable<MesInvItemBarcodes>()
            .SetColumns(a => a.WorkFlg == 1)
            .Where(a => barCodes.Contains(a.ItemBarcode))
            .ExecuteCommand();
        if ("合格".Equals(FcheckResu)) //检验合格的则回退生产数量
        {
            //womdaa 已生产量 DAA011扣除条码报工数量
            db.Updateable<Womdaa>()
                .SetColumns(b => b.Daa011 == SqlFunc.IsNull(b.Daa011, 0) - sumQty)
                .Where(b => b.Daa001 == oqcReqList.Daa001)
                .ExecuteCommand();
            //工单状态更改为开工
            db.Updateable<Womdaa>()
                .SetColumns(b => b.Daa018 == "开工")
                .SetColumns(b => b.Daa017 == null)
                .Where(b => b.Daa001 == oqcReqList.Daa001)
                .ExecuteCommand();
        }
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcReq>()
                .SetColumns(s => s.FcheckResu == null)
                .Where(s => s.Id == dto.gid).ExecuteCommand();
        });
    }
    private bool isRk(int? gid)
    {
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<QsItemOqcReq, MesInvItemIns, MesInvItemInCDetails2,MesInvItemStocks>(
                (a, b, c,d) => new JoinQueryInfos(
                    JoinType.Inner, a.BillNo == b.BillNo,
                    JoinType.Inner, b.Id == c.ItemInId,
                    JoinType.Inner,c.ItemBarcode == d.ItemBarcode
                ))
            .Where((a, b, c,d) => a.Id == gid)
            .Count() > 0;
    }
}