zjh
2025-07-18 8276722de62e0be1e68adf65f150686a236268bd
StandardPda/MES.Service/service/QC/LljService.cs
@@ -1,16 +1,15 @@
using Masuit.Tools;
using Dm.Config;
using Masuit.Tools;
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Modes;
using MES.Service.util;
using MySqlConnector;
using Newtonsoft.Json;
using SharpCompress.Factories;
using SqlSugar;
using System.ComponentModel;
using System.Data;
using System.Xml.Linq;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json.Serialization;
using DbType = System.Data.DbType;
@@ -34,14 +33,16 @@
        var pageList = db
            .Queryable<LtsLlj, IqcBefore, VMesQaItemsDetect01, SysUser,
                IqcBeforeFrom, SysUser, InspectorChangeLog, SysUser>((a, b, d, e, f, g,h,i) =>
                IqcBeforeFrom, SysUser, InspectorChangeLog, SysUser>((a, b, d,
                    e, f, g, h, i) =>
                new JoinQueryInfos(JoinType.Left, a.ItemId == b.ItemId,
                    JoinType.Inner, a.Id == d.Id,
                    JoinType.Left, a.CreateBy == e.Fcode,
                    JoinType.Left, f.Id == b.PID,
                    JoinType.Left, f.Sid == g.Fid,
                    JoinType.Left,a.ReleaseNo==h.InspectionNo && h.IsValid=="Y",
                    JoinType.Left,i.Fcode==h.Inspector
                    JoinType.Left,
                    a.ReleaseNo == h.InspectionNo && h.IsValid == "Y",
                    JoinType.Left, i.Fcode == h.Inspector
                ))
            .WhereIF(
                StringUtil.IsNotNullOrEmpty(queryObj.result) &&
@@ -55,6 +56,7 @@
            //    itemIds is { Length: > 0 },
            //    (a, b, c) => itemIds.Contains(a.ItemId))
            .WhereIF(id > 0, (a, b, d) => a.Id == id)
            .WhereIF(queryObj.arrivalFilter >= 0, (a, b, d) => a.IsArrival == queryObj.arrivalFilter)
            .WhereIF(queryObj.createUser!="PL017"&& queryObj.UserIndex=="0", (a, b, d, e, f, g,h, i) => (g.Fcode == queryObj.createUser || i.Fcode == queryObj.createUser))//判断此单的检验员,或者检验为空就显示此单据
            //加筛选条件,根据供应商,物料编码,物料名称,项目搜索
            //.WhereIF(queryObj.SearchValue != null && queryObj.SearchValue != "",
@@ -73,11 +75,11 @@
            .WhereIF(queryObj.result == "已完成" && queryObj.state!= "所有状态",(a, b, d, e) => (a.FcheckResu == queryObj.state))
            // .WhereIF(queryObj.result == "未完成" && queryObj.SearchValue != null && queryObj.SearchValue != "", (a, b, d, e) => (e.Fname.ToLower().Contains(queryObj.SearchValue.ToLower())))
            //.OrderByDescending((a, b, d) => a.Id)
            .Select((a, b, d, e, f, g,h,i) => new LtsLlj
            .Select((a, b, d, e, f, g, h, i) => new LtsLlj
            {
                //UserName = g.Fname,
                //UserName = (i.Fname!=null ||i.Fname!="") ? i.Fname : g.Fname,
                UserName = (i.Fname!=null ||i.Fname!="") ? i.Fname : g.Fname,
                UserName = i.Fname != null || i.Fname != "" ? i.Fname : g.Fname,
                FIRST = d.First,
                CreateUserName = e.Fname,
                NewFngDesc = d.NewFngDesc,
@@ -208,7 +210,7 @@
    /// <summary>
    /// 调用存储过程,重新获取检验项目
    ///     调用存储过程,重新获取检验项目
    /// </summary>
    /// <param name="itemNo"></param>
    /// <param name="quantity"></param>
@@ -230,9 +232,9 @@
        var parameters = new List<SugarParameter>
        {
            new("P_RELEASE_NO", releaseNo,
          DbType.String, ParameterDirection.Input),
      outputResult,
      outputMessage
                DbType.String, ParameterDirection.Input),
            outputResult,
            outputMessage
        };
        var db = SqlSugarHelper.GetInstance();
@@ -245,24 +247,22 @@
        // 获取输出参数的值
        var resultValue = outputResult.Value?.ToString();
        var messageValue = outputMessage.Value?.ToString();
        string[] msg = new string[2];
        var msg = new string[2];
        msg[0] = resultValue;
        msg[1] = messageValue;
        return msg;
    }
    /// <summary>
    /// 保存新检验员
    ///     保存新检验员
    /// </summary>
    /// <param name="NewStaffUserID">新检验员ID</param>
    /// <param name="userID">修改人</param>
    /// <param name="releaseNo">检验单号</param>
    /// <returns></returns>
    public string[] SaveCheckBy(string NewStaffUserID, string userID, string releaseNo)
    public string[] SaveCheckBy(string NewStaffUserID, string userID,
        string releaseNo)
    {
        // 定义输出参数
        var outputResult = new SugarParameter("o_Result", null,
@@ -277,14 +277,14 @@
        var parameters = new List<SugarParameter>
        {
            new("P_FCHECK_BY", NewStaffUserID,
          DbType.String, ParameterDirection.Input),
              new("p_Release_No", releaseNo,
          DbType.String, ParameterDirection.Input),
                DbType.String, ParameterDirection.Input),
            new("p_Release_No", releaseNo,
                DbType.String, ParameterDirection.Input),
            new("p_User", userID,
          DbType.String, ParameterDirection.Input),
      outputResult,
      outputMessage
                DbType.String, ParameterDirection.Input),
            outputResult,
            outputMessage
        };
        var db = SqlSugarHelper.GetInstance();
@@ -297,13 +297,11 @@
        // 获取输出参数的值
        var resultValue = outputResult.Value?.ToString();
        var messageValue = outputMessage.Value?.ToString();
        string[] msg = new string[2];
        var msg = new string[2];
        msg[0] = resultValue;
        msg[1] = messageValue;
        return msg;
    }
    public string[] SaveSysSubmit(SysSubmit sysSubmit)
@@ -321,30 +319,30 @@
        var parameters = new List<SugarParameter>
        {
            new("PI_BILLNO", sysSubmit.PI_BILLNO,
          DbType.String, ParameterDirection.Input),
             new("PI_USER", sysSubmit.PI_USER,
          DbType.String, ParameterDirection.Input),
              new("PI_SAMPLE_STATUS", sysSubmit.PI_SAMPLE_STATUS,
          DbType.String, ParameterDirection.Input),
               new("PI_SAMPLE_TYPE", sysSubmit.PI_SAMPLE_TYPE,
          DbType.String, ParameterDirection.Input),
                new("PI_SAMPLE_REASON", sysSubmit.PI_SAMPLE_REASON,
          DbType.String, ParameterDirection.Input),
                 new("PI_INSPECT_TYPE", sysSubmit.PI_INSPECT_TYPE,
          DbType.String, ParameterDirection.Input),
                  new("PI_SAMPLE_PREPARATION", sysSubmit.PI_SAMPLE_PREPARATION,
          DbType.String, ParameterDirection.Input),
                   new("PI_URGENCY", sysSubmit.PI_URGENCY,
          DbType.String, ParameterDirection.Input),
                    new("PI_FIRMWAREVERSION", sysSubmit.PI_FIRMWAREVERSION,
          DbType.String, ParameterDirection.Input),
                     new("PI_HARDWAREVERSION", sysSubmit.PI_HARDWAREVERSION,
          DbType.String, ParameterDirection.Input),
                      new("PI_REMARK", sysSubmit.PI_REMARK,
          DbType.String, ParameterDirection.Input),
                DbType.String, ParameterDirection.Input),
            new("PI_USER", sysSubmit.PI_USER,
                DbType.String, ParameterDirection.Input),
            new("PI_SAMPLE_STATUS", sysSubmit.PI_SAMPLE_STATUS,
                DbType.String, ParameterDirection.Input),
            new("PI_SAMPLE_TYPE", sysSubmit.PI_SAMPLE_TYPE,
                DbType.String, ParameterDirection.Input),
            new("PI_SAMPLE_REASON", sysSubmit.PI_SAMPLE_REASON,
                DbType.String, ParameterDirection.Input),
            new("PI_INSPECT_TYPE", sysSubmit.PI_INSPECT_TYPE,
                DbType.String, ParameterDirection.Input),
            new("PI_SAMPLE_PREPARATION", sysSubmit.PI_SAMPLE_PREPARATION,
                DbType.String, ParameterDirection.Input),
            new("PI_URGENCY", sysSubmit.PI_URGENCY,
                DbType.String, ParameterDirection.Input),
            new("PI_FIRMWAREVERSION", sysSubmit.PI_FIRMWAREVERSION,
                DbType.String, ParameterDirection.Input),
            new("PI_HARDWAREVERSION", sysSubmit.PI_HARDWAREVERSION,
                DbType.String, ParameterDirection.Input),
            new("PI_REMARK", sysSubmit.PI_REMARK,
                DbType.String, ParameterDirection.Input),
            outputResult,
            outputMessage
  };
        };
        var db = SqlSugarHelper.GetInstance();
