From fba48d2d676cd9b6d493163aef9d87f6e5090aee Mon Sep 17 00:00:00 2001
From: 如洲 陈 <1278080563@qq.com>
Date: 星期五, 12 九月 2025 19:02:00 +0800
Subject: [PATCH] 出库检和退货检验

---
 MES.Service/service/QC/THJService.cs |  824 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 824 insertions(+), 0 deletions(-)

diff --git a/MES.Service/service/QC/THJService.cs b/MES.Service/service/QC/THJService.cs
new file mode 100644
index 0000000..f837801
--- /dev/null
+++ b/MES.Service/service/QC/THJService.cs
@@ -0,0 +1,824 @@
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.Linq;
+using MES.Service.DB;
+using MES.Service.Dto.service;
+using MES.Service.Modes;
+using MES.Service.util;
+using SqlSugar;
+using System.Data;
+
+namespace MES.Service.service.QC;
+
+public class THJService
+{
+    private static readonly OracleSQLHelper SQLHelper = new();
+    private readonly BaseService _baseService = new();
+
+    /// <summary>
+    /// 鐢熸垚鏈�鏂扮殑妫�楠屽崟鍙�
+    /// </summary>
+    public string getMaxReleaseNo()
+    {
+        var db = SqlSugarHelper.GetInstance();
+        var date = DateTime.Now.ToString("yyyy-MM-dd");
+
+        // 浣跨敤鏈嬩箰鐨勫嚱鏁伴粯璁よ幏鍙栧崟鎹�
+        var sql = "select getbillcode1('1000','1000','THJYD') from dual";
+        var maxBillNo = db.Ado.SqlQuerySingle<string>(sql);
+
+        // 濡傛灉涓虹┖鐩存帴杩斿洖榛樿鍊�
+        return maxBillNo ?? "THJ" + DateTime.Now.ToString("yyMMdd") + "0001";
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ妫�楠屽崟鍒楄〃
+    /// </summary>
+    public List<THJPageResult> getPage(THJPageResult queryObj)
+    {
+        var db = SqlSugarHelper.GetInstance();
+
+        // 鍩轰簬妫�楠屽崟鍙锋煡璇紝鍏宠仈閫�璐ф槑缁嗚幏鍙栭��璐у崟淇℃伅
+        var sql = @"
+            SELECT 
+                a.ID as Id,
+                a.RELEASE_NO as ReleaseNo,
+                a.CREATE_DATE as CreateDate,
+                a.CREATE_BY as CreateBy,
+                a.ITEM_NO as ItemNo,
+                a.SL as Sl,
+                a.FCHECK_BY as StatusUser,
+                a.FCHECK_RESU as Result,
+                COALESCE(m.ITEM_NAME, '') as ItemName,
+                COALESCE(m.ITEM_MODEL, '') as ItemModel,
+                a.SL as WorkQty,
+                COALESCE(rd.RETURN_TYPE, '') as ReturnType,
+                COALESCE(rd.RETURN_NO, '') as ReturnNo,
+                COALESCE(rw.BILL_DATE, a.CREATE_DATE) as BillDate,
+                COALESCE(c.CUST_NAME, '') as CustomerName,
+                COALESCE(rd.REMARKS, '') as ReturnReason,
+                COALESCE(a.BHGYY, '') as Remarks
+            FROM QS_QA_ITEM_THJ a
+            LEFT JOIN MES_ITEMS m ON a.ITEM_NO = m.ITEM_NO
+            LEFT JOIN MES_RETURNWARE_DETAILS rd ON a.ITEM_NO = rd.ITEM_NO 
+                AND a.BILL_NO = rd.RETURN_TYPE || '-' || rd.RETURN_NO
+            LEFT JOIN MES_RETURNWARE rw ON rd.RETURN_TYPE = rw.RETURN_TYPE 
+                AND rd.RETURN_NO = rw.RETURN_NO
+            LEFT JOIN MES_CUSTOMER c ON rw.CUST_NO = c.CUST_NO
+            WHERE 1=1";
+
+        var parameters = new List<SugarParameter>();
+
+        // 鏍规嵁ID绛涢��
+        if (queryObj.Id.HasValue && queryObj.Id > 0)
+        {
+            sql += " AND a.ID = :Id";
+            parameters.Add(new SugarParameter(":Id", queryObj.Id.Value));
+        }
+
+        // 鏍规嵁鐘舵�佺瓫閫�
+        if (!string.IsNullOrEmpty(queryObj.Result))
+        {
+            if (queryObj.Result == "鏈畬鎴�")
+            {
+                sql += " AND a.FCHECK_RESU IS NULL";
+            }
+            else if (queryObj.Result == "宸插畬鎴�")
+            {
+                sql += " AND a.FCHECK_RESU IS NOT NULL";
+            }
+        }
+
+        // 鏍规嵁妫�楠屼汉绛涢��
+        //if (!string.IsNullOrEmpty(queryObj.StatusUser))
+        //{
+        //    sql += " AND a.FCHECK_BY = :StatusUser";
+        //    parameters.Add(new SugarParameter(":StatusUser", queryObj.StatusUser));
+        //}
+
+        // 鏍规嵁鐗╂枡缂栫爜绛涢��
+        if (!string.IsNullOrEmpty(queryObj.ItemNo))
+        {
+            sql += " AND a.ITEM_NO = :ItemNo";
+            parameters.Add(new SugarParameter(":ItemNo", queryObj.ItemNo));
+        }
+
+        // 鏍规嵁妫�楠屽崟鍙风瓫閫�
+        if (!string.IsNullOrEmpty(queryObj.ReleaseNo))
+        {
+            sql += " AND a.RELEASE_NO = :ReleaseNo";
+            parameters.Add(new SugarParameter(":ReleaseNo", queryObj.ReleaseNo));
+        }
+
+        // 鏍规嵁鍒涘缓鏃ユ湡绛涢��
+        if (queryObj.CreateDate.HasValue)
+        {
+            sql += " AND TRUNC(a.CREATE_DATE) = TRUNC(:CreateDate)";
+            parameters.Add(new SugarParameter(":CreateDate", queryObj.CreateDate.Value));
+        }
+
+        // 鎺掑簭
+        sql += " ORDER BY a.CREATE_DATE DESC";
+
+        // 鍒嗛〉鏌ヨ
+        var pageList = db.Ado.SqlQuery<THJPageResult>(sql, parameters.ToArray());
+
+
+        if (pageList != null)
+        {
+            pageList = pageList.Skip((queryObj.PageIndex - 1) * queryObj.Limit)
+                              .Take(queryObj.Limit)
+                              .ToList();
+        }
+
+        return pageList ?? new List<THJPageResult>();
+    }
+
+    /// <summary>
+    /// 鑾峰彇妫�楠岄」鐩垪琛�
+    /// </summary>
+    public List<QsQaItemThj01> getQSItems(decimal? pid, decimal? id)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        
+        var qsQaItemThj01s = db.Queryable<QsQaItemThj01>()
+            .Where(a => a.Pid == pid)
+            .ToList();
+            
+
+        var array = qsQaItemThj01s.Select(s => s.Id).ToArray();
+        var qsQaItemDetails = db.Queryable<QsQaItemThj02>()
+            .Where(s => array.Contains(s.Pid))
+            .GroupBy(s => s.Pid)
+            .Select(s => new
+            {
+                s.Pid,
+                itemCount = SqlFunc.AggregateCount(s.Id)
+            }).ToList();
+
+        qsQaItemThj01s.ForEach(s =>
+        {
+            var find = qsQaItemDetails.Find(a => s.Id == a.Pid);
+            if (find == null)
+            {
+                s.isCheck = 0;
+                s.result = "鏈畬鎴�";
+            }
+            else
+            {
+                s.isCheck = find.itemCount;
+                // 淇绫诲瀷杞崲闂锛氬皢decimal?杞崲涓篿nt杩涜姣旇緝
+                var levelNum = s.LevelNum.HasValue ? (int)s.LevelNum.Value : 0;
+                if (find.itemCount == levelNum && s.IsPass == 1)
+                    s.result = "鍚堟牸";
+                else if (find.itemCount == levelNum && s.IsPass == 0)
+                    s.result = "涓嶅悎鏍�";
+                else
+                    s.result = "鏈畬鎴�";
+            }
+
+            // 杩囨护鍑哄浘鐗噄d涓嶄负绌虹殑鏁版嵁杞负base64
+            if (s.Picture is { Length: > 0 })
+                s.imageData = Convert.ToBase64String(s.Picture);
+        });
+
+        // 鎺掑簭锛屾湭瀹屾垚鐨勬帓鍦ㄥ墠闈�
+        qsQaItemThj01s = qsQaItemThj01s.OrderBy(s => s.isCheck).ToList();
+
+        return qsQaItemThj01s;
+    }
+
+    /// <summary>
+    /// 鏍规嵁ID鑾峰彇妫�楠岄」鐩鎯�
+    /// </summary>
+    public ExpandoObject getThjDetail02ById(decimal id)
+    {
+        try
+        {
+            var db = SqlSugarHelper.GetInstance();
+
+            // 鑾峰彇妫�楠岄」鐩富琛ㄤ俊鎭�
+            var qsQaItemThj01 = db.Queryable<QsQaItemThj01>()
+                .Where(s => s.Id == id)
+                .First();
+
+            if (qsQaItemThj01 == null)
+            {
+                throw new Exception($"妫�楠岄」鐩笉瀛樺湪锛孖D: {id}");
+            }
+        
+
+        if (qsQaItemThj01.IsPass == 0)
+            qsQaItemThj01.result = "涓嶅悎鏍�";
+        else if (qsQaItemThj01.IsPass == 1)
+            qsQaItemThj01.result = "鍚堟牸";
+        else
+            qsQaItemThj01.result = "鏈畬鎴�";
+
+        // 鑾峰彇涓昏〃淇℃伅锛堟楠屽崟淇℃伅锛�
+        var mainInfo = db.Queryable<QsQaItemThj>()
+            .Where(s => s.Id == qsQaItemThj01.Pid)
+            .First();
+        
+        // 妫�鏌ヤ富琛ㄤ俊鎭槸鍚︽纭幏鍙�
+        if (mainInfo == null)
+        {
+            throw new Exception($"涓昏〃淇℃伅涓嶅瓨鍦紝Pid: {qsQaItemThj01.Pid}");
+        }
+
+        // 鐩存帴浠庣墿鏂欒〃鑾峰彇鐗╂枡鍚嶇О
+        var itemInfo = db.Queryable<MesItems>()
+            .Where(i => i.ItemNo == mainInfo.ItemNo)
+            .Select(i => new { i.ItemName })
+            .First();
+
+        // 閫�璐у崟鍙峰氨鏄攢鍞��璐ф楠屽崟鐨刡ill_no
+        string returnOrderNo = mainInfo.BillNo;
+        string itemName = null;
+        decimal? returnQty = mainInfo.Sl;
+        string returnReason = mainInfo.Remarks;
+
+        // 鑾峰彇鐗╂枡鍚嶇О
+        if (itemInfo != null)
+        {
+            itemName = itemInfo.ItemName;
+        }
+
+        // 澶勭悊鍥剧墖鏁版嵁锛岄伩鍏岼SON搴忓垪鍖栭棶棰�
+        string imageData = null;
+        if (qsQaItemThj01.Picture is { Length: > 0 })
+        {
+            try
+            {
+                imageData = Convert.ToBase64String(qsQaItemThj01.Picture);
+            }
+            catch (Exception)
+            {
+                imageData = null;
+            }
+        }
+
+        // 鍒涘缓鎵╁睍鐨刬temThj01瀵硅薄锛屽寘鍚墍鏈夐渶瑕佺殑瀛楁锛岀‘淇濇墍鏈夊瓧娈甸兘鏄彲搴忓垪鍖栫殑
+        var extendedItemThj01 = new
+        {
+            // 鍘熸湁瀛楁 - 纭繚鎵�鏈夊瓧娈甸兘鏄彲搴忓垪鍖栫殑绫诲瀷
+            Id = qsQaItemThj01.Id,
+            Pid = qsQaItemThj01.Pid,
+            ProjName = qsQaItemThj01.ProjName ?? "",
+            ItemMod = qsQaItemThj01.ItemMod ?? "",
+            InspectionMethod = qsQaItemThj01.InspectionMethod ?? "",
+            UsingInstruments = qsQaItemThj01.UsingInstruments ?? "",
+            LevelNum = qsQaItemThj01.LevelNum,
+            MaxValue = qsQaItemThj01.MaxValue,
+            StandardValue = qsQaItemThj01.StandardValue,
+            MinValue = qsQaItemThj01.MinValue,
+            Notes = qsQaItemThj01.Notes ?? "",
+            FcheckLevel = qsQaItemThj01.FcheckLevel ?? "",
+            FacLevel = qsQaItemThj01.FacLevel ?? "",
+            QsCode = qsQaItemThj01.QsCode ?? "",
+            QsName = qsQaItemThj01.QsName ?? "",
+            IsPass = qsQaItemThj01.IsPass,
+            Remarks = qsQaItemThj01.Remarks ?? "",
+            result = qsQaItemThj01.result ?? "",
+
+            // 涓昏〃瀛楁
+            releaseNo = mainInfo.ReleaseNo ?? "",
+            itemNo = mainInfo.ItemNo ?? "",
+            billNo = mainInfo.BillNo ?? "",
+            // 娣诲姞涓嶅悎鏍兼弿杩板瓧娈碉紝鏄犲皠鍒颁富琛ㄧ殑BHGYY瀛楁
+            bhgyy = mainInfo.Bhgyy ?? "",
+
+            // 閫�璐ф槑缁嗗瓧娈�
+            returnOrderNo = returnOrderNo ?? "",
+            itemName = itemName ?? "",
+            returnQty = returnQty,
+            returnReason = returnReason ?? "",
+
+            // 鍏朵粬闇�瑕佺殑瀛楁
+            qualityStandard = qsQaItemThj01.QsName ?? "",
+
+            // 鍥剧墖鏁版嵁锛堣浆鎹负base64瀛楃涓诧紝閬垮厤搴忓垪鍖栭棶棰橈級
+            imageData = imageData ?? ""
+        };
+
+        // 鑾峰彇妫�楠岄」鐩槑缁嗭紝纭繚杩斿洖鐨勬暟鎹槸鍙簭鍒楀寲鐨�
+        var qsQaItemThj02s = db.Queryable<QsQaItemThj02>()
+            .Where(s => s.Pid == id)
+            .OrderBy(s => s.Id)
+            .Select(s => new
+            {
+                Id = s.Id,
+                Pid = s.Pid,
+                Gid = s.Gid,
+                FcheckResu = s.FcheckResu ?? "",
+                Fstand = s.Fstand ?? "",
+                CreateDate = s.CreateDate,
+                CreateBy = s.CreateBy ?? "",
+                UpdateDate = s.UpdateDate,
+                UpdateBy = s.UpdateBy ?? "",
+                Remarks = s.Remarks ?? ""
+            })
+            .ToList();
+
+        var result = new ExpandoObject();
+        ((IDictionary<string, object>)result)["itemThj01"] = extendedItemThj01;
+        ((IDictionary<string, object>)result)["itemThj02s"] = qsQaItemThj02s;
+
+        return result;
+        }
+        catch (Exception ex)
+        {
+            throw;
+        }
+    }
+
+    /// <summary>
+    /// 瀹夊叏鑾峰彇鍔ㄦ�佸璞″睘鎬у��
+    /// </summary>
+    private object GetDynamicValue(dynamic obj, string propertyName)
+    {
+        try
+        {
+            if (obj == null) return null;
+
+            var dict = (IDictionary<string, object>)obj;
+            return dict.ContainsKey(propertyName) ? dict[propertyName] : null;
+        }
+        catch
+        {
+            return null;
+        }
+    }
+
+    /// <summary>
+    /// 鑾峰彇閫�璐у崟鍒楄〃
+    /// </summary>
+    public List<dynamic> getReturnOrders()
+    {
+        var db = SqlSugarHelper.GetInstance();
+        var sql = @"
+            SELECT DISTINCT
+                rd.RETURN_TYPE || '-' || rd.RETURN_NO as returnOrderNo,
+                I.ITEM_NAME as itemName,
+                rd.QUANTITY as returnQty,
+                rd.REMARKS as returnReason
+            FROM MES_RETURNWARE_DETAILS rd
+            LEFT JOIN MES_ITEMS I ON I.ITEM_NO = rd.ITEM_NO
+            WHERE rd.RETURN_TYPE IS NOT NULL
+            AND rd.RETURN_NO IS NOT NULL
+            ORDER BY rd.RETURN_TYPE, rd.RETURN_NO";
+        var result = db.Ado.SqlQuery<dynamic>(sql);
+        return result;
+    }
+
+    /// <summary>
+    /// 鑾峰彇閫�璐ф槑缁嗕俊鎭�
+    /// </summary>
+    public List<dynamic> getReturnwareInfo(string returnType, string returnNo)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        var sql = @"
+            SELECT 
+                rd.RETURN_TYPE || '-' || rd.RETURN_NO as returnOrderNo,
+                I.ITEM_NAME as itemName,
+                rd.QUANTITY as returnQty,
+                rd.REMARKS as returnReason,
+                rd.ITEM_NO as itemNo
+            FROM MES_RETURNWARE_DETAILS rd
+            LEFT JOIN MES_ITEMS I ON I.ITEM_NO = rd.ITEM_NO
+            WHERE rd.RETURN_TYPE = :returnType 
+            AND rd.RETURN_NO = :returnNo";
+        
+        var result = db.Ado.SqlQuery<dynamic>(sql, 
+            new SugarParameter(":returnType", returnType),
+            new SugarParameter(":returnNo", returnNo));
+
+        return result;
+    }
+
+    /// <summary>
+    /// 鑾峰彇閫�璐ф槑缁� - 鍩轰簬妫�楠屽崟鐨凚ILL_NO绮剧‘鍖归厤
+    /// </summary>
+    public List<dynamic> getReturnDetails(string pid)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        var sql = @"
+            SELECT 
+                rd.RETURN_TYPE as returntype,
+                rd.RETURN_NO as returnno,
+                rd.QUANTITY as quantity,
+                rd.REMARKS as remarks,
+                rd.ITEM_NO as itemno,
+                I.ITEM_NAME as itemname
+            FROM MES_RETURNWARE_DETAILS rd
+            LEFT JOIN MES_ITEMS I ON I.ITEM_NO = rd.ITEM_NO
+            LEFT JOIN QS_QA_ITEM_THJ q ON q.ITEM_NO = rd.ITEM_NO 
+                AND q.BILL_NO = rd.RETURN_TYPE || '-' || rd.RETURN_NO
+            WHERE q.ID = :pid";
+        
+        var result = db.Ado.SqlQuery<dynamic>(sql, 
+            new SugarParameter(":pid", Convert.ToDecimal(pid)));
+        
+        return result;
+    }
+
+    /// <summary>
+    /// 璁剧疆妫�楠岄」鐩� - 璋冪敤瀛樺偍杩囩▼
+    /// </summary>
+    public List<QsQaItemThj01> setInspectItem(string gid, string updateBy = "绯荤粺")
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        
+        // 楠岃瘉gid鍙傛暟
+        if (string.IsNullOrEmpty(gid) || !decimal.TryParse(gid, out decimal gidDecimal))
+        {
+            throw new Exception("妫�楠屽崟ID鏍煎紡涓嶆纭�");
+        }
+        
+        
+        try
+        {
+            // 鍏堟鏌ユ楠屽崟鏄惁瀛樺湪
+            var thjExists = db.Queryable<QsQaItemThj>()
+                .Where(s => s.Id == gidDecimal)
+                .Any();
+            
+            
+            if (!thjExists)
+            {
+                throw new Exception($"妫�楠屽崟ID {gidDecimal} 涓嶅瓨鍦�");
+            }
+            
+            // 瀹氫箟杈撳嚭鍙傛暟
+            var outputResult = new SugarParameter("c_result", null, System.Data.DbType.Int32, ParameterDirection.Output, 4000);
+            var outputMessage = new SugarParameter("c_msg", null, System.Data.DbType.String, ParameterDirection.Output, 4000);
+
+            // 瀹氫箟杈撳叆鍙傛暟 - 瀛樺偍杩囩▼鏈熸湜NUMBER绫诲瀷
+            var parameters = new List<SugarParameter>
+            {
+                new("p_gid", gidDecimal, System.Data.DbType.Decimal, ParameterDirection.Input),
+                new("p_user", updateBy, System.Data.DbType.String, ParameterDirection.Input),
+                outputResult,
+                outputMessage
+            };
+
+
+            // 璋冪敤瀛樺偍杩囩▼
+            db.Ado.ExecuteCommand(
+                "BEGIN PROC_ADD_INSPECT_ITEMS(:p_gid, :p_user, :c_result, :c_msg); END;",
+                parameters.ToArray());
+        
+            // 鑾峰彇杈撳嚭鍙傛暟鐨勫��
+            var resultValue = outputResult.Value;
+            var messageValue = outputMessage.Value?.ToString();
+            
+
+            // 妫�鏌ュ瓨鍌ㄨ繃绋嬫墽琛岀粨鏋� - 鏀寔澶氱鏁板�肩被鍨嬫瘮杈�
+            bool isError = false;
+            if (resultValue != null)
+            {
+                if (resultValue is int intVal && intVal == 1)
+                    isError = true;
+                else if (resultValue is decimal decimalVal && decimalVal == 1)
+                    isError = true;
+                else if (resultValue is double doubleVal && doubleVal == 1.0)
+                    isError = true;
+                else if (resultValue.ToString() == "1")
+                    isError = true;
+            }
+            
+            if (isError)
+            {
+                // 瀛樺偍杩囩▼鎵ц澶辫触锛屾姏鍑哄紓甯�
+                throw new Exception(messageValue ?? "鑾峰彇妫�楠岄」鐩け璐�");
+            }
+
+            // 瀛樺偍杩囩▼鎵ц鎴愬姛锛岃幏鍙栫敓鎴愮殑妫�楠岄」鐩�
+            var items = db.Queryable<QsQaItemThj01>()
+                .Where(s => s.Pid == gidDecimal)
+                .ToList();
+            
+
+            // 涓烘瘡涓」鐩缃粯璁ゅ��
+            items.ForEach(item =>
+            {
+                item.result = "鏈娴�";
+                item.isCheck = 0;
+            });
+
+            return items;
+        }
+        catch (Exception ex)
+        {
+            // 濡傛灉瀛樺偍杩囩▼璋冪敤澶辫触锛屾姏鍑哄紓甯�
+            throw new Exception($"鑾峰彇妫�楠岄」鐩け璐�: {ex.Message}");
+        }
+    }
+
+    /// <summary>
+    /// 淇濆瓨妫�楠岄」鐩�
+    /// </summary>
+    public int saveItem(THJDto thjDto)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            var commit = 0;
+
+            // 淇濆瓨涓昏〃
+            thjDto.from.CreateBy = thjDto.userNo;
+            thjDto.from.CreateDate = DateTime.Now;
+
+            var pid = db.Insertable(thjDto.from).ExecuteReturnIdentity();
+            thjDto.from.Id = pid;
+            thjDto.gid = pid;
+
+            // 淇濆瓨妫�楠岄」鐩�
+            if (thjDto.items != null && thjDto.items.Count > 0)
+            {
+                foreach (var item in thjDto.items) item.Pid = pid;
+                commit += db.Insertable(thjDto.items).ExecuteCommand();
+            }
+
+            return commit;
+        });
+    }
+    
+    /// <summary>
+    /// 璁剧疆妫�楠岄」鐩鎯�
+    /// </summary>
+    public int SetQSItemDetail(decimal pid, decimal gid, string fstand, string fcheckResu, string updateBy, int count)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            List<QsQaItemThj02> result = new();
+            for (var i = 0; i < count; i++)
+            {
+                var item = new QsQaItemThj02();
+                item.Pid = pid;
+                item.Gid = gid;
+                item.Fstand = fstand;
+                item.FcheckResu = fcheckResu;
+                item.CreateBy = updateBy;
+                item.CreateDate = DateTime.Now;
+                item.Factory = "1000";
+                item.Company = "1000";
+                result.Add(item);
+            }
+
+            var insertResult = db.Insertable(result).ExecuteCommand();
+            
+            // 鎻掑叆妫�楠岀粨鏋滃悗锛岃嚜鍔ㄦ洿鏂版楠岄」鐩殑IsPass鐘舵��
+            autoUpdateInspectionStatus(pid, db);
+            
+            return insertResult;
+        });
+    }
+    
+    /// <summary>
+    /// 鑷姩鏇存柊妫�楠岄」鐩姸鎬�
+    /// </summary>
+    private void autoUpdateInspectionStatus(decimal pid, ISqlSugarClient db)
+    {
+        // 鑾峰彇妫�楠岄」鐩俊鎭�
+        var qsQaItemThj01 = db.Queryable<QsQaItemThj01>()
+            .Where(s => s.Id == pid)
+            .First();
+
+        if (qsQaItemThj01 == null) return;
+ 
+        // 鏌ヨ杩欎釜妫�楠岄」鐩笅鐨勬楠岀粨鏋滄�绘暟
+        var totalCount = db.Queryable<QsQaItemThj02>()
+            .Where(s => s.Pid == pid)
+            .Count();
+
+        // 鏌ヨ鍚堟牸鏁伴噺
+        var passCount = db.Queryable<QsQaItemThj02>() 
+            .Where(s => s.Pid == pid && s.Fstand == "鈭�")
+            .Count();
+
+        // 鑾峰彇搴旇妫�楠岀殑鏁伴噺
+        var levelNum = qsQaItemThj01.LevelNum.HasValue ? (int)qsQaItemThj01.LevelNum.Value : 1;
+        
+        int isPass = 0; // 榛樿涓嶅悎鏍�
+        
+        // 濡傛灉妫�楠屾暟閲忚揪鍒拌姹備笖鍏ㄩ儴鍚堟牸锛屽垯璁剧疆涓哄悎鏍�
+        if (totalCount >= levelNum && passCount == totalCount)
+        {
+            isPass = 1; // 鍚堟牸
+        }
+        // 濡傛灉妫�楠屾暟閲忚揪鍒拌姹備絾鏈変笉鍚堟牸鐨勶紝鍒欒缃负涓嶅悎鏍�
+        else if (totalCount >= levelNum && passCount < totalCount)
+        {
+            isPass = 0; // 涓嶅悎鏍�
+        }
+        // 濡傛灉妫�楠屾暟閲忔湭杈惧埌瑕佹眰锛屼繚鎸佸師鐘舵�侊紙涓嶆洿鏂癐sPass瀛楁锛�
+
+        // 鍙湁褰撴楠屾暟閲忚揪鍒拌姹傛椂鎵嶆洿鏂癐sPass瀛楁
+        if (totalCount >= levelNum)
+        {
+            db.Updateable<QsQaItemThj01>()
+                .SetColumns(s => s.IsPass == isPass)
+                .Where(s => s.Id == pid)
+                .ExecuteCommand();
+        }
+    }
+
+    /// <summary>
+    /// 鏇存柊妫�楠岄」鐩鎯�
+    /// </summary>
+    public int UpdateQSItemDetail(decimal id, decimal pid, decimal gid, string fstand, string fcheckResu, string updateBy)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            // 鏇存柊妫�楠岀粨鏋滆褰�
+            var updateResult = db.Updateable<QsQaItemThj02>()
+                .SetColumns(s => s.UpdateBy == updateBy)
+                .SetColumns(s => s.UpdateDate == DateTime.Now)
+                .SetColumnsIF(StringUtil.IsNotNullOrEmpty(fstand),
+                    s => s.Fstand == fstand)
+                .SetColumnsIF(StringUtil.IsNotNullOrEmpty(fcheckResu),
+                    s => s.FcheckResu == fcheckResu)
+                .Where(s => s.Id == id)
+                .ExecuteCommand();
+            
+            // 鏇存柊妫�楠岀粨鏋滃悗锛岄噸鏂拌绠楁楠岄」鐩姸鎬�
+            autoUpdateInspectionStatus(pid, db);
+            
+            return updateResult;
+        });
+    }
+
+    /// <summary>
+    /// 淇濆瓨妫�楠岄」鐩娉�
+    /// </summary>
+    public int saveRemarksPid(decimal pid, string remarks)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            return db.Updateable<QsQaItemThj01>()
+                .SetColumns(it => it.Remarks == remarks)
+                .Where(it => it.Id == pid)
+                .ExecuteCommand();
+        });
+    }
+
+    /// <summary>
+    /// 淇濆瓨妫�楠屽崟澶囨敞锛堜笉鍚堟牸鎻忚堪锛�
+    /// </summary>
+    public int saveRemarksGid(decimal gid, string remarks)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            return db.Updateable<QsQaItemThj>()
+                .SetColumns(it => it.Bhgyy == remarks)
+                .Where(it => it.Id == gid)
+                .ExecuteCommand();
+        });
+    }
+
+    /// <summary>
+    /// 淇濆瓨妫�楠岀粨鏋�
+    /// </summary>
+    public int saveInspectItem(string gid, string items, string userNo)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            var result = 0;
+            var gidDecimal = Convert.ToDecimal(gid);
+
+            // 杩欓噷鍙互鏍规嵁闇�瑕佽В鏋恑tems鍙傛暟骞舵洿鏂版楠岀粨鏋�
+            // 鐢变簬鍓嶇浼犻�掔殑鏄瓧绗︿覆锛岃繖閲岀畝鍖栧鐞�
+            result += db.Updateable<QsQaItemThj>()
+                .SetColumns(s => s.LastupdateBy == userNo)
+                .SetColumns(s => s.LastupdateDate == DateTime.Now)
+                .Where(s => s.Id == gidDecimal)
+                .ExecuteCommand();
+
+            return result;
+        });
+    }
+
+    /// <summary>
+    /// 淇濆瓨閫�璐ф槑缁�
+    /// </summary>
+    public List<dynamic> SaveReturnDetails(string returnDetails)
+    {
+        // 杩欓噷鍙互鏍规嵁闇�瑕佸鐞嗛��璐ф槑缁嗘暟鎹�
+        // 鐢变簬鍓嶇浼犻�掔殑鏄瓧绗︿覆锛岃繖閲岃繑鍥炵┖鍒楄〃
+        return new List<dynamic>();
+    }
+
+    /// <summary>
+    /// 鎻愪氦妫�楠岀粨鏋�
+    /// </summary>
+    public bool SubmitTHJResult(decimal gid, string userNo)
+    {
+        var result = SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            // 1. 楠岃瘉妫�楠屽崟鏄惁瀛樺湪
+            var inspectionOrder = db.Queryable<QsQaItemThj>()
+                .Where(s => s.Id == gid)
+                .First();
+            
+            if (inspectionOrder == null)
+            {
+                throw new Exception($"妫�楠屽崟涓嶅瓨鍦紝ID: {gid}");
+            }
+
+            // 2. 妫�鏌ユ槸鍚﹀凡缁忔彁浜よ繃
+            if (inspectionOrder.FcheckResu == "宸插畬鎴�")
+            {
+                throw new Exception("璇ユ楠屽崟宸茬粡鎻愪氦锛屾棤娉曢噸澶嶆彁浜�");
+            }
+
+            // 3. 楠岃瘉鎵�鏈夋楠岄」鐩槸鍚﹂兘宸插畬鎴�
+            var uncompletedItems = db.Queryable<QsQaItemThj01>()
+                .Where(s => s.Pid == gid)
+                .Where(s => s.IsPass == null || s.IsPass == -1) // 鍋囪-1琛ㄧず鏈畬鎴�
+                .Count();
+
+            if (uncompletedItems > 0)
+            {
+                throw new Exception("瀛樺湪鏈畬鎴愮殑妫�楠岄」鐩紝璇峰畬鎴愭墍鏈夋楠屽悗鍐嶆彁浜�");
+            }
+
+            // 4. 鏇存柊妫�楠屽崟鐘舵��
+            var updateResult = db.Updateable<QsQaItemThj>()
+                .SetColumns(s => s.FcheckResu == "宸插畬鎴�")
+                .SetColumns(s => s.FcheckBy == userNo)
+                .SetColumns(s => s.FcheckDate == DateTime.Now)
+                .SetColumns(s => s.LastupdateBy == userNo)
+                .SetColumns(s => s.LastupdateDate == DateTime.Now)
+                .Where(s => s.Id == gid)
+                .ExecuteCommand();
+
+            if (updateResult <= 0)
+            {
+                throw new Exception("鏇存柊妫�楠屽崟鐘舵�佸け璐�");
+            }
+
+            // 5. 璁板綍鎻愪氦鏃ュ織锛堝彲閫夛級
+            // 杩欓噷鍙互娣诲姞鏃ュ織璁板綍鎴栧叾浠栦笟鍔¢�昏緫
+
+            return updateResult;
+        });
+        
+        return result > 0;
+    }
+
+    /// <summary>
+    /// 閫氳繃瀛樺偍杩囩▼鎻愪氦妫�楠岀粨鏋�
+    /// </summary>
+    public (bool success, string message) SubmitTHJResultByProcedure(string releaseNo, string userNo)
+    {
+        try
+        {
+            var db = SqlSugarHelper.GetInstance();
+            
+            // 瀹氫箟杈撳嚭鍙傛暟
+            var outputResult = new SugarParameter("O_RESULT", null, System.Data.DbType.Int32, ParameterDirection.Output, 4000);
+            var outputMessage = new SugarParameter("O_MSG", null, System.Data.DbType.String, ParameterDirection.Output, 4000);
+
+            // 瀹氫箟杈撳叆鍙傛暟
+            var parameters = new List<SugarParameter>
+            {
+                new("P_RELEASE_NO", releaseNo, System.Data.DbType.String, ParameterDirection.Input),
+                new("P_USER", userNo, System.Data.DbType.String, ParameterDirection.Input),
+                outputResult,
+                outputMessage
+            };
+
+            // 璋冪敤瀛樺偍杩囩▼
+            db.Ado.ExecuteCommand(
+                "BEGIN PRC_MES_THJ_QA_SUBMIT82(:P_RELEASE_NO, :P_USER, :O_RESULT, :O_MSG); END;",
+                parameters.ToArray());
+        
+            // 鑾峰彇杈撳嚭鍙傛暟鐨勫��
+            var resultValue = outputResult.Value;
+            var messageValue = outputMessage.Value?.ToString();
+            
+            // 妫�鏌ュ瓨鍌ㄨ繃绋嬫墽琛岀粨鏋�
+            bool isSuccess = false;
+            if (resultValue != null)
+            {
+                if (resultValue is int intVal && intVal == 0)
+                    isSuccess = true;
+                else if (resultValue is decimal decimalVal && decimalVal == 0)
+                    isSuccess = true;
+                else if (resultValue is double doubleVal && doubleVal == 0.0)
+                    isSuccess = true;
+                else if (resultValue.ToString() == "0")
+                    isSuccess = true;
+            }
+            
+            return (isSuccess, messageValue ?? "鏈煡閿欒");
+        }
+        catch (Exception ex)
+        {
+            return (false, $"璋冪敤瀛樺偍杩囩▼澶辫触: {ex.Message}");
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3