cnf
2025-04-28 30c1248ee88dfff420181b145db5c8529163b067
异常处置单接收测试增加,逻辑未写
已添加14个文件
已修改1个文件
1368 ■■■■■ 文件已修改
StandardInterface/MES.Service/Dto/webApi/PLM/BaseObject.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/MES.Service.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/PLM/PLMManager.cs 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs 516 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MESApplication/Controllers/PLM/PLMController.cs 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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; }
}
StandardInterface/MES.Service/Dto/webApi/PLM/RelatedObject.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using 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; }
}
StandardInterface/MES.Service/Dto/webApi/PLM/StdDocument.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
using 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; }
}
StandardInterface/MES.Service/Dto/webApi/QcIssueResult/ErpQcIssueResult.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
using Newtonsoft.Json;
using System.Collections.Generic;
public class ErpQcIssueResult
{
    public string? ProcessNo { get; set; }
    public string? FReview { get; set; }
    public string? QcStatus { get; set; }  // åŽŸQCSTATU改为规范命名
    // æ–°å¢žåˆå¹¶å­—段
    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; }
}
StandardInterface/MES.Service/Dto/webApi/QcIssueResult/QcIssueResult.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
using 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; }
}
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>
StandardInterface/MES.Service/Modes/QcIssueResult/DingNameCode.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using 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; }
}
StandardInterface/MES.Service/Modes/QcIssueResult/GetQcIssueResultDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using 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; }
}
StandardInterface/MES.Service/Modes/QcIssueResult/QcIssueResults.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
using 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; }
}
StandardInterface/MES.Service/Modes/QcIssueResult/UpdateMesQaItems .cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
using 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; }
}
StandardInterface/MES.Service/service/PLM/PLMManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
using 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($"第一完整内容(JSON): {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($"第二完整内容(JSON): {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.通过物料编码(需要唯一)获取物料id
    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 å€¼ç”¨é€—号分隔,并包裹在单引号中
        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
}
StandardInterface/MES.Service/service/PLM/WarehouseDownloadDoc.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
using 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 è¯·æ±‚çš„URL
        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
}
StandardInterface/MES.Service/service/QcIssueResult/QcIssueResultManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,516 @@
using 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 åˆå§‹åŒ–账号Client
     * @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("插入或更新失败");
        }
    }
}
StandardInterface/MESApplication/Controllers/PLM/PLMController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
using 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\"; // æœåС噍D盘下的基础路径
        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
            });
        }
    }
}
StandardInterface/MESApplication/Controllers/QcIssueResult/QcIssueResultController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
using 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解码处理逻辑
            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}");
        }
    }
    // æ–°å¢žè§£ç æ–¹æ³•
    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编码进行解码
                    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);
        }
    }
}