xwt
2025-10-17 707e8f07abb295629f73557759cf0e708ca6b5fa
StandardInterface/MESApplication/Controllers/QC/LljController.cs
@@ -204,6 +204,51 @@
        }
    }
    //savePhsyGid 主表添加破坏实验
    [HttpPost("savePhsyGid")]
    public ResponseResult savePhsyGid([FromBody] LLJDto rkjDto)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var tbBillList =
                new LljService().savePhsyGid(rkjDto);
            resultInfos.tbBillList = tbBillList;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    [HttpPost("saveDropdownFields")]
    public ResponseResult saveDropdownFields([FromBody] LLJDto rkjDto)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var tbBillList =
                new LljService().saveDropdownFields(rkjDto);
            resultInfos.tbBillList = tbBillList;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //saveRemarksPid 子表添加不合格描述
    [HttpPost("saveRemarksPid")]
    public ResponseResult saveRemarksPid([FromBody] LLJDto rkjDto)
@@ -320,11 +365,11 @@
    [HttpPost("getAttachments")]
    public ResponseResult GetAttachments([FromBody] JObject data)
    {
        var releaseNo = data["releaseNo"]?.ToString();
        var itemNo = data["itemNo"]?.ToString();
        try
        {
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            var tbBillList = new LljService().GetAttachments(releaseNo);
            var tbBillList = new LljService().GetAttachments(itemNo);
            if (tbBillList == null || tbBillList.Count == 0)
            {
                return new ResponseResult
@@ -348,36 +393,461 @@
        }
    }
    [HttpGet("DownloadFtpFile")]
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName)
    [HttpGet("PreviewFtpFile")]
    public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    {
        // FTP服务器信息
        string ftpServer = "ftp://36.26.21.214";
        string ftpUser = "hm_ftp";
        string ftpPwd = "dell_123";
        string ftpPath = $"{ftpServer}/IQC/{itemNo}/{fileName}";
        try
        {
            var request = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(ftpPath);
            request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPwd);
            request.UseBinary = true;
            request.UsePassive = false;
            using (var response = (System.Net.FtpWebResponse)request.GetResponse())
            using (var ftpStream = response.GetResponseStream())
            using (var ms = new System.IO.MemoryStream())
            // 添加CORS响应头
            Response.Headers.Add("Access-Control-Allow-Origin", "*");
            Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
            Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type");
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Type, Content-Length");
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            if (fileBytes == null || fileBytes.Length == 0)
            {
                ftpStream.CopyTo(ms);
                ms.Position = 0;
                string contentType = "application/octet-stream";
                // 防御性处理,去除fileName中的回车换行和空格
                fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
                return File(ms.ToArray(), contentType, fileName);
                return NotFound("文件在FTP服务器上不存在");
            }
            var contentType = service.GetContentType(fileName);
            fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
            return File(fileBytes, contentType);
        }
        catch (Exception ex)
        {
            return BadRequest($"FTP下载失败:{ex.Message},ftpPath={ftpPath},fileName={fileName}");
            return StatusCode(500, $"预览文件失败:{ex.Message}");
        }
    }
    [HttpGet("DownloadFtpFile")]
    public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer)
    {
        try
        {
            // 添加CORS响应头 - 关键配置用于解决跨域问题
            Response.Headers.Add("Access-Control-Allow-Origin", "*");
            Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
            Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");
            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition, Content-Length, Content-Type");
            var service = new LljService();
            var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer);
            if (fileBytes == null || fileBytes.Length == 0)
            {
                return NotFound("文件在FTP服务器上不存在");
            }
            var contentType = service.GetContentType(fileName);
            fileName = fileName?.Trim().Replace("\r", "").Replace("\n", "");
            // 设置正确的Content-Disposition响应头以支持文件下载
            var result = File(fileBytes, "application/octet-stream", fileName);
            // 确保Content-Disposition头正确设置,支持中文文件名
            if (!string.IsNullOrEmpty(fileName))
            {
                var encodedFileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
                Response.Headers.Add("Content-Disposition", $"attachment; filename*=UTF-8''{encodedFileName}");
            }
            return result;
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"下载文件失败:{ex.Message}");
        }
    }
    [HttpOptions("PreviewFtpFile")]
    [HttpOptions("DownloadFtpFile")]
    public IActionResult HandleOptions()
    {
        // 处理CORS预检请求
        Response.Headers.Add("Access-Control-Allow-Origin", "*");
        Response.Headers.Add("Access-Control-Allow-Methods", "GET, OPTIONS");
        Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");
        Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition, Content-Length, Content-Type");
        Response.Headers.Add("Access-Control-Max-Age", "86400");
        return Ok();
    }
