using System.Dynamic; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.service.QC; using MES.Service.util; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; namespace MESApplication.Controllers.QC; [Route("api/[controller]")] [ApiController] public class LljController : ControllerBase { [HttpPost("getPage")] public ResponseResult getPage([FromBody] XJPageResult queryObj) { try { dynamic resultInfos = new ExpandoObject(); var (item, totalCount) = new LljService().GetPage(queryObj); var tbBillList = resultInfos.tbBillList = item; return new ResponseResult { status = 0, message = "OK", data = resultInfos, TotalCount = totalCount }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("setJYItem")] public ResponseResult setJYItem([FromBody] JObject data) { var itemNo = Convert.ToDecimal(data["itemNo"].ToString()); var quantity = Convert.ToDecimal(data["quantity"].ToString()); var releaseNo = data["releaseNo"].ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().SetItems(itemNo, quantity, releaseNo); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("saveItem")] public ResponseResult saveItem([FromBody] LLJDto lljDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().saveItem(lljDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getItems [HttpPost("getJYItem")] public ResponseResult getJYItem([FromBody] JObject data) { var id = data["id"]?.ToString(); var releaseNo = data["releaseNo"]?.ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().GetItems(releaseNo, Convert.ToDecimal(id)); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getXjDetail02ById [HttpPost("getXjDetail02ById")] public ResponseResult getXjDetail02ById([FromBody] JObject data) { var id = data["id"]?.ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().getXjDetail02ById(Convert.ToDecimal(id)); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("SetQSItemDetail")] public ResponseResult SetQSItemDetail( [FromBody] MesQaItemsDetectDetail12 detail) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService(); var detail021 = tbBillList.SetQSItemDetail(detail); resultInfos.tbBillList = detail021; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("UpdateQSItemDetail")] public ResponseResult UpdateQSItemDetail( [FromBody] MesQaItemsDetectDetail12 detail) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService(); var detail021 = tbBillList.UpdateQSItemDetail(detail); resultInfos.tbBillList = detail021; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //saveRemarksGid 主表添加不合格描述 [HttpPost("saveRemarksGid")] public ResponseResult saveRemarksGid([FromBody] LLJDto rkjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().saveRemarksGid(rkjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //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) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().saveRemarksPid(rkjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //removeXJ 删除 [HttpPost("removeXJ")] public ResponseResult removeXJ([FromBody] JObject data) { var releaseNo = data["releaseNo"]?.ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().removeXJ(releaseNo); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //IqcQaSubmit [HttpPost("IqcQaSubmit")] public ResponseResult IqcQaSubmit(LLJDto rkjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().IqcQaSubmit(rkjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("EmergencyRelease")] public ResponseResult EmergencyRelease([FromBody] JObject data) { var id = Convert.ToInt32(data["id"].ToString()); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().EmergencyRelease(id); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("WithdrawEmergencyRelease")] public ResponseResult WithdrawEmergencyRelease([FromBody] JObject data) { var id = Convert.ToInt32(data["id"].ToString()); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new LljService().WithdrawEmergencyRelease(id); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("getAttachments")] public ResponseResult GetAttachments([FromBody] JObject data) { var itemNo = data["itemNo"]?.ToString(); var fversion = data["fversion"]?.ToString(); var fromPage = data["fromPage"]?.ToString(); // 根据来源页面决定是否过滤 string filterFversion = null; if (fromPage == "Detail" && !string.IsNullOrEmpty(fversion)) { filterFversion = fversion; // Detail页面需要过滤 } // Add页面不传递filterFversion,显示所有附件 try { dynamic resultInfos = new System.Dynamic.ExpandoObject(); var tbBillList = new LljService().GetAttachments(itemNo, filterFversion); 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); } } [HttpGet("PreviewFtpFile")] public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string fversion = null) { 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"); Response.Headers.Add("Access-Control-Expose-Headers", "Content-Type, Content-Length"); var service = new LljService(); var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer, fversion); if (fileBytes == null || fileBytes.Length == 0) { return NotFound("文件在FTP服务器上不存在"); } var contentType = service.GetContentType(fileName); fileName = fileName?.Trim().Replace("\r", "").Replace("\n", ""); return File(fileBytes, contentType); } catch (Exception ex) { return StatusCode(500, $"预览文件失败:{ex.Message}"); } } [HttpGet("DownloadFtpFile")] public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string fversion = null) { 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, fversion); 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); } } /// /// 根据二维码查询物料信息 /// /// 包含二维码内容和当前到货单号的请求对象 /// 物料信息 [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 }; } } /// /// 查询破坏实验记录是否存在 /// /// 查询请求数据 /// 查询结果 [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 }; } } /// /// 调用破坏实验存储过程 /// /// 破坏实验请求数据 /// 执行结果 [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 }; } } /// /// 设置堵穴信息 /// /// 堵穴设置请求数据 /// 执行结果 [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; } } }