From 30c1248ee88dfff420181b145db5c8529163b067 Mon Sep 17 00:00:00 2001
From: cnf <3200815559@qq.com>
Date: 星期一, 28 四月 2025 20:56:56 +0800
Subject: [PATCH] 异常处置单接收测试增加,逻辑未写

---
 StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs |  135 +++++
 StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs                     |   21 
 StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs               |   12 
 StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs                     |  145 ++++++
 StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs                |   36 +
 StandardInterface/MES.Service/MES.Service.csproj                                      |    6 
 StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs            |   57 ++
 StandardInterface/MESApplication/Controllers/PLM/PLMController.cs                     |  125 +++++
 StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs                         |   17 
 StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs                   |   34 +
 StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs           |  516 ++++++++++++++++++++++
 StandardInterface/MES.Service/Dto/webApi/PLM/BaseObject.cs                            |   12 
 StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs                           |   23 +
 StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs           |   40 +
 StandardInterface/MES.Service/service/PLM/PLMManager.cs                               |  189 ++++++++
 15 files changed, 1,368 insertions(+), 0 deletions(-)

diff --git a/StandardInterface/MES.Service/Dto/webApi/PLM/BaseObject.cs b/StandardInterface/MES.Service/Dto/webApi/PLM/BaseObject.cs
new file mode 100644
index 0000000..5794080
--- /dev/null
+++ b/StandardInterface/MES.Service/Dto/webApi/PLM/BaseObject.cs
@@ -0,0 +1,12 @@
+锘�
+namespace MES.Service.Dto.webApi.PLM;
+
+public class BaseObject
+{
+    //瀹炰綋涓婚敭
+    public long? FID { get; set; }
+    //缂栫爜
+    public string? FCode { get; set; }
+    //鍚嶇О
+    public string? FName { get; set; }
+}
diff --git a/StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs b/StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs
new file mode 100644
index 0000000..cdee91e
--- /dev/null
+++ b/StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs
@@ -0,0 +1,17 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Dto.webApi.PLM;
+
+public class RelatedObject
+{
+    //瀹炰綋涓婚敭
+    public long? FID { get; set; }
+    //鐗╂枡缂栫爜
+    public string? FRE_FCode { get; set; }
+    //鐩稿叧瀵硅薄
+    public long? FRelatedObject { get; set; }
+}
diff --git a/StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs b/StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs
new file mode 100644
index 0000000..151a151
--- /dev/null
+++ b/StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs
@@ -0,0 +1,23 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Dto.webApi.PLM;
+
+public class StdDocument
+{
+    //瀹炰綋涓婚敭
+    public long? FID { get; set; }
+    //缂栫爜
+    public string? FCode { get; set; }
+    //鍚嶇О
+    public string? FName { get; set; }
+    //鐗╃悊鏂囦欢鍚�
+    public string? FPhysicalFileName { get; set; }
+    //鐗╃悊鏂囦欢
+    public string? FFileId { get; set; }
+    //鍏宠仈瀵硅薄 杞殑 pdf
+    public string? FRelevantObject { get; set; }
+}
diff --git a/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs b/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs
new file mode 100644
index 0000000..3bec48a
--- /dev/null
+++ b/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs
@@ -0,0 +1,57 @@
+锘縰sing Newtonsoft.Json;
+using System.Collections.Generic;
+
+public class ErpQcIssueResult
+{
+  
+    public string? ProcessNo { get; set; }
+
+ 
+    public string? FReview { get; set; }
+
+
+    public string? QcStatus { get; set; }  // 鍘烸CSTATU鏀逛负瑙勮寖鍛藉悕
+
+    // 鏂板鍚堝苟瀛楁
+ 
+    public string? Remark { get; set; }
+
+
+    public int? ApplicationQuantity { get; set; }  // 淇濇寔鍙┖鎬�
+
+
+    public string? Reason { get; set; }
+
+
+    public string? BadCauses { get; set; }
+
+ 
+    public string? AffiliatedWorkshop { get; set; }
+
+ 
+    public string? ItemName { get; set; }
+
+ 
+    public string? SupplierName { get; set; }
+
+  
+    public string? ItemNo { get; set; }
+
+ 
+    public List<Applicant> Applicants { get; set; } = new List<Applicant>();
+
+    public List<ApplicationDepartment> ApplicationDepartments { get; set; } = new List<ApplicationDepartment>();
+}
+
+// 淇濇寔鍘熸湁宓屽绫诲畾涔�
+public class Applicant
+{
+
+    public string? applicant { get; set; }  // 缁熶竴鍙┖鎬�
+}
+
+public class ApplicationDepartment
+{
+ 
+    public string? applicationdepartment { get; set; }
+}
\ No newline at end of file
diff --git a/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs b/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs
new file mode 100644
index 0000000..6ce15a0
--- /dev/null
+++ b/StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs
@@ -0,0 +1,12 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Dto.webApi.QcIssueResult;
+
+public class QcIssueResult
+{
+    public ErpQcIssueResult ErpQcIssueResult { get; set; }
+}
diff --git a/StandardInterface/MES.Service/MES.Service.csproj b/StandardInterface/MES.Service/MES.Service.csproj
index 89bbd58..5f0ecb4 100644
--- a/StandardInterface/MES.Service/MES.Service.csproj
+++ b/StandardInterface/MES.Service/MES.Service.csproj
@@ -7,7 +7,13 @@
     </PropertyGroup>
 
     <ItemGroup>
+        <PackageReference Include="AlibabaCloud.SDK.Dingtalk" Version="2.1.99" />
         <PackageReference Include="Masuit.Tools.Core" Version="2024.3.4" />
+        <PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.4" />
+        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.4" />
+        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.4" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
+        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
         <PackageReference Include="SqlSugarCore" Version="5.1.4.158" />
     </ItemGroup>
 
