StandardPda/MES.Service/service/QC/RKJService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,852 @@
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Modes;
using MES.Service.util;
using SqlSugar;
namespace MES.Service.service.QC;
public class RKJService
{
    private readonly BaseService _baseService = new();
    //手动执行sql
    //生成检验单号
    public string getMaxBillNo()
    {
        var db = SqlSugarHelper.GetInstance();
        var date = DateTime.Now.ToString("yyyy-MM-dd");
        var sql =
            "select max(RELEASE_NO) from QS_ITEM_OQC_REQ where RELEASE_NO like 'RKJN%' and to_char(CREATE_DATE,'yyyy-mm-dd') ='" +
            date + "'";
        var maxBillNo = db.Ado.SqlQuerySingle<string>(sql);
        var number = "0001";
        if (maxBillNo != null)
        {
            maxBillNo = maxBillNo.Substring(12);
            var no = Convert.ToInt32(maxBillNo);
            no++;
            number = no.ToString().PadLeft(4, '0');
        }
        return "RKJN" + date.Replace("-", "") + number;
    }
    //选择产线
    public List<MesLine> getLineNo()
    {
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<MesLine>()
            .Where(t =>
                t.LineStyle == "包装" ||
                SqlFunc.ContainsArray(new[] { "V1", "V3", "V5", "V6" },
                    t.LineNo))
            .OrderBy(t => t.LineNo)
            .Select(t => new MesLine
            {
                LineNo = t.LineNo,
                LineName = t.LineName
            }).OrderBy("LINE_NO")
            .ToList();
    }
    //获取工单号
    public List<RkDaa002> GetDaa001s(string lineNo)
    {
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<RkDaa002>()
            .Where(t => lineNo.Contains(t.Daa020))
            .OrderBy(t => t.BillNo, OrderByType.Desc)
            .ToList();
    }
    //根据检验标准来计算检验个数
    public List<QsItemOqcItem> SetItems(string itemNo, decimal quantity)
    {
        var db = SqlSugarHelper.GetInstance();
        var count = db.Queryable<MesQa>().Where(s => s.QsType == "3"
            && s.ItemNo == itemNo && s.Fsubmit == 1).Count();
        if (count <= 0) return [];
        var qsItemOqcItems = db
            .Queryable<MesQualityStandard>()
            .Where(b => b.QsType == "3"
                        && b.ItemNo == itemNo).Select(b => new QsItemOqcItem
            {
                ProjName = b.ProjName,
                ItemMod = b.ItemMod,
                InspectionMethod = b.InspectionMethod,
                UsingInstruments = b.UsingInstruments,
                LevelNum = SqlFunc.IsNull(
                    SqlFunc.IsNull(b.LevelNum * b.InspectionLevel, 1),
                    b.InspectionLevel),
                MaxValue = b.MaxValue,
                StandardValue = b.StandardValue,
                MinValue = b.MinValue,
                Notes = b.Notes,
                FcheckLevel = b.FcheckLevel,
                FacLevel = b.FacLevel,
                QsCode = b.QsCode,
                QsName = b.QsName,
                Result = "未检测",
                isCheck = 0,
                Picture = b.Picture,
                Picturename = b.Picturename
            }).ToList();
        qsItemOqcItems.ForEach(item =>
        {
            string LEV = null;
            switch (item.FcheckLevel)
            {
                case null:
                    LEV = ""; // é»˜è®¤å€¼
                    break;
                case { } s when s.Contains("S1"):
                    LEV = "B.FLEVEL_S1";
                    break;
                case { } s when s.Contains("S2"):
                    LEV = "B.FLEVEL_S2";
                    break;
                case { } s when s.Contains("S3"):
                    LEV = "B.FLEVEL_S3";
                    break;
                case { } s when s.Contains("S4"):
                    LEV = "B.FLEVEL_S4";
                    break;
                case { } s when s.Contains("(I)"):
                    LEV = "B.FLEVEL_I";
                    break;
                case { } s when s.Contains("(II)"):
                    LEV = "B.FLEVEL_II";
                    break;
                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 +
                " FROM MES_QM_AQL1 A LEFT JOIN MES_QM_AQL2 B ON B.AQL1_ID=A.ID WHERE A.SAMPLE_SIZE_NO='" +
                item.QsCode + "' AND B.LOT_FROM<= " + quantity + "   AND " +
                quantity + "<=B.LOT_TO";
            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= '" +
                  item.QsCode + "'  AND SAMPLE_SIZE_WORD= '" + maxBillNo + "'";
            var resultClass = db.Ado.SqlQuerySingle<ResultClass>(sql);
            item.LevelNum = resultClass.FSAMPLE_SIZE_WORD;
            item.FreQty = resultClass.Result;
        });
        return qsItemOqcItems;
    }
    private string ExtractSubstring(string input, char startChar, char endChar)
    {
        var startIndex = input.IndexOf(startChar);
        var endIndex = input.IndexOf(endChar, startIndex);
        if (startIndex == -1 || endIndex == -1)
            // å¦‚果未找到起始字符或结束字符,则返回空字符串或者抛出异常,根据实际情况选择
            return string.Empty;
        // æˆ–者抛出异常
        // throw new ArgumentException("Start or end character not found");
        // æå–子字符串
        var length = endIndex - startIndex - 1;
        return input.Substring(startIndex + 1, length);
    }
    public List<QsItemOqcItem> GetItems(decimal? pid, decimal? id)
    {
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<QsItemOqcItem, QsItemOqcItemDetail>((a, b) =>
                new JoinQueryInfos(JoinType.Left, a.Id == b.Pid))
            .WhereIF(pid > 0, (a, b) => a.Pid == pid)
            .WhereIF(id > 0, (a, b) => a.Id == id)
            .GroupBy((a, b) => new
            {
                a.Id,
                a.ProjName,
                a.ItemMod,
                a.InspectionMethod,
                a.UsingInstruments,
                a.LevelNum,
                a.MaxValue,
                a.StandardValue,
                a.MinValue,
                a.Notes,
                a.IsPass,
                a.FcheckLevel,
                a.FacLevel,
                a.QsCode,
                a.QsName
            }).Select((a, b) => new QsItemOqcItem
            {
                ProjName = a.ProjName,
                Id = a.Id,
                ItemMod = a.ItemMod,
                InspectionMethod = a.InspectionMethod,
                UsingInstruments = a.UsingInstruments,
                LevelNum = a.LevelNum,
                MaxValue = a.MaxValue,
                StandardValue = a.StandardValue,
                MinValue = a.MinValue,
                Notes = a.Notes,
                FcheckLevel = a.FcheckLevel,
                FacLevel = a.FacLevel,
                QsCode = a.QsCode,
                QsName = a.QsName,
                isCheck = SqlFunc.AggregateCount(b.Id),
                Result = a.IsPass == 1 &&
                         a.LevelNum == SqlFunc.AggregateCount(b.Id) ? "合格"
                    : a.IsPass == 0 &&
                      a.LevelNum == SqlFunc.AggregateCount(b.Id) ? "不合格"
                    : "未完成"
            }).OrderBy("result desc").ToList();
    }
    public dynamic save(RKJDto rkjDto)
    {
        var xj = rkjDto.from;
        var items = rkjDto.items;
        var userNo = rkjDto.userNo;
        SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            var commit = 0;
            xj.CreateBy = userNo;
            xj.CreateDate = DateTime.Now;
            var pid = db.Insertable(xj).ExecuteReturnIdentity();
            xj.Id = pid;
            rkjDto.gid = pid;
            foreach (var item in items) item.Pid = pid;
            commit += db.Insertable(items).ExecuteCommand();
            return commit;
        });
        // using (var connection =
        //        new OracleConnection(OracleSQLHelper.ConnectionString))        //     connection.Open();
        //
        //     var transaction = connection.BeginTransaction();
        //
        //     try
        //     {
        //         using (var command = new OracleCommand())
        //         {
        //             command.Connection = connection;
        //             command.Transaction = transaction;
        //             command.CommandText = "insert_and_update_picture_RKJ";
        //             command.CommandType = CommandType.StoredProcedure;
        //
        //             // Add parameters
        //             command.Parameters.Add("p_QS_TYPE", OracleDbType.Varchar2)
        //                 .Value = "3";
        //             command.Parameters.Add("p_MOID_NUM", OracleDbType.Varchar2)
        //                 .Value = rkjDto.moidNum;
        //             command.Parameters.Add("p_pid", OracleDbType.Int32).Value =
        //                 xj.Id;
        //
        //             command.ExecuteNonQuery();
        //         }
        //
        //         transaction.Commit();
        //     }
        //     catch (Exception)
        //     {
        //         transaction.Rollback();
        //         throw;
        //     }
        // }
        rkjDto.items = GetItems(xj.Id, null);
        rkjDto.items.ForEach(s =>
        {
            if (s.MaxValue != null || s.StandardValue != null ||
                s.MinValue != null) return;
            var detail = new QsItemOqcItemDetail();
            detail.Pid = s.Id;
            detail.Gid = rkjDto.gid;
            detail.Fstand = "√";
            detail.FcheckResu = "1";
            detail.UpdateBy = rkjDto.userNo;
            detail.count = (int?)s.LevelNum;
            SetQSItemDetail(detail);
        });
        return Convert.ToInt32(xj.Id);
    }
    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();
            for (var i = 0; i < detail.count; i++)
            {
                var item = new QsItemOqcItemDetail();
                item.Gid = detail.Gid;
                item.Pid = detail.Pid;
                item.Fstand = detail.Fstand;
                item.FcheckResu = detail.FcheckResu;
                item.CreateBy = detail.UpdateBy;
                item.CreateDate = DateTime.Now;
                result.Add(item);
            }
            return db.Insertable(result).ExecuteCommand();
        });
        detail.CreateBy = detail.UpdateBy;
        autoResult(detail);
        return oracle;
    }
    private int autoResult(QsItemOqcItemDetail detail)
    {
        var db = SqlSugarHelper.GetInstance();
        // Single æ²¡æœ‰æŸ¥è¯¢åˆ°ç»“果时返回Null,如果结果大于1条会抛出错误
        var QsItemOqcItem = db.Queryable<QsItemOqcItem>()
            .Single(s => s.Id == detail.Pid);
        if (QsItemOqcItem == null) return 0;
        //查询这个检验项目下的检验结果
        var count = db.Queryable<QsItemOqcItemDetail>()
            .Where(s => s.Pid == detail.Pid).Count();
        var result = 0;
        //检验实际结果不等于应该检验的个数时直接推出
        if (QsItemOqcItem.LevelNum != count) return 0;
        //合格的有多少个
        var passCount = db.Queryable<QsItemOqcItemDetail>()
            .Where(s => s.Pid == detail.Pid && s.Fstand == "√").Count();
        if (count == passCount)
            result = 1;
        else if (count - passCount < QsItemOqcItem.FreQty) result = 1;
        var useTransactionWithOracle =
            SqlSugarHelper.UseTransactionWithOracle(db =>
            {
                var commit = 0;
                commit += db.Updateable<QsItemOqcItem>()
                    .SetColumns(s => s.IsPass == result)
                    .Where(s => s.Id == detail.Pid)
                    .ExecuteCommand();
                return commit;
            });
        var isNull = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid && s.IsPass == null).Count();
        if (isNull > 0) return 1;
        //获取检验单的检验项目的个数
        var sum = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid).Count();
        if (sum == 0) return 1;
        //获取检验单下的合格的检验项目个数
        var icount = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid && s.IsPass == 1).Count();
        var FcheckResu = "不合格";
        //实际个数等于理论个数时对检验单进行判定
        if (sum == icount)
            //合格的检验结果等于总检验数视为合格
            FcheckResu = "合格";
        SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcReq>()
                .SetColumns(s => s.FcheckResu == FcheckResu)
                .SetColumns(s => s.FcheckDate == DateTime.Now)
                .SetColumns(s => s.FcheckBy == detail.CreateBy)
                .SetColumns(s => s.LastupdateBy == detail.CreateBy)
                .SetColumns(s => s.LastupdateDate == DateTime.Now)
                .Where(s => s.Id == detail.Gid)
                .ExecuteCommand();
        });
        // 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连接
    /// </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) && s.WorkFlg == 0)
            .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 == b.Daa011 + sumQty)
                    .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)
    {
        var db = SqlSugarHelper.GetInstance();
        var qsItemOqcReq =
            db.Queryable<QsItemOqcReq>().Single(s => s.Id == gid);
        var mesInvItemIns = db.Queryable<MesInvItemIns>()
            .Single(s => s.BillNo == qsItemOqcReq.BillNo);
        var mesSchemeResult = db.Queryable<Womdaa>()
            .Single(s => s.Daa001 == mesInvItemIns.CbillNo);
        var entity = new MesQaItemsDetect02();
        // entity.ItemNo = mesSchemeResult.BoardItem;
        // entity.BoardItem = mesSchemeResult.BoardItem;
        entity.LineNo = mesSchemeResult.Daa015;
        // entity.Aufnr = mesSchemeResult.TaskNo;
        entity.ReleaseNo = qsItemOqcReq.ReleaseNo;
        entity.LotNo = qsItemOqcReq.BillNo;
        entity.FcheckDate = qsItemOqcReq.FcheckDate;
        entity.FcheckMemo = qsItemOqcReq.Remarks;
        entity.Gid = qsItemOqcReq.Id;
        // entity.PlanQty = qsItemOqcReq.FcheckDate;
        entity.FcheckResu = "不合格";
        entity.FcheckLevel = "严重";
        entity.CreateDate = DateTime.Now;
        entity.Factory = "10000";
        entity.Company = "1000";
        entity.Ftype = "4";
        entity.Fversion = 0;
        entity.Modify1Flag = 0;
        entity.IpqcStatus = 0;
        entity.Fsubmit = 1;
        entity.CreateBy = createBy;
        entity.FcheckBy = createBy;
        return SqlSugarHelper.UseTransactionWithOracle(db => db
            .Insertable(entity)
            .ExecuteCommand());
    }
    public (List<QsItemOqcReq> items, int TotalCount) getPage(
        XJPageResult queryObj)
    {
        var db = SqlSugarHelper.GetInstance();
        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>((a, b, c, ca, m, da, z) =>
                new JoinQueryInfos(
                    JoinType.Left, a.ItemNo == b.ItemNo,
                    JoinType.Left, a.BillNo == c.BillNo,
                    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,
                    JoinType.Left, da.Daa001 == c.RbillNo,
                    JoinType.Left, da.Daa015 == z.LineNo //,
                    //JoinType.Left,c.Bgr == d.UserNo
                ))
            // .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) => lineNo.Contains(da.Daa015))
            .WhereIF(!string.IsNullOrEmpty(queryObj.id),
                (a, b, c, ca, m, da, z) => a.Id.ToString() == queryObj.id)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                "未完成".Equals(queryObj.result),
                (a, b, c, ca, m, da, z) => a.FcheckResu == null)
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
                !"未完成".Equals(queryObj.result),
                (a, b, c, ca, m, da, z) => 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) =>
                    b.ItemName.ToLower()
                        .Contains(queryObj.SearchValue.ToLower())
                    || a.ItemNo.ToLower()
                        .Contains(queryObj.SearchValue.ToLower()))
            .Select((a, b, c, ca, m, da, z) => new QsItemOqcReq
            {
                BillNo = a.BillNo,
                Fsubmit = a.Fsubmit,
                Remarks = a.Remarks,
                Id = a.Id,
                CreateDate = a.CreateDate,
                CreateBy = a.CreateBy,
                FcheckResu = a.FcheckResu,
                ItemNo = a.ItemNo,
                FcheckBy = a.FcheckBy,
                FcheckDate = a.FcheckDate,
                ReleaseNo = a.ReleaseNo,
                ItemName = b.ItemName,
                ItemModel = b.ItemModel,
                //Dab001 = m.LotNo,
                ItemInId = m.ItemInId,
                Daa015 = da.Daa015,
                LineNo = c.LineNo,
                Quantity = m.Quantity
                //Bgr = d.UserName
            })
            .OrderBy(a => a.CreateDate, OrderByType.Desc)
            .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
        return (qsItemOqcReqs, totalCount);
    }
    //删除主表并且连级删除子表和孙表
    public int removeXJ(decimal? id)
    {
        var withOracle = SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            var commit = 0;
            //删除主表
            commit += db.Deleteable<QsItemOqcReq>().Where(s => s.Id == id)
                .ExecuteCommand();
            //删除子表
            commit += db.Deleteable<QsItemOqcItem>().Where(s => s.Pid == id)
                .ExecuteCommand();
            //删除孙表
            commit += db.Deleteable<QsItemOqcItemDetail>()
                .Where(s => s.Gid == id)
                .ExecuteCommand();
            return commit;
        });
        return withOracle;
    }
    public RKJDto getXjDetail02ById(decimal? id)
    {
        var rkjDto = new RKJDto();
        var db = SqlSugarHelper.GetInstance();
        var qsItemOqcItem =
            db.Queryable<QsItemOqcItem>().Single(s => s.Id == id);
        if (qsItemOqcItem.IsPass == 0)
            qsItemOqcItem.Result = "不合格";
        else if (qsItemOqcItem.IsPass == 1)
            qsItemOqcItem.Result = "合格";
        else
            qsItemOqcItem.Result = "未完成";
        if (qsItemOqcItem.Picture is { Length: > 0 })
            qsItemOqcItem.imageData =
                Convert.ToBase64String(qsItemOqcItem.Picture);
        //获取不合格数
        var count = db.Queryable<QsItemOqcItemDetail>()
            .Where(s => s.Fstand == "×" && s.Pid == id).Count();
        qsItemOqcItem.Unqualified = count;
        rkjDto.ItemXj01 = qsItemOqcItem;
        rkjDto.ItemXj02s = db.Queryable<QsItemOqcItemDetail>()
            .Where(s => s.Pid == id)
            .ToList();
        return rkjDto;
    }
    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>()
                .SetColumns(s => s.UpdateBy == detail.UpdateBy)
                .SetColumns(s => s.UpdateDate == DateTime.Now)
                .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.Fstand),
                    s => s.Fstand == detail.Fstand)
                .SetColumnsIF(StringUtil.IsNotNullOrEmpty(detail.FcheckResu),
                    s => s.FcheckResu == detail.FcheckResu)
                .Where(s => s.Id == detail.Id)
                .ExecuteCommand();
        });
        detail.CreateBy = detail.UpdateBy;
        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;
    }
    //主表修改备注字段
    public int saveRemarksGid(RKJDto dto)
    {
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcReq>()
                .SetColumns(it =>
                    it.Remarks == dto.Remarks) //SetColumns是可以叠加的 å†™2个就2个字段赋值
                .Where(it => it.Id == dto.gid)
                .ExecuteCommand();
        });
    }
    //子表修改备注字段
    public int saveRemarksPid(RKJDto dto)
    {
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcItem>()
                .SetColumns(it =>
                    it.Remarks == dto.Remarks) //SetColumns是可以叠加的 å†™2个就2个字段赋值
                .Where(it => it.Id == dto.pid)
                .ExecuteCommand();
        });
    }
    //孙表修改备注字段
    public int saveRemarksById(RKJDto dto)
    {
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcItemDetail>()
                .SetColumns(it =>
                    it.Remarks == dto.Remarks) //SetColumns是可以叠加的 å†™2个就2个字段赋值
                .Where(it => it.Id == dto.id)
                .ExecuteCommand();
        });
    }
    public int saveItem(RKJDto rkjDto)
    {
        var items = rkjDto.items;
        var userNo = rkjDto.userNo;
        SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            foreach (var item in items) item.Pid = rkjDto.gid;
            return db.Insertable(items).ExecuteCommand();
        });
        rkjDto.items = GetItems(rkjDto.gid, null);
        rkjDto.items.ForEach(s =>
        {
            if (s.MaxValue != null || s.StandardValue != null ||
                s.MinValue != null) return;
            var detail = new QsItemOqcItemDetail();
            detail.Pid = s.Id;
            detail.Gid = rkjDto.gid;
            detail.Fstand = "√";
            detail.FcheckResu = "1";
            detail.UpdateBy = rkjDto.userNo;
            detail.count = (int?)s.LevelNum;
            SetQSItemDetail(detail);
        });
        return Convert.ToInt32(rkjDto.gid);
    }
    public int cleanReqResult(RKJDto dto)
    {
        if (isRk(dto.gid)) throw new Exception("已有条码入库,不允许清除检验结果");
        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;
    }
}