[HttpPost("getWomdab")]
    public ResponseResult getWomdab([FromBody] GetWomdabRequest data)
    {
        var daa001 = data.daa001?.ToString();
        try
        {
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            var tbBillList = new LljService().GetWomdab(daa001);
            if (tbBillList == null || tbBillList.Count == 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "该检验单未上传附件信息!",
                    data = null
                };
            }
            resultInfos.tbBillList = tbBillList;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    [HttpPost("GetWomdabById")]
    public ResponseResult GetWomdabById([FromBody] GetWomdabRequest data)
    {
        var daa001 = data.daa001?.ToString();
        var ItemNo = data.ItemNo?.ToString();
        try
        {
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            var tbBillList = new LljService().GetWomdabById(daa001,ItemNo);
            if (tbBillList == null || tbBillList.Count == 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "该检验单未上传附件信息!",
                    data = null
                };
            }
            resultInfos.tbBillList = tbBillList;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// 根据二维码查询物料信息
    /// </summary>
    /// <param name="data">包含二维码内容和当前到货单号的请求对象</param>
    /// <returns>物料信息</returns>
    [HttpPost("GetMaterialByBarcode")]
    public ResponseResult GetMaterialByBarcode([FromBody] GetMaterialByBarcodeRequest data)
    {
        try
        {
            if (string.IsNullOrEmpty(data.itemBarcode))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "二维码内容不能为空",
                    data = null
                };
            }
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            var materialInfo = new LljService().GetMaterialByBarcode(data.itemBarcode, data.currentBillNo);
            if (materialInfo == null || materialInfo.Count == 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "未找到对应的物料信息,请检查二维码是否正确",
                    data = null
                };
            }
            resultInfos.tbBillList = materialInfo;
            return new ResponseResult
            {
                status = 0,
                message = "查询成功",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return new ResponseResult
            {
                status = 1,
                message = ex.Message, // 直接返回异常信息,包含"该条码不是此检验单条码!"
                data = null
            };
        }
    }
    /// <summary>
    /// 查询破坏实验记录是否存在
    /// </summary>
    /// <param name="data">查询请求数据</param>
    /// <returns>查询结果</returns>
    [HttpPost("CheckPhsyRecord")]
    public ResponseResult CheckPhsyRecord([FromBody] CheckPhsyRecordRequest data)
    {
        try
        {
            if (string.IsNullOrEmpty(data.billNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "到货单号不能为空",
                    data = null
                };
            }
            if (string.IsNullOrEmpty(data.releaseNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "检验单号不能为空",
                    data = null
                };
            }
            var exists = new LljService().CheckPhsyRecordExists(data.billNo, data.releaseNo);
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            resultInfos.exists = exists;
            return new ResponseResult
            {
                status = 0,
                message = "查询成功",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return new ResponseResult
            {
                status = 1,
                message = $"查询失败: {ex.Message}",
                data = null
            };
        }
    }
    /// <summary>
    /// 调用破坏实验存储过程
    /// </summary>
    /// <param name="data">破坏实验请求数据</param>
    /// <returns>执行结果</returns>
    [HttpPost("CallPhsyUpdateProcedure")]
    public ResponseResult CallPhsyUpdateProcedure([FromBody] PhsyUpdateRequest data)
    {
        try
        {
            if (string.IsNullOrEmpty(data.itemBarcode))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "条码不能为空",
                    data = null
                };
            }
            if (string.IsNullOrEmpty(data.billNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "到货单号不能为空",
                    data = null
                };
            }
            if (data.yqty <= 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "条码数量必须大于0",
                    data = null
                };
            }
            if (data.cqty <= 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "破坏实验数量必须大于0",
                    data = null
                };
            }
            if (string.IsNullOrEmpty(data.releaseNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "检验单号不能为空",
                    data = null
                };
            }
            var (result, message) = new LljService().CallPhsyUpdateProcedure(
                data.itemBarcode,
                data.yqty,
                data.cqty,
                data.billNo,
                data.lx,
                data.releaseNo,
                data.itemId);
            dynamic resultInfos = new System.Dynamic.ExpandoObject();
            resultInfos.result = result;
            resultInfos.message = message;
            return new ResponseResult
            {
                status = result,
                message = message,
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return new ResponseResult
            {
                status = 1,
                message = $"调用存储过程失败: {ex.Message}",
                data = null
            };
        }
    }
    public class GetWomdabRequest
    {
        public string daa001 { get; set; }
        public string ItemNo { get; set; }
    }
    public class GetMaterialByBarcodeRequest
    {
        public string itemBarcode { get; set; }
        public string currentBillNo { get; set; }
    }
    public class PhsyUpdateRequest
    {
        public string itemBarcode { get; set; }
        public decimal yqty { get; set; }
        public decimal cqty { get; set; }
        public string billNo { get; set; }
        public int lx { get; set; } // 操作类型:1新增,2修改,3删除
        public string releaseNo { get; set; } // 检验单号
        public decimal? itemId { get; set; } // 物料ID
    }
    public class CheckPhsyRecordRequest
    {
        public string billNo { get; set; }
        public string releaseNo { get; set; }
    }
    [HttpPost("GetPhsyRecordInfo")]
    public ResponseResult GetPhsyRecordInfo([FromBody] CheckPhsyRecordRequest data)
    {
        try
        {
            if (string.IsNullOrEmpty(data.billNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "到货单号不能为空",
                    data = null
                };
            }
            if (string.IsNullOrEmpty(data.releaseNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "检验单号不能为空",
                    data = null
                };
            }
            var records = new LljService().GetPhsyRecordInfo(data.billNo, data.releaseNo);
            return new ResponseResult
            {
                status = 0,
                message = "查询成功",
                data = new { tbBillList = records }
            };
        }
        catch (Exception ex)
        {
            return new ResponseResult
            {
                status = 1,
                message = $"查询失败: {ex.Message}",
                data = null
            };
        }
    }
    /// <summary>
    /// 设置堵穴信息
    /// </summary>
    /// <param name="data">堵穴设置请求数据</param>
    /// <returns>执行结果</returns>
    [HttpPost("SetBlockedHoles")]
    public ResponseResult SetBlockedHoles([FromBody] SetBlockedHolesRequest data)
    {
        try
        {
            if (string.IsNullOrEmpty(data.releaseNo))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "检验单号不能为空",
                    data = null
                };
            }
            if (string.IsNullOrEmpty(data.blockedHoles))
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "堵穴信息不能为空",
                    data = null
                };
            }
            if (data.itemId <= 0)
            {
                return new ResponseResult
                {
                    status = 1,
                    message = "检验项目ID不能为空",
                    data = null
                };
            }
            var (result, message) = new LljService().SetBlockedHoles(data.releaseNo, data.blockedHoles, data.itemId);
            return new ResponseResult
            {
                status = result,
                message = message,
                data = new { result = result, message = message }
            };
        }
        catch (Exception ex)
        {
            return new ResponseResult
            {
                status = 1,
                message = $"设置堵穴失败: {ex.Message}",
                data = null
            };
        }
    }
    public class SetBlockedHolesRequest
    {
        public string releaseNo { get; set; }
        public string blockedHoles { get; set; }
        public decimal itemId { get; set; }
    }
}