@@ -356,12 +354,661 @@
        // 获取输出参数的值
        var resultValue = outputResult.Value?.ToString();
        var messageValue = outputMessage.Value?.ToString();
        string[] msg = new string[2];
        var msg = new string[2];
        msg[0] = resultValue;
        msg[1] = messageValue;
        return msg;
    }
    public static string BuildCurrentSign(string paramJson, string appSecret)
    {
        var commonDict = new Dictionary<string, string>();
        var jsonDict =
            JsonConvert
                .DeserializeObject<Dictionary<string, object>>(paramJson);
        var keyList = new List<string>();
        foreach (var entry in jsonDict)
        {
            if (entry.Key.Equals("sign", StringComparison.OrdinalIgnoreCase))
                continue;
            var value = entry.Value?.ToString().Trim() ?? "";
            commonDict[entry.Key] = value;
            keyList.Add(entry.Key);
        }
        // 按字母顺序排序键
        keyList.Sort((x, y) => string.Compare(x, y, StringComparison.Ordinal));
        // 拼接签名字符串
        var sb = new StringBuilder();
        foreach (var key in keyList) sb.Append(commonDict[key]).Append(":");
        sb.Append(appSecret);
        // 计算MD5
        using var md5 = MD5.Create();
        var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
        return BitConverter.ToString(hashBytes)
            .Replace("-", "")
            .ToLowerInvariant();
    }
    public async Task<string[]> SignDelivery(string id)
    {
        var msg = new string[2];
        //发起请求,签收送货单
        try
        {
            var requestData = XkyCommonParam.GetInit();
            requestData.body = new BodyParam
            {
                erpCode = "Z106",
                dnXkNo = id
            };
            // 序列化为JSON
            var json = JsonConvert.SerializeObject(requestData);
            using (var client = new HttpClient())
            {
                // 设置请求内容
                var content = new StringContent(json, Encoding.UTF8,
                    "application/json");
                // 发送POST请求
                var response = await client.PostAsync(
                    "https://openapi.xiekeyun.com/delivery/updateDeliveryStatus.json",
                    content);
                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseBody =
                        await response.Content.ReadAsStringAsync();
                    var result =
                        JsonConvert.DeserializeObject<XKYApiResponse>(
                            responseBody);
                    //成功后手动下推到货单
                    if (result.Result == 1)
                    {
                        // 定义输出参数
                        var outputMessage = new SugarParameter("C_RESULT", null,
                            DbType.String,
                            ParameterDirection.Output, 4000);
                        // 定义输入参数
                        var parameters = new List<SugarParameter>
                        {
                            new("C_IN_STR", "送货单签收[BTNOK[PL017[" + id,
                                DbType.String, ParameterDirection.Input),
                            outputMessage
                        };
                        var db = SqlSugarHelper.GetInstance();
                        // 使用 SqlSugar 执行存储过程
                        db.Ado.ExecuteCommand(
                            "BEGIN PRC_RF_PDA_RECEIPT_BTN(:C_IN_STR,:C_RESULT); END;",
                            parameters.ToArray());
                        // 获取输出参数的值
                        var messageValue = outputMessage.Value?.ToString();
                        msg[0] = "0";
                        msg[1] = messageValue;
                    }
                    else
                    {
                        if (result.ErrorMsg == "出货单据不是已送货状态!")
                        {
                            // 定义输出参数
                            var outputMessage = new SugarParameter("C_RESULT",
                                null,
                                DbType.String,
                                ParameterDirection.Output, 4000);
                            // 定义输入参数
                            var parameters = new List<SugarParameter>
                            {
                                new("C_IN_STR", "送货单签收[BTNOK[PL017[" + id,
                                    DbType.String, ParameterDirection.Input),
                                outputMessage
                            };
                            var db = SqlSugarHelper.GetInstance();
                            // 使用 SqlSugar 执行存储过程
                            db.Ado.ExecuteCommand(
                                "BEGIN PRC_RF_PDA_RECEIPT_BTN(:C_IN_STR,:C_RESULT); END;",
                                parameters.ToArray());
                            // 获取输出参数的值
                            var messageValue = outputMessage.Value?.ToString();
                            msg[0] = "0";
                            msg[1] = messageValue;
                        }
                        else
                        {
                            msg[0] = "1";
                            msg[1] = "002[" + id + "签收失败," + result.ErrorMsg;
                        }
                    }
                }
                else
                {
                    msg[0] = "1";
                    msg[1] = $"002[{id}签收失败,请求失败,状态码:{response.StatusCode}";
                }
            }
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"002[请求失败,状态码:{ex.Message}";
        }
        //msg[0] = "1";
        //msg[1] = responseBody;
        return msg;
    }
    public async Task<string[]> SignDelivery2(string id,string c_user)
    {
        var msg = new string[2];
        //发起请求,签收送货单
        try
        {
            var requestData = XkyCommonParam.GetInit();
            requestData.body = new BodyParam
            {
                erpCode = "Z106",
                dnXkNo = id
            };
            // 序列化为JSON
            var json = JsonConvert.SerializeObject(requestData);
            using (var client = new HttpClient())
            {
                // 设置请求内容
                var content = new StringContent(json, Encoding.UTF8,
                    "application/json");
                // 发送POST请求
                var response = await client.PostAsync(
                    "https://openapi.xiekeyun.com/delivery/updateDeliveryStatus.json",
                    content);
                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseBody =
                        await response.Content.ReadAsStringAsync();
                    var result =
                        JsonConvert.DeserializeObject<XKYApiResponse>(
                            responseBody);
                    //成功后手动下推到货单
                    if (result.Result == 1)
                    {
                        // 定义输出参数
                        var outputMessage = new SugarParameter("C_RESULT", null,
                            DbType.String,
                            ParameterDirection.Output, 4000);
                        // 定义输入参数
                        var parameters = new List<SugarParameter>
                        {
                            new("C_IN_STR", "送货单签收[BTNOK["+c_user+"[" + id,
                                DbType.String, ParameterDirection.Input),
                            outputMessage
                        };
                        var db = SqlSugarHelper.GetInstance();
                        // 使用 SqlSugar 执行存储过程
                        db.Ado.ExecuteCommand(
                            "BEGIN PRC_RF_PDA_RECEIPT_BTN(:C_IN_STR,:C_RESULT); END;",
                            parameters.ToArray());
                        // 获取输出参数的值
                        var messageValue = outputMessage.Value?.ToString();
                        msg[0] = "0";
                        msg[1] = messageValue;
                    }
                    else
                    {
                        if (result.ErrorMsg == "出货单据不是已送货状态!")
                        {
                            // 定义输出参数
                            var outputMessage = new SugarParameter("C_RESULT",
                                null,
                                DbType.String,
                                ParameterDirection.Output, 4000);
                            // 定义输入参数
                            var parameters = new List<SugarParameter>
                            {
                                new("C_IN_STR", "送货单签收[BTNOK["+c_user+"[" + id,
                                    DbType.String, ParameterDirection.Input),
                                outputMessage
                            };
                            var db = SqlSugarHelper.GetInstance();
                            // 使用 SqlSugar 执行存储过程
                            db.Ado.ExecuteCommand(
                                "BEGIN PRC_RF_PDA_RECEIPT_BTN(:C_IN_STR,:C_RESULT); END;",
                                parameters.ToArray());
                            // 获取输出参数的值
                            var messageValue = outputMessage.Value?.ToString();
                            msg[0] = "0";
                            msg[1] = messageValue;
                        }
                        else
                        {
                            msg[0] = "1";
                            msg[1] = "002[" + id + "签收失败," + result.ErrorMsg;
                        }
                    }
                }
                else
                {
                    msg[0] = "1";
                    msg[1] = $"002[{id}签收失败,请求失败,状态码:{response.StatusCode}";
                }
            }
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"002[请求失败,状态码:{ex.Message}";
        }
        //msg[0] = "1";
        //msg[1] = responseBody;
        return msg;
    }
    public async Task<string[]> getTestXKYSign()
    {
        var msg = new string[2];
        //发起请求,签收送货单
        try
        {
            var requestData = XkyCommonParam.GetTestInit();
            msg[0] = "0";
            msg[1] = requestData.ToJsonString();
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"002[请求失败,状态码:{ex.Message}";
        }
        //msg[0] = "1";
        //msg[1] = responseBody;
        return msg;
    }
    /// <summary>
    /// 发布携客云改善报告
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<string[]> SaveXkyImproveReport(string id)
    {
        var msg = new string[2];
        try
        {
            //表头数据
            string MianSql= "select  " +
                "B.SUPP_NO," +
                "CASE WHEN REPORTTYPE = '准入评估改善' THEN '1' WHEN REPORTTYPE = '物料准入改善' THEN '2' WHEN REPORTTYPE = '绩效改善' THEN '3' WHEN REPORTTYPE = '违约事项改善' THEN '4' ELSE '3' END AS DEFECT_LEVEL," +
                "(REQUIRED_DATE - TO_DATE('1970-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss')) * 86400000 AS timestamp from MES_IQC_ABNORMAL_FEEDBACK A  left join MES_SUPPLIER B on A.SUPPLIER_ID=B.ID " +
                "where A.id = '"+id+"'";
            //表身数据
            string DetailSql = "select " +
                "DEFECT_ANALYSIS," +
                "CASE WHEN DEFECT_LEVEL = '轻微缺陷' THEN 0 WHEN DEFECT_LEVEL = '严重缺陷' THEN 1 WHEN DEFECT_LEVEL = '致命缺陷' THEN 2 ELSE 0 END AS DEFECT_LEVEL from MES_IQC_ABNORMAL_FEEDBACK_DETS " +
                "where FID='"+id+"' order by id asc";
            OracleSQLHelper SQLHelper = new();
            DataTable MianDB= SQLHelper.ExecuteQuery(MianSql);
            DataTable DetailDB = SQLHelper.ExecuteQuery(DetailSql);
            var requestData = XkyinnerVendorParam.GetInit();
            requestData.body = new BodyImproveReport
            {
                erpCode = "C003",
                innerVendorCode = MianDB.Rows[0]["SUPP_NO"].ToString(),
                reportType= int.Parse(MianDB.Rows[0]["DEFECT_LEVEL"].ToString()),
                completionDate= Convert.ToInt64(MianDB.Rows[0]["timestamp"]) ,
                lineList= new List<LineItem>(),
                isPublish=1
            };
            for (int i = 0; i < DetailDB.Rows.Count; i++)
            {
                requestData.body.lineList.Add(new LineItem
                {
                    questionDesc = DetailDB.Rows[i]["DEFECT_ANALYSIS"].ToString(),
                    questionGrade = Convert.ToInt32(DetailDB.Rows[i]["DEFECT_LEVEL"])
                });
            }
            // 序列化为JSON
            var json = JsonConvert.SerializeObject(requestData);
            using (var client = new HttpClient())
            {
                // 设置请求内容
                var content = new StringContent(json, Encoding.UTF8,
                    "application/json");
                // 发送POST请求
                var response = await client.PostAsync(
                    "https://openapi.xiekeyun.com/improveReport/save.json",
                    content);
                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseBody =
                        await response.Content.ReadAsStringAsync();
                    var result =
                        JsonConvert.DeserializeObject<XKYApiResponse>(
                            responseBody);
                    //成功后返回结果,前台响应
                    if (result.Result == 1)
                    {
                        string updateSql = "update MES_IQC_ABNORMAL_FEEDBACK set SRM_IMPROVE_NO='"+ result.Data.irXkNo + "',REPORT_RELEASE=1 where ID='"+id+"'";
                        SQLHelper.ExecuteQuery(updateSql);
                        // 定义输出参数
                        msg[0] = "0";
                        msg[1] = $"发布成功!";
                    }
                    else
                    {
                        // 定义输出参数
                        msg[0] = "1";
                        msg[1] = $"发布失败!{result.ErrorMsg}";
                    }
                }
                else
                {
                    msg[0] = "1";
                    msg[1] = $"{id}发布失败,请求失败,状态码:{response.StatusCode}";
                }
            }
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"请求失败,状态码:{ex.Message}";
        }
        return msg;
    }
    /// <summary>
    /// 刷新携客云改善报告,更新供应商回复信息
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<string[]> FlushedXkyImproveReport(string id)
    {
        var msg = new string[2];
        try
        {
            string MianSql = "";
            if (id!=null &&id!="")
            {
                //查询没有供应商回复的改善报告
                 MianSql = "select SRM_IMPROVE_NO from MES_IQC_ABNORMAL_FEEDBACK where REPORT_RELEASE=1 and SRM_IMPROVE_NO is not null and SUPPLIER_REPLY_RELEASE=0 and SRM_IMPROVE_NO="+id+"";
            }
            else
            {
                //查询没有供应商回复的改善报告
                 MianSql = "select SRM_IMPROVE_NO from MES_IQC_ABNORMAL_FEEDBACK where REPORT_RELEASE=1 and SRM_IMPROVE_NO is not null and SUPPLIER_REPLY_RELEASE=0";
            }
            OracleSQLHelper SQLHelper = new();
            DataTable MianDB = SQLHelper.ExecuteQuery(MianSql);
            // 定义输出参数
            msg[0] = "0";
            msg[1] = $"刷新成功!";
            for (int i = 0; i < MianDB.Rows.Count; i++)
            {
                var requestData = XkyFlushedrVendorParam.GetInit();
                requestData.body = new BodyFlushedImproveReport
                {
                    erpCode = "C003",
                    irXkNo = MianDB.Rows[i]["SRM_IMPROVE_NO"].ToString()
                };
                // 序列化为JSON
                var json = JsonConvert.SerializeObject(requestData);
                using (var client = new HttpClient())
                {
                    // 设置请求内容
                    var content = new StringContent(json, Encoding.UTF8,
                        "application/json");
                    // 发送POST请求
                    var response = await client.PostAsync(
                        "https://openapi.xiekeyun.com/improveReport/details.json",
                        content);
                    // 处理响应
                    if (response.IsSuccessStatusCode)
                    {
                        var responseBody =
                            await response.Content.ReadAsStringAsync();
                        var result =
                            JsonConvert.DeserializeObject<XKYApiResponse>(
                                responseBody);
                        //成功后返回结果,前台响应
                        int resultCode = 0;
                        if (result.Result == 1)
                        {
                            //查询mes系统对应携客云改善报告的ID
                            string xkyIDSql = "select B.id from MES_IQC_ABNORMAL_FEEDBACK A left join MES_IQC_ABNORMAL_FEEDBACK_DETS B on A.id = B.FID where SRM_IMPROVE_NO = '"+ MianDB.Rows[i]["SRM_IMPROVE_NO"].ToString() + "' order by B.id asc";
                            string updateSql = "";
                            DataTable xkyIDDB = SQLHelper.ExecuteQuery(xkyIDSql);
                            for (int j = 0; j < result.Data.lineList.Count; j++)
                            {
                                if (result.Data.lineList[j].reasonAnalyze!=null && result.Data.lineList[j].reasonAnalyze != "")
                                {
                                    if (resultCode==0)
                                    {
                                        //改供应商回复状态
                                        updateSql = "update MES_IQC_ABNORMAL_FEEDBACK set SUPPLIER_REPLY_RELEASE=1 where SRM_IMPROVE_NO='"+  MianDB.Rows[i]["SRM_IMPROVE_NO"].ToString() + "'";
                                        resultCode++;
                                        SQLHelper.ExecuteQuery(updateSql);
                                    }
                                    //改明细
                                    updateSql = "update MES_IQC_ABNORMAL_FEEDBACK_DETS set " +
                                        "ROOT_CAUSE_ANALYSIS='"+ result.Data.lineList[j].reasonAnalyze + "'," +
                                        "IMPROVEMENT_ACTION='"+ result.Data.lineList[j].correctPreventMeasure + "'," +
                                        "ESTIMATED_DATE=to_date('" + ParseUnixTimestamp(result.Data.lineList[j].expectedFinishTime) + "','MM/DD/YYYY HH24:MI:SS') where id='" + xkyIDDB.Rows[j]["id"].ToString() + "'";
                                    SQLHelper.ExecuteQuery(updateSql);
                                }
                            }
                            // 定义输出参数
                            msg[0] = "0";
                            msg[1] = $"刷新成功!";
                        }
                        else
                        {
                            // 定义输出参数
                            msg[0] = "1";
                            msg[1] = $"刷新失败!{result.ErrorMsg}";
                        }
                    }
                    else
                    {
                        msg[0] = "1";
                        msg[1] = $"{id}刷新失败,请求失败,状态码:{response.StatusCode}";
                    }
                }
            }
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"请求失败,状态码:{ex.Message}";
        }
        return msg;
    }
    /// <summary>
    /// 审核携客云改善报告
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<string[]> AuditXkyImproveReport(string id)
    {
        var msg = new string[2];
        try
        {
            string MianSql = "";
            MianSql = "select SRM_IMPROVE_NO,CASE WHEN JUDGMENT_RESULT = '已退回' THEN 4 WHEN JUDGMENT_RESULT = '不合格' THEN 5 WHEN JUDGMENT_RESULT = '结案' THEN 6  END AS status from MES_IQC_ABNORMAL_FEEDBACK where  SRM_IMPROVE_NO=" + id + "";
            //表身数据
            string DetailSql = "select  VERIFICATION_DESC, CASE WHEN VERIFICATION_RESULT = '合格' THEN 0 WHEN VERIFICATION_RESULT = '不合格' THEN 1  END AS DEFECT_LEVEL from MES_IQC_ABNORMAL_FEEDBACK A left join MES_IQC_ABNORMAL_FEEDBACK_DETS b on A.id=B.FID  where SRM_IMPROVE_NO= '" + id+"'";
            OracleSQLHelper SQLHelper = new();
            DataTable MianDB = SQLHelper.ExecuteQuery(MianSql);
            DataTable DetailDB = SQLHelper.ExecuteQuery(DetailSql);
                var requestData = XkyAuditVendorParam.GetInit();
                requestData.body = new BodyAuditImproveReport
                {
                    erpCode = "C003",
                    irXkNo = MianDB.Rows[0]["SRM_IMPROVE_NO"].ToString(),
                    status= Convert.ToInt32(MianDB.Rows[0]["status"]),
                    lineList=new List<AuditLineItem>()
                };
            for (int i = 0; i < DetailDB.Rows.Count; i++)
            {
                requestData.body.lineList.Add(new AuditLineItem
                {
                    lineNo = i+1,
                    checkStatus = Convert.ToInt32(DetailDB.Rows[i]["DEFECT_LEVEL"]),
                    checkPeopleNumber = "031",
                    checkExplain = DetailDB.Rows[i]["VERIFICATION_DESC"].ToString()
                });
            }
            // 序列化为JSON
            var json = JsonConvert.SerializeObject(requestData);
                using (var client = new HttpClient())
                {
                    // 设置请求内容
                    var content = new StringContent(json, Encoding.UTF8,
                        "application/json");
                    // 发送POST请求
                    var response = await client.PostAsync(
                        "https://openapi.xiekeyun.com/improveReport/audit.json",
                        content);
                    // 处理响应
                    if (response.IsSuccessStatusCode)
                    {
                        var responseBody =
                            await response.Content.ReadAsStringAsync();
                        var result =
                            JsonConvert.DeserializeObject<XKYApiResponse>(
                                responseBody);
                        //成功后返回结果,前台响应
                        int resultCode = 0;
                        if (result.Result == 1)
                        {
                        //改状态,改为完结状态
                                string updateSql = "update MES_IQC_ABNORMAL_FEEDBACK set CLOSURE_STATUS=1,CLOSED_DATE=sysdate where SRM_IMPROVE_NO='" + id + "'";
                                SQLHelper.ExecuteQuery(updateSql);
                            // 定义输出参数
                            msg[0] = "0";
                            msg[1] = $"审核成功!";
                        }
                        else
                        {
                            // 定义输出参数
                            msg[0] = "1";
                            msg[1] = $"审核失败!{result.ErrorMsg}";
                        }
                    }
                    else
                    {
                        msg[0] = "1";
                        msg[1] = $"{id}审核失败,请求失败,状态码:{response.StatusCode}";
                    }
                }
        }
        catch (Exception ex)
        {
            msg[0] = "1";
            msg[1] = $"请求失败,状态码:{ex.Message}";
        }
        return msg;
    }
    static DateTime ParseUnixTimestamp(string timestampStr)
    {
        // 尝试解析为长整型
        if (long.TryParse(timestampStr, out long timestamp))
        {
            // 根据位数判断单位(秒或毫秒)
            if (timestampStr.Length <= 10) // 秒级 (10位或更少)
            {
                return DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;
            }
            else // 毫秒级
            {
                return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime;
            }
        }
        throw new FormatException("无效的时间戳格式");
    }
    private string ExtractSubstring(string input, char startChar, char endChar)
    {
        var startIndex = input.IndexOf(startChar);
@@ -430,11 +1077,19 @@
    public List<MesQaItemsDetectDetail5> GetItems(string? releaseNo,
        decimal? id)
    {
        OracleSQLHelper SQLHelper = new();
        var sql =
            @"update MES_QA_ITEMS_DETECT_01 set FCHECK_BEGIN_DATE=sysdate where RELEASE_NO='"+ releaseNo + "' and FCHECK_BEGIN_DATE is null";
        SQLHelper.ExecuteQuery(sql);
        var db = SqlSugarHelper.GetInstance();
        return db.Queryable<MesQaItemsDetectDetail5, MesQaItemsDetectDetail12>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Left, a.Id == b.MainId))
        return db
            .Queryable<MesQaItemsDetectDetail5,
                MesQaItemsDetectDetail12>((a, b) =>
                new JoinQueryInfos(JoinType.Left, a.Id == b.MainId))
            .Where((a, b) => a.ReleaseNo == releaseNo)
            // .WhereIF(id > 0, (a, b) => a.Id == id)
            .OrderByDescending((a, b) => a.FcheckItem)