diff --git a/StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs b/StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs
new file mode 100644
index 0000000..a2b7663
--- /dev/null
+++ b/StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs
@@ -0,0 +1,21 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Modes.QcIssueResult;
+
+//閽夐拤鐢ㄦ埛鍐呯爜瀵瑰簲琛�
+[SugarTable("MES_DINGDING_NAME_CODE")]
+internal class DingNameCode
+{
+    //閽夐拤鐢ㄦ埛鍐呯爜
+    [SugarColumn(ColumnName = "DINGDINGCODE")]
+    public string? DingDingCode { get; set; }
+
+    //閽夐拤鐢ㄦ埛鍚嶇О
+    [SugarColumn(ColumnName = "DINGDINGNAME")]
+    public string? DingDingName { get; set; }
+}
diff --git a/StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs b/StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs
new file mode 100644
index 0000000..9ffc23e
--- /dev/null
+++ b/StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs
@@ -0,0 +1,40 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Modes.QcIssueResult;
+
+public class GetQcIssueResultDetail
+{
+    //鏁伴噺
+
+    public string? FbatchQty { get; set; }
+
+    //浜у搧鍚嶇О
+  
+    public string? ItemName { get; set; }
+
+    //瑙勬牸鍨嬪彿
+
+    public string? ItemModel { get; set; }
+
+    //閫佹鍗曚綅
+
+    public string? SuppName { get; set; }
+
+    //璁㈠崟鍙�(閲囪喘鍗曞彿)
+    public string? CgOrder { get; set; }
+
+    //瀵逛笉鍚堟牸鎴栨綔鍦ㄤ笉鍚堟牸鐨勬弿杩�
+    public string? remark { get; set; }
+
+    //妫�楠屽崟鍙�
+    public string? ReleaseNo { get; set; }
+
+    //鐢ㄦ埛鍚嶇О
+    public string? Fname { get; set; }
+
+}
diff --git a/StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs b/StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs
new file mode 100644
index 0000000..e17e4f8
--- /dev/null
+++ b/StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs
@@ -0,0 +1,34 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Modes.QcIssueResult;
+
+//寮傚父澶勭疆鍗曠粨鏋滆〃
+[SugarTable("MES_QCISSUE_RESULT")]
+public class QcIssueResults
+{
+    //SEQ_MES_SCZZD
+    [SugarColumn(ColumnName = "ID", IsPrimaryKey = true, OracleSequenceName = "SEQ_QCISSUE_RESULT")]
+    public decimal Id { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "RELEASE_NO")]
+    public string? ReleaseNo { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "PROCESSNO")]
+    public string? ProcessNo { get; set; }
+
+    //渚涘簲鍟�
+    [SugarColumn(ColumnName = "FREVIEW")]
+    public string? FReview { get; set; }
+
+    //渚涘簲鍟�
+    [SugarColumn(ColumnName = "QCSTATU")]
+    public string? QcStatu { get; set; }
+
+}
diff --git a/StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs b/StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs
new file mode 100644
index 0000000..d9880f6
--- /dev/null
+++ b/StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs
@@ -0,0 +1,36 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MES.Service.Modes.QcIssueResult;
+
+[SugarTable("MES_QA_ITEMS_DETECT_01")]
+public class UpdateMesQaItems
+{
+    [SugarColumn(ColumnName = "ID", OracleSequenceName = "SEQ_QM_ID",
+        IsPrimaryKey = true)]
+    public decimal Id { get; set; }
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "RELEASE_NO")]
+    public string? ReleaseNo { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "FNG_HANDLE")]
+    public string? FngHandle { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "FMRMODE")]
+    public string? FMRMODE { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "IS_SJ")]
+    public decimal? ISSJ { get; set; }
+
+    //閫佽揣鍗曞彿
+    [SugarColumn(ColumnName = "SJ_NO")]
+    public string? SJ_NO { get; set; }
+
+}
diff --git a/StandardInterface/MES.Service/service/PLM/PLMManager.cs b/StandardInterface/MES.Service/service/PLM/PLMManager.cs
new file mode 100644
index 0000000..9a0bc58
--- /dev/null
+++ b/StandardInterface/MES.Service/service/PLM/PLMManager.cs
@@ -0,0 +1,189 @@
+锘縰sing Kingdee.CDP.WebApi.SDK;
+using MES.Service.Dto.webApi.PLM;
+using System.Diagnostics;
+using System.Text;
+
+namespace MES.Service.service.PLM;
+
+public class PLMManager
+{
+    public List<StdDocument> RetrieveDrawings(string ItemNo)
+    {
+        List<BaseObject> baseObjects = GetPlmCfgBase(ItemNo);
+        Debug.WriteLine($"绗竴瀹屾暣鍐呭锛圝SON锛�: {Newtonsoft.Json.JsonConvert.SerializeObject(baseObjects, Newtonsoft.Json.Formatting.Indented)}");
+
+        // 妫�鏌ヨ繑鍥炵粨鏋滄槸鍚︿负绌�
+        if (baseObjects == null || !baseObjects.Any())
+        {
+            throw new NotImplementedException("杩斿洖缁撴灉涓虹┖");
+        }
+        else
+        {
+            List<RelatedObject> relatedObjects = GetPlmCfgRelatedObject(baseObjects[0].FID);
+            Debug.WriteLine($"绗簩瀹屾暣鍐呭锛圝SON锛�: {Newtonsoft.Json.JsonConvert.SerializeObject(relatedObjects, Newtonsoft.Json.Formatting.Indented)}");
+
+            // 妫�鏌ヨ繑鍥炵粨鏋滄槸鍚︿负绌�
+            if (relatedObjects == null || !relatedObjects.Any())
+            {
+                throw new NotImplementedException("杩斿洖缁撴灉涓虹┖");
+            }
+            List<StdDocument> stdDocuments = GetPlmStdDocument(relatedObjects);
+            return stdDocuments;
+        }
+       
+    }
+
+    #region 1.閫氳繃鐗╂枡缂栫爜锛堥渶瑕佸敮涓�锛夎幏鍙栫墿鏂檌d
+    public List<BaseObject> GetPlmCfgBase(string ItemNo)
+    {
+        //娉ㄦ剰 1锛氭澶勪笉鍐嶄娇鐢ㄥ弬鏁板舰寮忎紶鍏ョ敤鎴峰悕鍙婂瘑鐮佺瓑鏁忔劅淇℃伅锛屾敼涓哄湪鐧诲綍閰嶇疆鏂囦欢涓缃��
+        //娉ㄦ剰 2锛氬繀椤诲厛閰嶇疆绗笁鏂圭郴缁熺櫥褰曟巿鏉冧俊鎭悗锛屽啀杩涜涓氬姟鎿嶄綔锛岃鎯呭弬鑰冨悇璇█鐗堟湰SDK浠嬬粛涓殑鐧诲綍閰嶇疆鏂囦欢璇存槑銆�
+        //璇诲彇閰嶇疆锛屽垵濮嬪寲SDK
+        K3CloudApi client = new K3CloudApi();
+        //鐢ㄤ簬璁板綍缁撴灉
+        StringBuilder Info = new StringBuilder();
+        //涓氬姟瀵硅薄鏍囪瘑
+        //string formId = "PLM_STD_DOCUMENT";
+        string formId = "PLM_CFG_BASE";
+        DateTime dt = DateTime.Now;
+        //鏌ヨ瀛楁闆嗗悎锛屽嵆杩斿洖鍝簺鏁版嵁锛屼笉鑳戒负绌猴紝鏍规嵁涓嶅悓涓氬姟鍗曟嵁濉啓涓嶅悓鐨勫瓧娈靛悕锛屼互涓嬩粎涓虹ず渚�
+        //string fieldKeys = "FCode,FFileId,FRelevantObject";
+        //string FilterString = "FID='-2146304'";
+        string fieldKeys = "FID,FCode,FName";
+        string FilterString = string.Format(@"FCode='{0}'", ItemNo);
+        string OrderString = "";
+        int TopRowCount = 0;
+        int StartRow = 0;
+        int Limit = 0;
+
+        var param = new QueryParam()
+        {
+            FormId = formId,
+            FieldKeys = fieldKeys,
+            FilterString = FilterString,
+            OrderString = OrderString,
+            TopRowCount = TopRowCount,
+            StartRow = StartRow,
+            Limit = Limit
+        };
+        //璋冪敤鎺ュ彛
+        var result = client.ExecuteBillQuery(param.ToJson());
+        Debug.WriteLine($"绗竴涓厓绱犲唴瀹�: {result}");
+
+        return result.Select(s =>
+        {
+            var entity = new BaseObject
+            {
+                FID = (long)s[0],
+                FCode = (string)s[1],
+                FName = (string)s[2],
+            };
+            return entity;
+        }).ToList();
+    }
+    #endregion
+
+    #region 2.閫氳繃鐗╂枡id鑾峰彇鐩稿叧瀵硅薄銆愪笅杞介渶瑕佺殑鏂囨。銆戠殑id
+    public List<RelatedObject> GetPlmCfgRelatedObject(long? FRelatedObject)
+    {
+        //娉ㄦ剰 1锛氭澶勪笉鍐嶄娇鐢ㄥ弬鏁板舰寮忎紶鍏ョ敤鎴峰悕鍙婂瘑鐮佺瓑鏁忔劅淇℃伅锛屾敼涓哄湪鐧诲綍閰嶇疆鏂囦欢涓缃��
+        //娉ㄦ剰 2锛氬繀椤诲厛閰嶇疆绗笁鏂圭郴缁熺櫥褰曟巿鏉冧俊鎭悗锛屽啀杩涜涓氬姟鎿嶄綔锛岃鎯呭弬鑰冨悇璇█鐗堟湰SDK浠嬬粛涓殑鐧诲綍閰嶇疆鏂囦欢璇存槑銆�
+        //璇诲彇閰嶇疆锛屽垵濮嬪寲SDK
+        K3CloudApi client = new K3CloudApi();
+        //鐢ㄤ簬璁板綍缁撴灉
+        StringBuilder Info = new StringBuilder();
+        //涓氬姟瀵硅薄鏍囪瘑
+        //string formId = "PLM_STD_DOCUMENT";
+        string formId = "PLM_CFG_RELATEDOBJECT";
+        DateTime dt = DateTime.Now;
+        //鏌ヨ瀛楁闆嗗悎锛屽嵆杩斿洖鍝簺鏁版嵁锛屼笉鑳戒负绌猴紝鏍规嵁涓嶅悓涓氬姟鍗曟嵁濉啓涓嶅悓鐨勫瓧娈靛悕锛屼互涓嬩粎涓虹ず渚�
+        //string fieldKeys = "FCode,FFileId,FRelevantObject";
+        //string FilterString = "FID='-2146304'";
+        string fieldKeys = "FID,FRE_FCode,FRelatedObject";
+        string FilterString = string.Format(@"FRelatedObject='{0}'", FRelatedObject);
+        string OrderString = "";
+        int TopRowCount = 0;
+        int StartRow = 0;
+        int Limit = 0;
+
+        var param = new QueryParam()
+        {
+            FormId = formId,
+            FieldKeys = fieldKeys,
+            FilterString = FilterString,
+            OrderString = OrderString,
+            TopRowCount = TopRowCount,
+            StartRow = StartRow,
+            Limit = Limit
+        };
+        //璋冪敤鎺ュ彛
+        var result = client.ExecuteBillQuery(param.ToJson());
+        Debug.WriteLine(result);
+
+        return result.Select(s =>
+        {
+            var entity = new RelatedObject
+            {
+                FID = (long)s[0],
+                FRE_FCode = (string)s[1],
+                FRelatedObject = (long)s[2],
+            };
+            return entity;
+        }).ToList();
+    }
+    #endregion
+
+    #region 3.鏍规嵁鏂囨。id鑾峰彇鏂囨。鐗╃悊鏂囦欢id
+    public List<StdDocument> GetPlmStdDocument(List<RelatedObject> relatedObjects)
+    {
+        //娉ㄦ剰 1锛氭澶勪笉鍐嶄娇鐢ㄥ弬鏁板舰寮忎紶鍏ョ敤鎴峰悕鍙婂瘑鐮佺瓑鏁忔劅淇℃伅锛屾敼涓哄湪鐧诲綍閰嶇疆鏂囦欢涓缃��
+        //娉ㄦ剰 2锛氬繀椤诲厛閰嶇疆绗笁鏂圭郴缁熺櫥褰曟巿鏉冧俊鎭悗锛屽啀杩涜涓氬姟鎿嶄綔锛岃鎯呭弬鑰冨悇璇█鐗堟湰SDK浠嬬粛涓殑鐧诲綍閰嶇疆鏂囦欢璇存槑銆�
+        //璇诲彇閰嶇疆锛屽垵濮嬪寲SDK
+        K3CloudApi client = new K3CloudApi();
+        //鐢ㄤ簬璁板綍缁撴灉
+        StringBuilder Info = new StringBuilder();
+        //涓氬姟瀵硅薄鏍囪瘑
+        string formId = "PLM_STD_DOCUMENT";
+        DateTime dt = DateTime.Now;
+        //鏌ヨ瀛楁闆嗗悎锛屽嵆杩斿洖鍝簺鏁版嵁锛屼笉鑳戒负绌猴紝鏍规嵁涓嶅悓涓氬姟鍗曟嵁濉啓涓嶅悓鐨勫瓧娈靛悕锛屼互涓嬩粎涓虹ず渚�
+        string fieldKeys = "FID,FCode,FName,FPhysicalFileName,FFileId,FRelevantObject";
+        // 鎻愬彇 FID 鍊�
+        var fidList = relatedObjects.Select(obj => obj.FID.ToString()).ToList();
+        // 灏� FID 鍊肩敤閫楀彿鍒嗛殧锛屽苟鍖呰9鍦ㄥ崟寮曞彿涓�
+        string fids = string.Join(",", fidList.Select(fid => $"'{fid}'"));
+        // 鏋勫缓 FilterString
+        string FilterString = $"FID in ({fids})";
+        string OrderString = "";
+        int TopRowCount = 0;
+        int StartRow = 0;
+        int Limit = 0;
+
+        var param = new QueryParam()
+        {
+            FormId = formId,
+            FieldKeys = fieldKeys,
+            FilterString = FilterString,
+            OrderString = OrderString,
+            TopRowCount = TopRowCount,
+            StartRow = StartRow,
+            Limit = Limit
+        };
+        //璋冪敤鎺ュ彛
+        var result = client.ExecuteBillQuery(param.ToJson());
+
+        return result.Select(s =>
+        {
+            var entity = new StdDocument
+            {
+                FID = (long)s[0],
+                FCode = (string)s[1],
+                FName = (string)s[2],
+                FPhysicalFileName = (string)s[3],
+                FFileId = (string)s[4],
+                FRelevantObject = (string)s[5],
+            };
+            return entity;
+        }).ToList();
+    }
+    #endregion
+}
diff --git a/StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs b/StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs
new file mode 100644
index 0000000..748ea0a
--- /dev/null
+++ b/StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs
@@ -0,0 +1,145 @@
+锘縰sing Newtonsoft.Json.Linq;
+using System.Net;
+using System.Text;
+
+namespace ConsoleApp1
+{
+    #region 1.鏍规嵁鏂囨。鐗╃悊鏂囦欢id鑾峰彇鏂囨。娴佹暟鎹�
+    public class WarehouseDownloadDoc()
+    {
+        private string _cloudUrl = "http://121.36.245.199/k3cloud";
+        private string _warehouse = "http://192.168.30.251/CloudPLMWarehouse";
+
+        #region 鏂囨。鏈嶅姟鍣ㄤ笂涓嬫枃
+        private string WarehouseCTX
+        {
+            get
+            {
+                string json = "{\"ap1\":{ \"AcctID\":\"" + "61ce591aee4c5a" + "\",\"Username\":\"Administrator\",\"Password\":\"Yc123456@\",\"Lcid\":2052,\"AuthenticateType\":1,\"PasswordIsEncrypted\":\"false\",\"ClientInfo\":{\"ClientType\":8}}";
+                var resp = GetResponse("http://121.36.245.199/k3cloud/Kingdee.BOS.ServiceFacade.ServicesStub.User.UserService.ValidateLoginInfo.common.kdsvc", json, new Dictionary<string, string>());
+                string ret = (new StreamReader(resp.GetResponseStream(), Encoding.UTF8)).ReadToEnd();
+                var result = JObject.Parse(ret)["Context"];
+                string token = result["UserToken"].ToString();
+                var warehouseCtx = string.Format("LoginUrl={0}&KDServiceSessionId={1}", _cloudUrl, JObject.Parse(ret)["KDSVCSessionId"].ToString());//瀹夊叏鏂版柟寮�
+                return Convert.ToBase64String(Encoding.UTF8.GetBytes(warehouseCtx));
+            }
+        }
+        #endregion
+
+        #region 鐗╃悊鏂囦欢id
+        private string GetFileId(string fileId)
+        {
+            return Convert.ToBase64String(Encoding.UTF8.GetBytes(fileId));
+        }
+        #endregion
+
+        #region 鐢靛瓙浠撹闂嚟璇�
+        private string Token
+        {
+            get
+            {
+                var token = Guid.NewGuid().ToString();
+                return token;
+            }
+        }
+        #endregion
+
+        #region 鍙戦�佽姹�
+        public Stream SendRequest(string op, string fileId)
+        {
+            var header = new Dictionary<string, string>()
+            {
+                {"FileID" ,GetFileId(fileId) },
+                { "CTX",WarehouseCTX},
+                { "token", Token },
+                { "PLM_ACCESS_TYPE","pure" }
+            };
+            return PostDataViaHttpWebRequest(RequestUrl(op), string.Empty, header, !op.Equals("Download"));
+        }
+        #endregion
+
+        #region 璇锋眰鐨刄RL
+        private string RequestUrl(string op)
+        {
+            return _warehouse + "/" + op;
+        }
+        #endregion
+
+        #region 鑾峰彇鍝嶅簲
+        private HttpWebResponse GetResponse(string url, string bodyJson, Dictionary<string, string> header)
+        {
+            byte[] data = Encoding.UTF8.GetBytes(bodyJson);
+
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+            request.Method = WebRequestMethods.Http.Post;
+            request.ContentType = "application/json";
+            request.ContentLength = data.Length;
+            if (header != null)
+            {
+                foreach (var p in header)
+                {
+                    request.Headers.Add(p.Key, p.Value);
+                }
+            }
+
+            using (Stream reqStream = request.GetRequestStream())
+            {
+                reqStream.Write(data, 0, data.Length);
+                reqStream.Close();
+            }
+
+            HttpWebResponse resp = null;
+            try
+            {
+                resp = (HttpWebResponse)request.GetResponse();
+            }
+            catch (WebException ex)
+            {
+                var res = ex.Response;
+                if (res != null)
+                {
+                    string statusBase64 = ((HttpWebResponse)ex.Response).StatusDescription;//base64缂栫爜鍚庣殑鎶ラ敊淇℃伅
+                }
+            }
+            return resp;
+        }
+        #endregion
+
+        #region 淇濆瓨鏂囦欢鍒版湰鍦�
+        /*private void PostDataViaHttpWebRequest(string url, string bodyJson, Dictionary<string, string> header, bool isGetContent)
+        {
+
+            var resp = GetResponse(url, bodyJson, header);
+            var resultJson = string.Empty;
+            Stream stream = File.Open("D://DownloadDocDemo.pdf", FileMode.OpenOrCreate);
+            int packageSize = 1024 * 1024;
+            byte[] buffer = new byte[packageSize];
+            using (stream)
+            {
+                using (Stream outputStream = resp.GetResponseStream())
+                {
+                    int readLength = 0;
+                    while ((readLength = outputStream.Read(buffer, 0, packageSize)) > 0)
+                    {
+                        stream.Write(buffer, 0, readLength);
+                        stream.Flush();
+                    }
+                    outputStream.Close();
+                }
+                stream.Close();
+            }
+        }*/
+        #endregion
+
+        #region 杩斿洖鏂囦欢娴佺粰鍓嶇
+        private Stream PostDataViaHttpWebRequest(string url, string bodyJson, Dictionary<string, string> header, bool isGetContent)
+        {
+
+            var resp = GetResponse(url, bodyJson, header);
+
+            return resp.GetResponseStream(); // 鐩存帴杩斿洖鍝嶅簲娴�
+        }
+        #endregion
+    }
+    #endregion
+}
diff --git a/StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs b/StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs
new file mode 100644
index 0000000..e92cf28
--- /dev/null
+++ b/StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs
@@ -0,0 +1,516 @@
+锘縰sing System;
+using System.Collections.Generic;
+using AlibabaCloud.OpenApiClient.Models;
+using AlibabaCloud.SDK.Dingtalkworkflow_1_0;
+using AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models;
+using AlibabaCloud.SDK.Dingtalkoauth2_1_0;
+using AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models;
+using AlibabaCloud.TeaUtil.Models;
+using Tea;
+using System.Diagnostics;
+using MES.Service.Dto.webApi;
+using MES.Service.Modes;
+using SqlSugar;
+using MES.Service.DB;
+using MES.Service.Modes.QcIssueResult;
+using MES.Service.Dto.webApi.QcIssueResult;
+//using MES.Service.Dto.webApi.DeliveryNote;
+//using MES.Service.Modes.DeliveryNote;
+using Newtonsoft.Json;
+using Oracle.ManagedDataAccess.Client;
+using System.Data;
+
+namespace MES.Service.service.QcIssueResult;
+
+//寮傚父澶勭疆鍗曠粨鏋滆〃
+[SugarTable("MES_QA_ITEMS_DETECT_01")]
+public class QcIssueResultManager: Repository<QcIssueResults>
+{
+    /**
+     * 浣跨敤 Token 鍒濆鍖栬处鍙稢lient
+     * @return Client
+     * @throws Exception
+     */
+    public static AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client CreateClient()
+    {
+        AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
+        config.Protocol = "https";
+        config.RegionId = "central";
+        return new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client(config);
+    }
+
+    public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient1()
+    {
+        AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
+        config.Protocol = "https";
+        config.RegionId = "central";
+        return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
+    }
+
+    /**
+     * 鑾峰彇閽夐拤鐨� Access Token
+     * @return string 杩斿洖鑾峰彇鍒扮殑 Access Token
+     */
+    public string GetToken()
+    {
+        AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient1();
+        AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest
+        {
+            AppKey = "dingyzos0r1bizj7g6lr",
+            AppSecret = "-HP4RvK2OUbqhG3iBUpd_TPe5MZRj8cfLc0b8Skt8rhC3I38kVLY9SS8P3kLWFcH",
+        };
+
+        try
+        {
+            var response = client.GetAccessToken(getAccessTokenRequest);
+            return response.Body.AccessToken; // 杩斿洖鑾峰彇鍒扮殑 Access Token
+        }
+        catch (TeaException err)
+        {
+            Console.WriteLine($"TeaException: Code={err.Code}, Message={err.Message}");
+            return null;
+        }
+        catch (Exception _err)
+        {
+            Console.WriteLine($"Exception: {_err.Message}");
+            return null;
+        }
+    }
+
+    /**
+     * 鏌ョ湅鏈夋棤鑷�夊鎵硅妭鐐�
+     * @return string 杩斿洖鍚姩缁撴灉
+     */
+    public string GetForecast()
+    {
+        // 鑾峰彇 Access Token
+        string accessToken = GetToken();
+        if (string.IsNullOrEmpty(accessToken))
+        {
+            return "鑾峰彇 Access Token 澶辫触";
+        }
+        AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client client = CreateClient();
+        AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastHeaders processForecastHeaders = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastHeaders();
+        processForecastHeaders.XAcsDingtalkAccessToken = accessToken;
+        AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastRequest.ProcessForecastRequestFormComponentValues formComponentValues0 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastRequest.ProcessForecastRequestFormComponentValues
+        {
+            Name = "PhoneField",
+            Value = "123xxxxxxxx",
+        };
+        AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastRequest processForecastRequest = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastRequest
+        {
+            ProcessCode = "PROC-BBA5632D-DC7C-4267-A3E2-757E2B7023BC",
+            DeptId = 1,
+            UserId = "923188102",
+            FormComponentValues = new List<AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.ProcessForecastRequest.ProcessForecastRequestFormComponentValues>
+            {
+                formComponentValues0
+            },
+        };
+        try
+        {
+            var response = client.ProcessForecastWithOptions(processForecastRequest, processForecastHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());
+            return $"閽夐拤宸ヤ綔娴佸疄渚嬪惎鍔ㄦ垚鍔�: {Newtonsoft.Json.JsonConvert.SerializeObject(response.Body)}";
+        }
+        catch (TeaException err)
+        {
+           
+                return $"TeaException: Code={err.Code}, Message={err.Message}";
+          
+        }
+        catch (Exception _err)
+        {
+            return $"Exception: {_err.Message}";
+        }
+    }
+
+
+    /**
+     * 鍚姩閽夐拤宸ヤ綔娴佸疄渚�
+     * @return string 杩斿洖鍚姩缁撴灉
+     */
+
+    public string GetProcessNo(GetQcIssueResultDetail getQcIssueResultDetail)
+    {
+
+        var db = SqlSugarHelper.GetInstance();
+        var mapping = db.Queryable<DingNameCode>()
+            .Where(t => t.DingDingName == getQcIssueResultDetail.Fname)
+            .Select(t => new DingNameCode
+            {
+               DingDingCode=t.DingDingCode,
+            })
+            .ToList();
+        if (mapping.Any())
+        {
+            string UserId = mapping.FirstOrDefault().DingDingCode;
+
+
+            // 浣跨敤 JSON 搴忓垪鍖栬緭鍑哄璞$殑璇︾粏鍐呭
+            string getQcIssueResultDetailJson = JsonConvert.SerializeObject(getQcIssueResultDetail, Formatting.Indented);
+            Debug.WriteLine("GetQcIssueResultDetail: " + getQcIssueResultDetailJson);
+
+            // 鑾峰彇 Access Token
+            string accessToken = GetToken();
+            if (string.IsNullOrEmpty(accessToken))
+            {
+                return "鑾峰彇 Access Token 澶辫触";
+            }
+
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Client client = CreateClient();
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceHeaders startProcessInstanceHeaders = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceHeaders();
+            Debug.WriteLine(accessToken);
+            startProcessInstanceHeaders.XAcsDingtalkAccessToken = accessToken; // 浣跨敤鑾峰彇鍒扮殑 Access Token  
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues1 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextField-K2AD4O5B",
+                Value = getQcIssueResultDetail.ItemName,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues2 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextField_DYFD1EESLVC0",
+                Value = getQcIssueResultDetail.ItemModel,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues3 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextField_1AVN2BNVY1OG0",
+                Value = getQcIssueResultDetail.FbatchQty,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues4 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextField_1DKEMESOOGSG0",
+                Value = getQcIssueResultDetail.SuppName,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues5 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "DDDateField_20LKOACGMLXC0",
+                Value = DateTime.Now.ToString("yyyy-MM-dd"),
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues6 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextField_WBNBWGFHR000",
+                Value = getQcIssueResultDetail.CgOrder,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues7 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextareaField_1ZP3BDPMYY800",
+                Value = getQcIssueResultDetail.remark,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues8 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "SignatureField_SKF9Q82DZUO0",
+                Value = getQcIssueResultDetail.Fname,
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues9 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "DDSelectField_1AK82Q8A2NB40",
+                Value = "閫�璐�",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues10 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextareaField_1LM82CPPR35S0",
+                Value = "鎸戦�夊唴瀹�",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues11 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextareaField_AK4JLDDNS2O0",
+                Value = "璁╂鎺ユ敹鍐呭",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues12 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextareaField_K69R6770WLS0",
+                Value = "閫�璐у娉�",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues13 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "TextareaField_194UFGLMI02O0",
+                Value = "鎶ュ簾澶囨敞",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues14 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "DDSelectField_1RN2L4RWQ0AO0",
+                Value = "鍚�",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues15 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "InnerContactField_WNG7AU9R2AO0",
+                Value = "鍔犵",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues formComponentValues16 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues
+            {
+                Name = "DDAttachment_23VB5MMC1R1C0",
+                Value = "闄勪欢",
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners targetSelectActioners0 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners
+            {
+                ActionerKey = "null",
+                ActionerUserIds = new List<string>
+            {
+               UserId
+            },
+            };
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestApprovers approvers0 = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestApprovers
+            {
+                ActionType = "OR",
+                UserIds = new List<string>
+            {
+                UserId
+            },
+            };
+
+
+            AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest startProcessInstanceRequest = new AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest
+            {
+                OriginatorUserId = UserId,
+                ProcessCode = "PROC-BBA5632D-DC7C-4267-A3E2-757E2B7023BC",
+                DeptId = 1,
+                FormComponentValues = new List<AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues>
+            {
+                 formComponentValues1,formComponentValues2,formComponentValues3, formComponentValues4, formComponentValues5, formComponentValues6, formComponentValues7, formComponentValues8,
+                 formComponentValues9,formComponentValues10, formComponentValues11, formComponentValues12, formComponentValues13, formComponentValues14
+            },
+                TargetSelectActioners = new List<AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners>
+            {
+                targetSelectActioners0
+            },
+                Approvers = new List<AlibabaCloud.SDK.Dingtalkworkflow_1_0.Models.StartProcessInstanceRequest.StartProcessInstanceRequestApprovers>
+            {
+                approvers0
+            },
+                CcList = new List<string>
+            {
+               UserId
+            },
+                CcPosition = "START",
+
+            };
+            // 搴忓垪鍖� FormComponentValues 鍒楄〃涓� JSON 鏍煎紡
+            string formComponentValuesJson = JsonConvert.SerializeObject(startProcessInstanceRequest.FormComponentValues, Formatting.Indented);
+            Debug.WriteLine("FormComponentValues: " + formComponentValuesJson);
+            try
+            {
+                string requestContent = Newtonsoft.Json.JsonConvert.SerializeObject(startProcessInstanceRequest);
+                Debug.WriteLine("startProcessInstanceRequest鍐呭锛�");
+                Debug.WriteLine(requestContent);
+                var response = client.StartProcessInstanceWithOptions(startProcessInstanceRequest, startProcessInstanceHeaders, new RuntimeOptions());
+                return $"閽夐拤宸ヤ綔娴佸疄渚嬪惎鍔ㄦ垚鍔�: {Newtonsoft.Json.JsonConvert.SerializeObject(response.Body)}";
+            }
+            catch (TeaException err)
+            {
+                string requestContent = Newtonsoft.Json.JsonConvert.SerializeObject(startProcessInstanceRequest);
+                Debug.WriteLine("startProcessInstanceRequest鍐呭锛�");
+                Debug.WriteLine(startProcessInstanceRequest);
+                return $"TeaException: Code={err.Code}, Message={err.Message}";
+            }
+            catch (Exception _err)
+            {
+                return $"Exception: {_err.Message}";
+            }
+        }
+        else {
+            return "鎮ㄤ笉鏄叕鍙告垚鍛樻垨杩樻湭琚姞鍏ュ埌鏁版嵁搴撲腑鎴栧悕瀛楀~鍐欓敊璇紝鎬讳箣鏈壘鍒板尮閰嶇殑鐢ㄦ埛淇℃伅";
+        }
+    }
+
+
+    /**
+     * 灏嗗甫鏈夋祦绋嬪彿鍜屾楠屽崟鍙风殑鏂拌褰曟彃鍏ヨ〃涓�
+     */
+    public dynamic SaveProcessNo(string ReleaseNo,string ProcessNo)
+    {
+
+        var QcIssueResults = GetQcIssueResults(ReleaseNo, ProcessNo);
+
+        return UseTransaction(db =>
+        {
+            return SaveOrUpdateData(db, QcIssueResults) ? 1 : 0;
+        }) > 0;
+    }
+
+    public QcIssueResults GetQcIssueResults(string ReleaseNo, string ProcessNo)
+    {
+        var QcIssueResults = new QcIssueResults
+        {
+            ProcessNo = ProcessNo,
+            ReleaseNo = ReleaseNo,
+            QcStatu = ""
+        };
+
+        return QcIssueResults;
+    }
+
+    /**
+    * 鏍规嵁娴佺▼鍙锋洿鏂拌〃鐨勮褰�
+    */
+    public dynamic Save(ErpQcIssueResult erpQcIssueResult)
+    {
+        var json = JsonConvert.SerializeObject(erpQcIssueResult);
+
+        //var saveSuccess = UseTransaction(db =>
+        //{
+        //    var data = GetMesQcIssueResults(erpQcIssueResult);
+        //    return SaveOrUpdateData(db, data);
+        //});
+
+        return new
+        {
+            SerializedPayload = json,
+            ServerTime = DateTime.UtcNow.ToString("O")
+        };
+    }
+
+    public QcIssueResults GetMesQcIssueResults(ErpQcIssueResult erpQcIssueResult)
+    {
+        var mesQcIssueResults = new QcIssueResults
+        {
+            ProcessNo = erpQcIssueResult.ProcessNo,
+            FReview = erpQcIssueResult.FReview,
+            QcStatu = erpQcIssueResult.QcStatus
+        };
+
+        return mesQcIssueResults;
+    }
+
+    /**
+    * 鎻掑叆鍜屾洿鏂版暟鎹簱琛�
+    */
+    private bool SaveOrUpdateData(SqlSugarScope db, QcIssueResults qcIssueResults)
+    {
+
+        // 鏌ヨ QcIssueResults 琛ㄤ腑鏄惁瀛樺湪鍖归厤鐨勮褰�
+        var mapping = db.Queryable<QcIssueResults>()
+            .Where(t => t.ProcessNo == qcIssueResults.ProcessNo)
+            .Select(t => new QcIssueResults
+            {
+                ReleaseNo = t.ReleaseNo,
+            })
+            .ToList();
+
+        if (mapping.Any())
+        {
+            if (qcIssueResults.QcStatu=="鎷掔粷")
+            {
+                string ReleaseNo = mapping.FirstOrDefault().ReleaseNo;
+
+                // 鍙洿鏂� ReleaseNo 鍜� FReview 涓や釜瀛楁
+                var updateResult = db.Updateable<QcIssueResults>()
+                    .SetColumns(t => new QcIssueResults
+                    {
+                        ReleaseNo = ReleaseNo,
+                        FReview = qcIssueResults.FReview
+                    })
+                    .Where(t => t.ProcessNo == qcIssueResults.ProcessNo) // 鏄惧紡鎸囧畾鏇存柊鏉′欢
+                    .ExecuteCommand();
+
+                // 鏌ヨ UpdateMesQaItems 琛ㄤ腑鏄惁瀛樺湪鍖归厤鐨勮褰�
+                var existingRecord = db.Queryable<UpdateMesQaItems>()
+                    .Where(it => it.ReleaseNo == ReleaseNo)
+                    .First(); // 浣跨敤 First 鑾峰彇绗竴鏉¤褰�
+
+                Debug.WriteLine($"鏌ヨ鍒扮殑 mapping: {JsonConvert.SerializeObject(existingRecord)}");
+
+                if (existingRecord != null)
+                {
+                    string result = null;
+                    bool returnValue = false;
+                    try
+                    {
+                        string connectionString = "User Id=yc_dev;Password=ycdev;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))";
+                        using (OracleConnection connection = new OracleConnection(connectionString))
+                        {
+                            using (OracleCommand command = new OracleCommand("PRC_MES_IQC_CG_REVOCK", connection))
+                            {
+                                command.CommandType = CommandType.StoredProcedure;
+                                // 娣诲姞杈撳叆鍙傛暟
+                                command.Parameters.Add("pi_no", OracleDbType.Varchar2).Value = existingRecord.ReleaseNo; // 鏇挎崲涓哄疄闄呭��
+                                command.Parameters.Add("pi_user", OracleDbType.Varchar2).Value = "PL017"; // 鏇挎崲涓哄疄闄呭��
+                                                                                                                       // 娣诲姞杈撳嚭鍙傛暟
+                                OracleParameter poResult = new OracleParameter("po_result", OracleDbType.Int32, ParameterDirection.Output);
+                                OracleParameter poMsg = new OracleParameter("po_msg", OracleDbType.Varchar2, 4000, ParameterDirection.Output);
+                                command.Parameters.Add(poResult);
+                                command.Parameters.Add(poMsg);
+                                // 鎵撳紑杩炴帴骞舵墽琛屽懡浠�
+                                connection.Open();
+                                command.ExecuteNonQuery();
+                                // 澶勭悊杩斿洖鍊�
+                                if (poResult.Value != null && poResult.Value.ToString() == "0")
+                                {
+                                    returnValue = true;
+                                }
+                                else
+                                {
+                                    // 杈撳嚭閿欒淇℃伅
+                                    string errorMsg = poMsg.Value != null ? poMsg.Value.ToString() : "Unknown error occurred";
+                                    Console.WriteLine("Error: " + errorMsg);
+                                }
+                            }
+                        }
+                        return returnValue;
+                    }
+                    catch (Exception ex)
+                    {
+                        Console.WriteLine("Exception: " + ex.Message);
+                        return false;
+                    }
+                }
+                else
+                {
+                    throw new Exception("鏈壘鍒伴渶瑕佹洿鏂扮殑璁板綍");
+                }
+            }
+            else{
+                string ReleaseNo = mapping.FirstOrDefault().ReleaseNo;
+
+                // 鍙洿鏂� ReleaseNo 鍜� FReview 涓や釜瀛楁
+                var updateResult = db.Updateable<QcIssueResults>()
+                    .SetColumns(t => new QcIssueResults
+                    {
+                        ReleaseNo = ReleaseNo,
+                        FReview = qcIssueResults.FReview
+                    })
+                    .Where(t => t.ProcessNo == qcIssueResults.ProcessNo) // 鏄惧紡鎸囧畾鏇存柊鏉′欢
+                    .ExecuteCommand();
+
+                // 鏌ヨ UpdateMesQaItems 琛ㄤ腑鏄惁瀛樺湪鍖归厤鐨勮褰�
+                var existingRecord = db.Queryable<UpdateMesQaItems>()
+                    .Where(it => it.ReleaseNo == ReleaseNo)
+                    .First(); // 浣跨敤 First 鑾峰彇绗竴鏉¤褰�
+
+                Debug.WriteLine($"鏌ヨ鍒扮殑 mapping: {JsonConvert.SerializeObject(existingRecord)}");
+
+                if (existingRecord != null)
+                {
+                    // 鏇存柊 UpdateMesQaItems 琛ㄤ腑鐨勫瓧娈�
+                    existingRecord.FngHandle = qcIssueResults.FReview;
+                    if (existingRecord.FngHandle == "閫�璐�")
+                    {
+                        existingRecord.FMRMODE = "閫�鏂欒ˉ鏂�";
+                    }
+                    else
+                    {
+                        existingRecord.FMRMODE = null;
+                    }
+
+                    // 鎵ц鏇存柊鎿嶄綔
+                    updateResult = db.Updateable(existingRecord).ExecuteCommand();
+
+                    return updateResult > 0; // 濡傛灉鏇存柊鎴愬姛锛岃繑鍥� true
+                }
+                else
+                {
+                    throw new Exception("鏈壘鍒伴渶瑕佹洿鏂扮殑璁板綍");
+                }
+            }
+        }
+        else
+        {
+            // 濡傛灉 mapping 涓虹┖锛屾彃鍏ユ柊璁板綍鍒� QcIssueResults 琛�
+            var orUpdate = base.Insert(qcIssueResults);
+            if (orUpdate) return true;
+            throw new NotImplementedException("鎻掑叆鎴栨洿鏂板け璐�");
+        }
+
+    }
+
+   
+}
\ No newline at end of file
diff --git a/StandardInterface/MESApplication/Controllers/PLM/PLMController.cs b/StandardInterface/MESApplication/Controllers/PLM/PLMController.cs
new file mode 100644
index 0000000..a20d80b
--- /dev/null
+++ b/StandardInterface/MESApplication/Controllers/PLM/PLMController.cs
@@ -0,0 +1,125 @@
+锘縰sing ConsoleApp1;
+using MES.Service.service.PLM;
+using MES.Service.util;
+using Microsoft.AspNetCore.Mvc;
+using System.Dynamic;
+using System.IO;
+
+namespace MESApplication.Controllers.PLM;
+
+
+[ApiController]
+[Route("api/PLM")]
+public class PLMController : ControllerBase
+{
+    private readonly PLMManager m = new();
+    private readonly WarehouseDownloadDoc wdd = new();
+
+    //RetrieveDrawings  璋冨彇鍥剧焊
+    [HttpPost("RetrieveDrawings")]
+    public ResponseResult RetrieveDrawings(string ItemNo)
+    {
+        try
+        {
+            dynamic resultInfos = new ExpandoObject();
+            resultInfos = m.RetrieveDrawings(ItemNo);
+
+            return new ResponseResult
+            {
+                status = 0,
+                message = "OK",
+                data = resultInfos
+            };
+        }
+        catch (Exception ex)
+        {
+            return ResponseResult.ResponseError(ex);
+        }
+    }
+
+    //RetrieveImageFile  璋冨彇涓婁紶鍒版湇鍔″櫒鐨勬媿鎽勬枃浠�
+    [HttpGet("GetImageNames")]
+    public IActionResult GetImageNames(string releaseNo)
+    {
+        // 鎷兼帴鏈湴鏂囦欢绯荤粺璺緞
+        string basePath = @"D:\MES_FTP\IQC\"; // 鏈嶅姟鍣―鐩樹笅鐨勫熀纭�璺緞
+        string folderPath = Path.Combine(basePath, releaseNo); // 鍔ㄦ�佹嫾鎺ュ崟鍙峰搴旂殑鏂囦欢澶硅矾寰�
+
+        // 妫�鏌ユ枃浠跺す鏄惁瀛樺湪
+        if (!Directory.Exists(folderPath))
+        {
+            return NotFound($"鏂囦欢澶� {folderPath} 涓嶅瓨鍦ㄣ�傝妫�鏌ヨ矾寰勬槸鍚︽纭��");
+        }
+
+        // 鑾峰彇鏂囦欢澶逛腑鐨勬墍鏈夊浘鐗囨枃浠跺悕绉�
+        string[] imageExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };
+        // 鑾峰彇鏂囦欢鐨勫畬鏁磋矾寰勶紝骞惰繑鍥炰竴涓寘鍚枃浠跺悕鍜屽畬鏁磋矾寰勭殑瀵硅薄
+        var imageFiles = Directory.GetFiles(folderPath)
+            .Where(file => imageExtensions.Any(ext => file.ToLower().EndsWith(ext)))
+            .Select(file => new
+            {
+                FileName = Path.GetFileName(file), // 鏂囦欢鍚�
+                FilePath = file,
+                FileBasePath = ConvertFileToBase64(file) // 鏂囦欢鐨� Base64 鏁版嵁 // 鏂囦欢鐨勫畬鏁磋矾寰�
+            });
+
+        return Ok(new { success = true, data = imageFiles });
+    }
+    private string ConvertFileToBase64(string filePath)
+    {
+        byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);
+        return Convert.ToBase64String(fileBytes);
+    }
+
+    [HttpPost("DeleteImageFile")]
+    public IActionResult DeleteImageFile([FromQuery] string filePath)
+    {
+        // 妫�鏌ユ枃浠惰矾寰勬槸鍚︿负绌�
+        if (string.IsNullOrWhiteSpace(filePath))
+        {
+            return BadRequest("鏂囦欢璺緞涓嶈兘涓虹┖");
+        }
+
+        // 纭繚璺緞鏄粷瀵硅矾寰勶紙鍙互鏍规嵁闇�瑕佽皟鏁达級
+        filePath = Path.GetFullPath(filePath);
+
+        // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+        if (!System.IO.File.Exists(filePath))
+        {
+            return NotFound("鏂囦欢涓嶅瓨鍦�");
+        }
+
+        try
+        {
+            // 鍒犻櫎鏂囦欢
+            System.IO.File.Delete(filePath);
+            return Ok("鏂囦欢鍒犻櫎鎴愬姛");
+        }
+        catch (System.Exception ex)
+        {
+            // 鎹曡幏寮傚父骞惰繑鍥為敊璇俊鎭�
+            return StatusCode(500, $"鍒犻櫎鏂囦欢鏃跺彂鐢熼敊璇�: {ex.Message}");
+        }
+    }
+
+    //RetrieveDrawings  璋冨彇鍥剧焊
+    [HttpPost("OpenDrawings")]
+    public IActionResult OpenDrawings(string fileId,string fName)
+    {
+        try
+        {
+            var resultInfos = wdd.SendRequest("Download", fileId);
+
+            return File(resultInfos, "application/octet-stream", fName);
+        }
+        catch (Exception ex)
+        {
+            return StatusCode(500, new ResponseResult
+            {
+                status = 1,
+                message = ex.Message,
+                data = null
+            });
+        }
+    }
+}
diff --git a/StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs b/StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs
new file mode 100644
index 0000000..070e9d6
--- /dev/null
+++ b/StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs
@@ -0,0 +1,135 @@
+锘縰sing MES.Service.Dto.webApi;
+using MES.Service.Dto.webApi.QcIssueResult;
+using MES.Service.Modes;
+using MES.Service.Modes.QcIssueResult;
+//using MES.Service.Modes.SentLaboratory;
+using MES.Service.service;
+using MES.Service.service.QcIssueResult;
+using MES.Service.util;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.Diagnostics;
+using System.Dynamic;
+using System.Net;
+using System.Text;
+using System.Text.Json.Nodes;
+using System.Web;
+
+namespace MESApplication.Controllers.QcIssueResult;
+
+[ApiController]
+[Route("api/[controller]")]
+public class QcIssueResultController : ControllerBase
+{
+    private readonly MessageCenterManager _manager = new();
+    private readonly QcIssueResultManager m = new();
+
+    private readonly string METHOD = "POST";
+
+    private readonly string TableName = "MES_QCISSUE_RESULT";
+
+    private readonly string URL = "http://localhost:10054/api/QcIssueResult/";
+
+
+    [HttpPost("GetProcessNo")]
+    public IActionResult StartDingtalkProcess([FromBody] GetQcIssueResultDetail getQcIssueResultDetail)
+    {
+   
+        try
+        {
+            // 鏂板URL瑙g爜澶勭悊閫昏緫
+            DecodeUrlEncodedProperties(getQcIssueResultDetail);
+
+            // 璋冪敤 QcIssueResultManager 涓殑 GetProcessNo 鏂规硶鏉ュ惎鍔ㄩ拤閽夊伐浣滄祦瀹炰緥
+            string result = m.GetProcessNo(getQcIssueResultDetail);
+
+            string getLaboratoryDetailsJson = JsonConvert.SerializeObject(getQcIssueResultDetail, Formatting.Indented);
+            Debug.WriteLine("getQcIssueResultDetail: " + getLaboratoryDetailsJson);
+
+            string jsonPart = result.Substring(result.IndexOf("{"));
+            JObject jsonObject = JObject.Parse(jsonPart);
+            // 鎻愬彇instanceId鐨勫��
+            string instanceId = jsonObject["InstanceId"].ToString();
+
+            dynamic resultInfos = new ExpandoObject();
+            string ProcessNo = instanceId;
+            var save = m.SaveProcessNo(getQcIssueResultDetail.ReleaseNo, instanceId);
+            resultInfos.tbBillList = save;
+
+            return Ok(result);
+        }
+        catch (Exception ex)
+        {
+            // 鎹曡幏寮傚父骞惰繑鍥為敊璇俊鎭�
+            return StatusCode(500, $"鍚姩閽夐拤宸ヤ綔娴佸疄渚嬪け璐�: {ex.Message}");
+        }
+    }
+
+    // 鏂板瑙g爜鏂规硶
+    private void DecodeUrlEncodedProperties(object obj)
+    {
+        if (obj == null) return;
+
+        var properties = obj.GetType().GetProperties();
+        foreach (var prop in properties)
+        {
+            // 鍙鐞嗗瓧绗︿覆绫诲瀷鐨勫睘鎬�
+            if (prop.PropertyType == typeof(string) && prop.CanWrite)
+            {
+                var value = prop.GetValue(obj) as string;
+                if (!string.IsNullOrEmpty(value))
+                {
+                    // 浣跨敤UTF8缂栫爜杩涜瑙g爜
+                    var decodedValue = HttpUtility.UrlDecode(value, Encoding.UTF8);
+                    prop.SetValue(obj, decodedValue);
+                }
+            }
+        }
+    }
+
+    [HttpPost("Save")]
+    public ResponseResult Save(ErpQcIssueResult erpQcIssueResult)
+    {
+        var entity = new MessageCenter();
+        entity.TableName = TableName;
+        entity.Url = URL + "Save";
+        entity.Method = METHOD;
+        entity.Data = JsonConvert.SerializeObject(erpQcIssueResult);
+        entity.Status = 1;
+        entity.CreateBy = "PL017";
+        try
+        {
+            dynamic resultInfos = new ExpandoObject();
+            var save = m.Save(erpQcIssueResult);
+            //resultInfos.tbBillList = save;
+
+            //entity.Result = 0;
+            //if (save) entity.Result = 1;
+
+            //entity.DealWith = 1;
+            //_manager.save(entity);
+
+            return new ResponseResult
+            {
+                status = 0,
+                message = "OK",
+                data = save
+            };
+        }
+        catch (Exception ex)
+        {
+            entity.Result = 0;
+
+            entity.DealWith = 0;
+
+            entity.ResultData = ex.Message;
+
+            _manager.save(entity);
+
+            return ResponseResult.ResponseError(ex);
+        }
+    }
+
+}
+

--
Gitblit v1.9.3