zjh
2025-06-05 f3047bc98b1ace53f1ee09beca82c3864bb5957e
StandardPda/MES.Service/service/QC/LljService.cs
@@ -5,12 +5,19 @@
using MES.Service.util;
using MySqlConnector;
using Newtonsoft.Json;
using RestSharp;
using SharpCompress.Factories;
using SqlSugar;
using System.ComponentModel;
using System.Data;
using System.Xml.Linq;
using ZstdSharp.Unsafe;
using System.Net.Http;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using DbType = System.Data.DbType;
using System.Text;
using System.Security.Cryptography;
using AngleSharp.Io;
namespace MES.Service.service.QC;
@@ -68,7 +75,9 @@
            .WhereIF(queryObj.SelectedIndex == "1" && queryObj.SearchValue != null && queryObj.SearchValue != "", (a, b, d) => (a.ItemNo.ToLower().Contains(queryObj.SearchValue.ToLower())))
            .WhereIF(queryObj.SelectedIndex == "2" && queryObj.SearchValue != null && queryObj.SearchValue != "", (a, b, d) => (a.ItemName.ToLower().Contains(queryObj.SearchValue.ToLower())))
            .WhereIF(queryObj.SelectedIndex == "3" && queryObj.SearchValue != null && queryObj.SearchValue != "", (a, b, d) => (a.SuppName.ToLower().Contains(queryObj.SearchValue.ToLower())))
            .WhereIF(queryObj.SelectedIndex == "4" && queryObj.SearchValue != null && queryObj.SearchValue != "", (a, b, d, e) => (e.Fname.ToLower().Contains(queryObj.SearchValue.ToLower())))
            .WhereIF(queryObj.result== "已完成", (a, b, d, e) => (a.IqcDate>= queryObj.startDate.ToDateTime()&& a.IqcDate <= queryObj.endDate.ToDateTime().AddDays(1)))
            .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
            {
@@ -359,6 +368,247 @@
        return msg;
    }
    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; }
    }
    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();
        byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
        return BitConverter.ToString(hashBytes)
                          .Replace("-", "")
                          .ToLowerInvariant();
    }
    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()
            };
            string appSecret = DataAcquisitionConfiguration.APP_SECRET;
            // 生成签名
            string sign = BuildCurrentSign(
                JsonConvert.SerializeObject(apiParam),
                appSecret);
            apiParam.sign = sign;
            return new XkyCommonParam
            {
                commonParam = apiParam
            };
        }
    }
    public async Task<string[]> SignDelivery(string id)
    {
        string[] msg = new string[2];
        //发起请求,签收送货单
        try
        {
            var requestData = XkyCommonParam.GetInit();
            requestData.body = new BodyParam
            {
                erpCode = "Z106",
                dnXkNo = id
            };
            // 序列化为JSON
            string json = JsonConvert.SerializeObject(requestData);
        using (var client = new HttpClient())
        {
            // 设置请求内容
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            // 发送POST请求
            HttpResponseMessage response = await client.PostAsync(
                "https://openapi.xiekeyun.com/delivery/updateDeliveryStatus.json",
                content);
            // 处理响应
            if (response.IsSuccessStatusCode)
            {
                string 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;
    }
    private string ExtractSubstring(string input, char startChar, char endChar)
    {
        var startIndex = input.IndexOf(startChar);
@@ -434,6 +684,7 @@
                    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)
            .GroupBy((a, b) => new
            {
                a.Id,
@@ -687,6 +938,144 @@
        return rkjDto;
    }
    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
                                    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 + "'");
        return SQLHelper.ExecuteQuery(sql);
    }
    public DataTable getImgBDlist(string id)
    {
        OracleSQLHelper SQLHelper = new();
        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 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>();
        for (int i = 0; i <dataTable1.Rows.Count; i++)
        {
            Component component = new Component();
            component.Name= 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())
                {
                    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")
                    {
                        component.SelectedSpec = index;
                        component.SelectedMfg = index;
                    }
                    index++;
                }
            }
            Components.Add(component);
        }
        return Components;
    }
    public DataTable getBlmsItem()
    {
        OracleSQLHelper SQLHelper = new();
        //查不良描述
        var sql1 = string.Format(@"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");
        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");
        return SQLHelper.ExecuteQuery(sql1);
    }
    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 + "' ");
        SQLHelper.ExecuteQuery(sql1);
        string rowId = "";
        for (int 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 + ") ");
        SQLHelper.ExecuteQuery(sql2);
    }
    public string[] YzxImgVerify(string id)
    {
        string[] 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);
        if (db.Rows.Count > 0)
        {
            msgStr[1] = "元器件:";
            for (int i = 0; i < db.Rows.Count; i++)
            {
                msgStr[1] += db.Rows[i]["ITEMNAME"]+ ",";
            }
            msgStr[1] += "未完成图片上传,请上传!";
            msgStr[0] = "1";
        }
        else
        {
            msgStr[0] = "0";
            msgStr[1] = "ok";
        }
    return msgStr;
    }
    public int UpdateQSItemDetail(MesQaItemsDetectDetail12 detail)
    {
        var withOracle = SqlSugarHelper.UseTransactionWithOracle(db =>
@@ -753,8 +1142,8 @@
        return SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<MesQaItemsDetectDetail5>()
                // .SetColumns(it =>
                //     it.Remarks == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值
                 .SetColumns(it =>
                     it.Funit == dto.Remarks) //SetColumns是可以叠加的 写2个就2个字段赋值
                .Where(it => it.Id == dto.pid)
                .ExecuteCommand();
        });
@@ -877,4 +1266,27 @@
        [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 object Data { get; set; }
        [JsonProperty("curServerTime")]
        public long CurServerTime { get; set; }
        // 如果需要时间转换可以添加这个属性
        public DateTime ServerTime => DateTimeOffset.FromUnixTimeMilliseconds(CurServerTime).DateTime;
    }
}