@@ -479,12 +1134,12 @@
    }
    public DataTable getAllInspectors()
    {
         OracleSQLHelper SQLHelper = new();
         var sql =string.Format(@"select a.USER_NAME label,U.FCODE value from IQC_BEFORE_FROM a JOIN SYS_USER U ON U.FID=A.SID");
         return SQLHelper.ExecuteQuery(sql);
        OracleSQLHelper SQLHelper = new();
        var sql =
            @"select a.USER_NAME label,U.FCODE value from IQC_BEFORE_FROM a JOIN SYS_USER U ON U.FID=A.SID";
        return SQLHelper.ExecuteQuery(sql);
    }
@@ -553,8 +1208,8 @@
        //    result = "不合格";
        else if (noCount >= QsItemOqcItem.FreQty)
            result = "不合格";
        var useTransactionWithOracle = SqlSugarHelper.UseTransactionWithOracle(
            db =>
        var useTransactionWithOracle =
            SqlSugarHelper.UseTransactionWithOracle(db =>
            {
                var commit = 0;
                commit += db.Updateable<MesQaItemsDetectDetail5>()
@@ -695,71 +1350,84 @@
    public DataTable getFromInfo(string BarCode)
    {
        OracleSQLHelper SQLHelper = new();
        var sql = string.Format(@"select b.ID,b.LOT_NO,b.RELEASE_NO,b.FSUBMIT from MES_INV_ITEM_BARCODES A
        var sql = string.Format(
            @"select b.ID,b.LOT_NO,b.RELEASE_NO,b.FSUBMIT from MES_INV_ITEM_BARCODES A
                                    left join MES_QA_ITEMS_DETECT_01 B on A.BILL_NO=b.LOT_NO and A.ITEM_ID=b.ITEM_ID
                                    where ITEM_BARCODE='"+ BarCode + "'");
                                    where ITEM_BARCODE='" + BarCode + "'and b.ID is not null");
        return SQLHelper.ExecuteQuery(sql);
    }
    public int getFromMJCount(string BarCode)
    {
        OracleSQLHelper SQLHelper = new();
        var sql = string.Format(
            @"select count(*) count from MES_INV_ITEM_BARCODES A
         left join MES_INV_ITEM_ARN_DETAIL B on A.BILL_NO=b.CBILL_NO and A.ITEM_ID=b.ITEM_ID
         where ITEM_BARCODE='"+ BarCode + "' and CHECK_STATES='免检'");
        return Convert.ToInt32(SQLHelper.ExecuteQuery(sql).Rows[0]["count"]);
    }
    public DataTable getImgBDlist(string id)
    {
        OracleSQLHelper SQLHelper = new();
        var sql = string.Format(@"select id,FID,IMAGE_DATA from MES_QS_IMAGE where FID="+id+"");
        var sql =
            string.Format(
                @"select id,FID,IMAGE_DATA from MES_QS_IMAGE where FID=" + id +
                "");
        return SQLHelper.ExecuteQuery(sql);
    }
    /// <summary>
    /// 一致性项目
    /// </summary>
    public class Component
    {
        public string Name { get; set; }
        public List<string> Specs { get; set; }
        public List<string> Manufacturers { get; set; }
        public List<string> Id { get; set; }
        public int SelectedSpec { get; set; }
        public int SelectedMfg { get; set; }
    }
    public List<Component> getYzxBDlist(string id)
    {
        OracleSQLHelper SQLHelper = new();
        //查元器件
        var sql1 = string.Format(@"select ITEMNAME from MES_IQC_CONSISTENCY_ck where PID='"+id+"' group by ITEMNAME order by ITEMNAME");
        //var sql1 =
        //    string.Format(
        //        @"select ITEMNAME from MES_IQC_CONSISTENCY_ck where PID='" +
        //        id + "' group by ITEMNAME order by ITEMNAME");
        var sql1 =
            string.Format(
                @"select CASE WHEN max(MULTI_SELECT) is null THEN ''ELSE '【'||max(MULTI_SELECT)||'】' END  as A,ITEMNAME as ITEMNAME   from MES_IQC_CONSISTENCY_ck where PID='"+id+"' group by ITEMNAME order by ITEMNAME");
        //查明细
        var sql2 = string.Format(@"select * from MES_IQC_CONSISTENCY_ck where PID='"+id+"' order by ITEMNAME,ITEMMODE,SUPPNAME");
        DataTable dataTable1= SQLHelper.ExecuteQuery(sql1);
        DataTable dataTable2 = SQLHelper.ExecuteQuery(sql2);
        List<Component> Components = new List<Component>();
        var sql2 =
            string.Format(@"select * from MES_IQC_CONSISTENCY_ck where PID='" +
                          id + "' order by ITEMNAME,ITEMMODE,SUPPNAME");
        var dataTable1 = SQLHelper.ExecuteQuery(sql1);
        var dataTable2 = SQLHelper.ExecuteQuery(sql2);
        var Components = new List<Component>();
        for (int i = 0; i <dataTable1.Rows.Count; i++)
        for (var i = 0; i < dataTable1.Rows.Count; i++)
        {
            Component component = new Component();
            component.Name= dataTable1.Rows[i]["ITEMNAME"].ToString();
            component.Specs= new List<string>();
            var component = new Component();
            component.Name = dataTable1.Rows[i]["A"].ToString()+ dataTable1.Rows[i]["ITEMNAME"].ToString();
            component.Specs = new List<string>();
            component.Manufacturers = new List<string>();
            component.Id = new List<string>();
            component.SelectedSpec = -1;
            component.SelectedMfg = -1;
            int index = 0;
            for (int j = 0; j < dataTable2.Rows.Count; j++)
            {
                if (dataTable2.Rows[j]["ITEMNAME"].ToString()== dataTable1.Rows[i]["ITEMNAME"].ToString())
            var index = 0;
            for (var j = 0; j < dataTable2.Rows.Count; j++)
                if (dataTable2.Rows[j]["ITEMNAME"].ToString() ==
                    dataTable1.Rows[i]["ITEMNAME"].ToString())
                {
                    component.Specs.Add(dataTable2.Rows[j]["ITEMMODE"].ToString());
                    component.Manufacturers.Add(dataTable2.Rows[j]["SUPPNAME"].ToString());
                    component.Specs.Add(dataTable2.Rows[j]["ITEMMODE"]
                        .ToString());
                    component.Manufacturers.Add(dataTable2.Rows[j]["SUPPNAME"]
                        .ToString());
                    component.Id.Add(dataTable2.Rows[j]["ID"].ToString());
                    if (dataTable2.Rows[j]["ISCHACK"].ToString()=="1")
                    if (dataTable2.Rows[j]["ISCHACK"].ToString() == "1")
                    {
                        component.SelectedSpec = index;
                        component.SelectedMfg = index;
                    }
                    index++;
                }
            }
            Components.Add(component);
        }
        return Components;
    }
@@ -767,66 +1435,82 @@
    {
        OracleSQLHelper SQLHelper = new();
        //查不良描述
        var sql1 = string.Format(@"select DEFECT_NAME
        var sql1 = @"select DEFECT_NAME
                                    from MES_DEFECT_CODE A
                                    left join MES_DEFECT_TYPE X ON X.TYPE_NO = A.DEFECT_SORT AND X.COMPANY = A.COMPANY AND X.FACTORY = A.FACTORY");
                                    left join MES_DEFECT_TYPE X ON X.TYPE_NO = A.DEFECT_SORT AND X.COMPANY = A.COMPANY AND X.FACTORY = A.FACTORY";
        return SQLHelper.ExecuteQuery(sql1);
    }
    public DataTable getBlmsItem(string id)
    {
        OracleSQLHelper SQLHelper = new();
        //查不良描述
        var sql1 = string.Format(@"select FCHECK_ITEM,FUNIT from mes_qa_items_detect_detail5 f where RELEASE_NO='"+id+"' and FUNIT is not null order by FCHECK_ITEM");
        var sql1 = string.Format(
            @"select FCHECK_ITEM,FUNIT from mes_qa_items_detect_detail5 f where RELEASE_NO='" +
            id + "' and FUNIT is not null order by FCHECK_ITEM");
        return SQLHelper.ExecuteQuery(sql1);
    }
    public void saveYzxBDlist(string id,DataTable DB)
    public void saveYzxBDlist(string id, DataTable DB)
    {
        OracleSQLHelper SQLHelper = new();
        //先把结果清空
        var sql1 = string.Format(@"update MES_IQC_CONSISTENCY_ck set ISCHACK=0 where PID='"+ id + "' ");
        var sql1 =
            string.Format(
                @"update MES_IQC_CONSISTENCY_ck set ISCHACK=0 where PID='" +
                id + "' ");
        SQLHelper.ExecuteQuery(sql1);
        string rowId = "";
        for (int i = 0; i < DB.Rows.Count; i++)
        {
        var rowId = "";
        for (var i = 0; i < DB.Rows.Count; i++)
            rowId += "'" + DB.Rows[i]["id"] + "',";
        }
        rowId = rowId.Substring(0, rowId.Length - 1);
        //修改结果
        var sql2 = string.Format(@"update MES_IQC_CONSISTENCY_ck set ISCHACK=1 where PID='" + id + "'and id in("+ rowId + ") ");
        var sql2 =
            string.Format(
                @"update MES_IQC_CONSISTENCY_ck set ISCHACK=1 where PID='" +
                id + "'and id in(" + rowId + ") ");
        SQLHelper.ExecuteQuery(sql2);
    }
    public string[] YzxImgVerify(string id)
    {
        string[] msgStr = new string[2];
        var msgStr = new string[2];
        OracleSQLHelper SQLHelper = new();
        //修改结果
        var sql2 = string.Format(@"select A.ITEMNAME from ( select 888||min(id) id,ITEMNAME from MES_IQC_CONSISTENCY_CK where pid='"+ id + "' group by  ITEMNAME) A " +
            "left join MES_QS_IMAGE b on a.id=b.fid where B.id is null order by ITEMNAME");
        DataTable db= SQLHelper.ExecuteQuery(sql2);
        //var sql2 = string.Format(
        //    @"select A.ITEMNAME from ( select 888||min(id) id,ITEMNAME from MES_IQC_CONSISTENCY_CK where pid='" +
        //    id + "' group by  ITEMNAME) A " +
        //    "left join MES_QS_IMAGE b on a.id=b.fid where B.id is null order by ITEMNAME");
        var sql2 = string.Format(
         @"select A.ITEMNAME from ( select 888||min(id) id,ITEMNAME from MES_IQC_CONSISTENCY_CK where pid='"+id.ToString()+ "' and ITEMNAME not in(select ITEMNAME from MES_IQC_CONSISTENCY_CK where PID='"+id.ToString()+"'  and MULTI_SELECT is not null)" +
         "group by  ITEMNAME) A" +
         " left join MES_QS_IMAGE b on a.id=b.fid where B.id is null" +
         " union" +
         " select  '分组:' || MULTI_SELECT as ITEMNAME      from MES_IQC_CONSISTENCY_CK      where pid = '"+id.ToString()+ "'        and MULTI_SELECT is not null and MULTI_SELECT not in(select  A.MULTI_SELECT as ITEMNAME from (select 888 || min(id) id, MULTI_SELECT      from MES_IQC_CONSISTENCY_CK      where pid = '"+id.ToString()+ "'       and MULTI_SELECT is not null      group by MULTI_SELECT,ITEMNAME) A        left join MES_QS_IMAGE b on a.id = b.fid where B.id is not null)     group by MULTI_SELECT");
        var db = SQLHelper.ExecuteQuery(sql2);
        if (db.Rows.Count > 0)
        {
            msgStr[1] = "元器件:";
            for (int i = 0; i < db.Rows.Count; i++)
            {
                msgStr[1] += db.Rows[i]["ITEMNAME"]+ ",";
            }
            for (var i = 0; i < db.Rows.Count; i++)
                msgStr[1] += db.Rows[i]["ITEMNAME"] + ",";
            msgStr[1] += "未完成图片上传,请上传!";
            msgStr[0] = "1";
        }
        else
        else
        {
            msgStr[0] = "0";
            msgStr[1] = "ok";
        }
    return msgStr;
        return msgStr;
    }
    public int UpdateQSItemDetail(MesQaItemsDetectDetail12 detail)
@@ -895,8 +1579,8 @@
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<MesQaItemsDetectDetail5>()
                 .SetColumns(it =>
                     it.Funit == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值
                .SetColumns(it =>
                    it.Funit == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值
                .Where(it => it.Id == dto.pid)
                .ExecuteCommand();
        });
@@ -965,11 +1649,10 @@
            // 获取输出参数的值
            var resultValue = outputResult.Value?.ToString();
            var messageValue = outputMessage.Value?.ToString();
            string[] msg = new string[2];
            var msg = new string[2];
            msg[0] = resultValue;
            msg[1] = messageValue;
            return msg;
        }
        catch (Exception ex)
        {
@@ -1007,6 +1690,379 @@
    }
    /// <summary>
    /// 携客云密钥
    /// </summary>
    public class DataAcquisitionConfiguration
    {
        //测试环境
        public const string TEST_COMPANY_CODE = "55958795";
        public const string TEST_APP_KEY = "ab2d86b6dffabcc81dca6855c727c246";
        public const string TEST_APP_SECRET =
            "01b17babe2a96d5ebd802e67709f33d1";
        public const string TEST_ERP_CODE = "Z106";
        //正式环境
        public const string COMPANY_CODE = "72505985";
        public const string APP_KEY = "a2866f03bb7f76387bfb1a98001f0e31";
        public const string APP_SECRET = "f13bd1bcb130f0090ed92dc021e5f4e1";
        public const string ERP_CODE = "Z106";
    }
    [Serializable]
    public class ApiCommonParam
    {
        //发放给用户的Key
        public string appKey { get; set; }
        //接口版本
        public string version { get; set; }
        //数据所属公司编码
        public string ownerCompanyCode { get; set; }
        //操作者所属公司编码
        public string operateCompanyCode { get; set; }
        //签名
        public string sign { get; set; }
        //时间戳
        public long? timestamps { get; set; }
        ////扩展字段
        //public object Reserver { get; set; }
    }
    [Serializable]
    public class BodyParam
    {
        public string erpCode { get; set; }
        public string dnXkNo { get; set; }
    }
    [Serializable]
    public class BodyFlushedImproveReport
    {
        public string erpCode { get; set; }
        public string irXkNo { get; set; }
    }
    [Serializable]
    public class BodyAuditImproveReport
    {
        public string erpCode { get; set; }
        public string irXkNo { get; set; }
        public int status { get; set; }
        /// <summary>
        /// 单身列表
        /// </summary>
        public List<AuditLineItem> lineList { get; set; }
    }
    public class AuditLineItem
    {
        /// <summary>
        ///    项次
        /// </summary>
        public int lineNo { get; set; }
        /// <summary>
        ///    检核结果 0:合格,1:不合格
        /// </summary>
        public int checkStatus { get; set; }
        /// <summary>
        /// 检核人工号
        /// </summary>
        public string checkExplain { get; set; }
        /// <summary>
        /// 检核说明
        /// </summary>
        public string checkPeopleNumber { get; set; }
    }
    [Serializable]
    public class BodyImproveReport
    {
        /// <summary>
        /// 请求者用户ERP帐号
        /// </summary>
        public string erpCode { get; set; }
        /// <summary>
        /// 内部供应商编码
        /// </summary>
        public string innerVendorCode { get; set; }
        /// <summary>
        /// 报告类型:1 准入评估改善,2 物料准入改善,3 绩效改善,4 违约事项改善
        /// </summary>
        public int reportType { get; set; }  // 根据JSON值使用int
        /// <summary>
        /// 完成日期(毫秒时间戳)
        /// </summary>
        public long completionDate { get; set; }
        // 日期扩展字段(字符串格式)
        public string platformExtendN01 { get; set; }
        public string platformExtendN02 { get; set; }
        public string platformExtendN03 { get; set; }
        /// <summary>
        /// 是否自动发布 0:否 1:是 默认:否
        /// </summary>
        public int isPublish { get; set; }  // 根据JSON值使用int
        /// <summary>
        /// 利润中心/工厂编码
        /// </summary>
        public string profitCenterCode { get; set; }
        /// <summary>
        /// 利润中心/工厂名称
        /// </summary>
        public string profitCenterName { get; set; }
        /// <summary>
        /// 单身列表
        /// </summary>
        public List<LineItem> lineList { get; set; }
    }
    [Serializable]
    public class LineItem
    {
        /// <summary>
        /// 问题描述
        /// </summary>
        public string questionDesc { get; set; }
        /// <summary>
        /// 问题等级 0:次要,1:重要,2:致命
        /// </summary>
        public int questionGrade { get; set; }  // 根据JSON值使用int
    }
    public class XkyCommonParam
    {
        public ApiCommonParam commonParam { get; set; }
        public BodyParam body { get; set; }
        public static XkyCommonParam GetInit()
        {
            var apiParam = new ApiCommonParam
            {
                // 发携客云提供的appKey
                appKey = DataAcquisitionConfiguration.APP_KEY,
                // 接口版本
                version = "1.0",
                // 操作者所属公司编码
                operateCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                // 数据所属公司编码,非集团公司默认赋值为操作公司
                ownerCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                // 当前时间对应的时间戳(秒数)
                timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
            };
            var appSecret = DataAcquisitionConfiguration.APP_SECRET;
            // 生成签名
            var sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyCommonParam
            {
                commonParam = apiParam
            };
        }
        public static XkyCommonParam GetTestInit()
        {
            var apiParam = new ApiCommonParam
            {
                // 发携客云提供的appKey
                appKey = DataAcquisitionConfiguration.TEST_APP_KEY,
                // 接口版本
                version = "1.0",
                // 操作者所属公司编码
                operateCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 数据所属公司编码,非集团公司默认赋值为操作公司
                ownerCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 当前时间对应的时间戳(秒数)
                timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
            };
            var appSecret = DataAcquisitionConfiguration.TEST_APP_SECRET;
            // 生成签名
            var sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyCommonParam
            {
                commonParam = apiParam
            };
        }
    }
    public class XkyinnerVendorParam
    {
        public ApiCommonParam commonParam { get; set; }
        public BodyImproveReport body { get; set; }
        public static XkyinnerVendorParam GetInit()
        {
            var apiParam = new ApiCommonParam
            {
                //// 发携客云提供的appKey
                //appKey = DataAcquisitionConfiguration.APP_KEY,
                //// 接口版本
                //version = "1.0",
                //// 操作者所属公司编码
                //operateCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 数据所属公司编码,非集团公司默认赋值为操作公司
                //ownerCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 当前时间对应的时间戳(秒数)
                //timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
                // 发携客云提供的appKey
                appKey = DataAcquisitionConfiguration.TEST_APP_KEY,
                // 接口版本
                version = "1.0",
                // 操作者所属公司编码
                operateCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 数据所属公司编码,非集团公司默认赋值为操作公司
                ownerCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 当前时间对应的时间戳(秒数)
                timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
            };
           // var appSecret = DataAcquisitionConfiguration.APP_SECRET;
                var appSecret = DataAcquisitionConfiguration.TEST_APP_SECRET;
            // 生成签名
            var sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyinnerVendorParam
            {
                commonParam = apiParam
            };
        }
    }
    public class XkyFlushedrVendorParam
    {
        public ApiCommonParam commonParam { get; set; }
        public BodyFlushedImproveReport body { get; set; }
        public static XkyFlushedrVendorParam GetInit()
        {
            var apiParam = new ApiCommonParam
            {
                //// 发携客云提供的appKey
                //appKey = DataAcquisitionConfiguration.APP_KEY,
                //// 接口版本
                //version = "1.0",
                //// 操作者所属公司编码
                //operateCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 数据所属公司编码,非集团公司默认赋值为操作公司
                //ownerCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 当前时间对应的时间戳(秒数)
                //timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
                // 发携客云提供的appKey
                appKey = DataAcquisitionConfiguration.TEST_APP_KEY,
                // 接口版本
                version = "1.0",
                // 操作者所属公司编码
                operateCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 数据所属公司编码,非集团公司默认赋值为操作公司
                ownerCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 当前时间对应的时间戳(秒数)
                timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
            };
            // var appSecret = DataAcquisitionConfiguration.APP_SECRET;
            var appSecret = DataAcquisitionConfiguration.TEST_APP_SECRET;
            // 生成签名
            var sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyFlushedrVendorParam
            {
                commonParam = apiParam
            };
        }
    }
    public class XkyAuditVendorParam
    {
        public ApiCommonParam commonParam { get; set; }
        public BodyAuditImproveReport body { get; set; }
        public static XkyAuditVendorParam GetInit()
        {
            var apiParam = new ApiCommonParam
            {
                //// 发携客云提供的appKey
                //appKey = DataAcquisitionConfiguration.APP_KEY,
                //// 接口版本
                //version = "1.0",
                //// 操作者所属公司编码
                //operateCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 数据所属公司编码,非集团公司默认赋值为操作公司
                //ownerCompanyCode = DataAcquisitionConfiguration.COMPANY_CODE,
                //// 当前时间对应的时间戳(秒数)
                //timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
                // 发携客云提供的appKey
                appKey = DataAcquisitionConfiguration.TEST_APP_KEY,
                // 接口版本
                version = "1.0",
                // 操作者所属公司编码
                operateCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 数据所属公司编码,非集团公司默认赋值为操作公司
                ownerCompanyCode = DataAcquisitionConfiguration.TEST_COMPANY_CODE,
                // 当前时间对应的时间戳(秒数)
                timestamps = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
            };
            // var appSecret = DataAcquisitionConfiguration.APP_SECRET;
            var appSecret = DataAcquisitionConfiguration.TEST_APP_SECRET;
            // 生成签名
            var sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyAuditVendorParam
            {
                commonParam = apiParam
            };
        }
    }
    /// <summary>
    ///     一致性项目
    /// </summary>
    public class Component
    {
        public string Name { get; set; }
        public List<string> Specs { get; set; }
        public List<string> Manufacturers { get; set; }
        public List<string> Id { get; set; }
        public int SelectedSpec { get; set; }
        public int SelectedMfg { get; set; }
    }
    /// <summary>
    ///     料号图纸接口返回对象
    /// </summary>
    public class ApiResponse
@@ -1019,4 +2075,77 @@
        [JsonProperty("totalCount")] public int TotalCount { get; set; }
    }
    /// <summary>
    ///     携客云接口返回对象
    /// </summary>
    public class XKYApiResponse
    {
        [JsonProperty("errorCode")] public string ErrorCode { get; set; }
        [JsonProperty("errorMsg")] public string ErrorMsg { get; set; }
        [JsonProperty("result")] public int Result { get; set; }
        [JsonProperty("data")] public Root Data { get; set; }
        [JsonProperty("curServerTime")] public long CurServerTime { get; set; }
        // 如果需要时间转换可以添加这个属性
        public DateTime ServerTime => DateTimeOffset
            .FromUnixTimeMilliseconds(CurServerTime).DateTime;
    }
    public class Root
    {
        /// <summary>
        ///
        /// </summary>
        public string irXkNo { get; set; }
        public List<LineListItem> lineList { get; set; }
    }
    public class LineListItem
    {
        /// <summary>
        ///    项次号
        /// </summary>
        public int lineNo { get; set; }
        /// <summary>
        /// 问题描述
        /// </summary>
        public string questionDesc { get; set; }
        /// <summary>
        /// 问题等级 0:次要,1:重要,2:致命
        /// </summary>
        public int questionGrade { get; set; }
        /// <summary>
        /// 原因分析
        /// </summary>
        public string reasonAnalyze { get; set; }
        /// <summary>
        /// 纠正预防措施
        /// </summary>
        public string correctPreventMeasure { get; set; }
        /// <summary>
        /// 负责人
        /// </summary>
        public string principal { get; set; }
        /// <summary>
        ///    预计完成时间对应的时间戳
        /// </summary>
        public string expectedFinishTime { get; set; }
        /// <summary>
        /// 检核说明
        /// </summary>
        public string checkExplain { get; set; }
        /// <summary>
        /// 检核人姓名
        /// </summary>
        public string checkPeopleName { get; set; }
        /// <summary>
        /// 检核结果 0:合格,1:不合格
        /// </summary>
        public string checkStatus { get; set; }
    }
}