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; using System.Web; namespace MESApplication.Controllers.QC; [Route("api/[controller]")] [ApiController] public class XJController : ControllerBase { [HttpPost("getAll")] public ResponseResult getAll([FromBody] JObject data) { var modify1Flag = Convert.ToInt32(data["modify1Flag"]?.ToString() ?? "0"); try { dynamic resultInfos = new ExpandoObject(); // var tbBillList = // new XJService().getAll(modify1Flag); // resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getMaxReleaseNo [HttpPost("getMaxReleaseNo")] public ResponseResult getMaxReleaseNo() { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getMaxReleaseNo(); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getLine [HttpPost("getLineAll")] public ResponseResult getLineAll() { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getLineAll(); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 获取工单 /// [HttpPost("getDaa001")] public ResponseResult getDaa001([FromBody] JObject data) { var daa020 = data["daa020"]?.ToString() ?? ""; try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getDaa001(daa020); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 获取工单详细信息(包含物料信息) /// [HttpPost("getWorkOrderWithItem")] public ResponseResult getWorkOrderWithItem([FromBody] JObject data) { var daa020 = data["daa020"]?.ToString() ?? ""; try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getWorkOrderWithItem(daa020); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 根据产线获取物料编码 lineNo /// /// [HttpPost("getBoardItem")] public ResponseResult getBoardItem([FromBody] JObject data) { var lineNo = data["lineNo"]?.ToString() ?? ""; try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getBoardItem(lineNo); // 按 itemNo 去重 tbBillList = tbBillList.GroupBy(x => x.ItemNo).Select(g => g.First()).ToList(); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getItem [HttpPost("getItem")] public ResponseResult getItem([FromBody] JObject data) { var daa001 = data["daa001"]?.ToString() ?? ""; try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getItem(daa001); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //setJYItem [HttpPost("setJYItem")] public ResponseResult setJYItem([FromBody] JObject data) { var itemNo = data["itemNo"]?.ToString() ?? ""; try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().setJYItem(itemNo); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //save [HttpPost("save")] public ResponseResult save([FromBody] XJDto xjDto) { try { dynamic resultInfos = new ExpandoObject(); var result = new XJService().save(xjDto); // 返回完整的XJDto对象,包含更新后的items resultInfos.tbBillList = result; resultInfos.xjDto = xjDto; // 包含完整的检验项目信息 return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } [HttpPost("saveItem")] public ResponseResult saveItem([FromBody] XJDto xjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().saveItem(xjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getPage [HttpPost("getPage")] public ResponseResult getPage([FromBody] XJPageResult queryObj) { try { dynamic resultInfos = new ExpandoObject(); var (item, totalCount) = new XJService().getPage(queryObj); resultInfos.tbBillList = item; return new ResponseResult { status = 0, message = "OK", data = resultInfos, TotalCount = totalCount }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //getJYItem [HttpPost("getJYItem")] public ResponseResult getJYItem([FromBody] JObject data) { var pid = data["pid"]?.ToString(); var id = data["id"]?.ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().getJYItem(Convert.ToDecimal(pid), 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 XJService().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] QsQaItemXj02 detail) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService(); 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] QsQaItemXj02 detail) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService(); var detail021 = tbBillList.UpdateQSItemDetail(detail); resultInfos.tbBillList = detail021; 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 id = data["id"]?.ToString(); try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().removeXJ(Convert.ToDecimal(id)); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //saveRemarksGid [HttpPost("saveRemarksGid")] public ResponseResult saveRemarksGid([FromBody] XJDto rkjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().saveRemarksGid(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] XJDto rkjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().saveRemarksPid(rkjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //saveRemarksById [HttpPost("saveRemarksById")] public ResponseResult saveRemarksById([FromBody] XJDto rkjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().saveRemarksById(rkjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //刷新检验项目 [HttpPost("GenUpdate")] public ResponseResult GenUpdate([FromBody] JObject data) { try { decimal? id = data["id"]?.ToObject(); string? no = data["no"]?.ToString(); string? user = data["user"]?.ToString(); var (result, message) = new XJService().GenUpdate(id, no, user); dynamic resultInfos = new ExpandoObject(); resultInfos.result = result; resultInfos.message = message; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } //提交检验 [HttpPost("SjSubmit")] public ResponseResult SjSubmit([FromBody] SJDto sjDto) { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().SjSubmit(sjDto); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 获取有线体的部门列表 /// [HttpPost("getDepartmentsWithLines")] public ResponseResult GetDepartmentsWithLines() { try { dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().GetDepartmentsWithLines(); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 保存部门选择 /// [HttpPost("saveDepartmentSelection")] public ResponseResult SaveDepartmentSelection([FromBody] JObject data) { try { var id = Convert.ToDecimal(data["id"]); var departmentId = data["departmentId"]?.ToString() ?? ""; var departmentName = data["departmentName"]?.ToString() ?? ""; dynamic resultInfos = new ExpandoObject(); var result = new XJService().SaveDepartmentSelection(id, departmentId, departmentName); resultInfos.tbBillList = result; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 根据部门ID获取该部门下的线体列表 /// [HttpPost("getLinesByDepartment")] public ResponseResult GetLinesByDepartment([FromBody] JObject data) { try { var departmentId = data["departmentId"]?.ToString() ?? ""; dynamic resultInfos = new ExpandoObject(); var tbBillList = new XJService().GetLinesByDepartment(departmentId); resultInfos.tbBillList = tbBillList; return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } /// /// 获取附件信息 /// /// 包含itemNo的JSON对象 /// 附件列表 [HttpPost("getAttachments")] public ResponseResult GetAttachments([FromBody] JObject data) { var itemNo = data["itemNo"]?.ToString(); var projName = data["projName"]?.ToString(); var fromPage = data["fromPage"]?.ToString(); // 新增参数 // 调试日志 Console.WriteLine($"XJController.GetAttachments 接收参数: itemNo='{itemNo}', projName='{projName}', fromPage='{fromPage}'"); // 条件过滤逻辑:根据fromPage决定是否过滤 string filterProjName = null; if (fromPage == "Detail" && !string.IsNullOrEmpty(projName)) { filterProjName = projName; // Detail页面需要过滤 } // Add页面不传递filterProjName,显示所有附件 try { dynamic resultInfos = new System.Dynamic.ExpandoObject(); var tbBillList = new XJService().GetAttachments(itemNo, filterProjName); 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); } } /// /// 预览FTP文件 /// /// 物料编码 /// 文件名 /// FTP服务器地址 /// 项目名称(可选) /// 文件内容 [HttpGet("PreviewFtpFile")] public IActionResult PreviewFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string projName = 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 XJService(); var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer, projName); 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}"); } } /// /// 下载FTP文件 /// /// 物料编码 /// 文件名 /// FTP服务器地址 /// 项目名称(可选) /// 文件下载 [HttpGet("DownloadFtpFile")] public IActionResult DownloadFtpFile([FromQuery] string itemNo, [FromQuery] string fileName, [FromQuery] string ftpServer, [FromQuery] string projName = 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 XJService(); var fileBytes = service.GetFtpFile(itemNo, fileName, ftpServer, projName); 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() { 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-Max-Age", "86400"); return Ok(); } /// /// 上传图片到检验项目的PICTURE字段 /// /// 上传的图片文件 /// 检验项目ID /// 检验单ID /// 工单号 /// 创建人 /// 上传结果 [HttpPost("UploadImageToPicture")] public ResponseResult UploadImageToPicture(IFormFile file, [FromForm] string id, [FromForm] string gid, [FromForm] string billNo, [FromForm] string createBy) { try { // 参数验证 if (file == null || file.Length == 0) { return new ResponseResult { status = 1, message = "请选择要上传的图片文件", data = null }; } if (string.IsNullOrEmpty(id)) { return new ResponseResult { status = 1, message = "检验项目ID不能为空", data = null }; } if (string.IsNullOrEmpty(createBy)) { return new ResponseResult { status = 1, message = "创建人不能为空", data = null }; } // 读取文件字节数组 byte[] imageBytes; using (var memoryStream = new MemoryStream()) { file.CopyTo(memoryStream); imageBytes = memoryStream.ToArray(); } // 调用服务方法保存图片 var service = new XJService(); var (status, message) = service.UploadImageToPicture(Convert.ToDecimal(id), imageBytes, file.FileName, createBy); return new ResponseResult { status = status, message = message, data = null }; } catch (Exception ex) { return new ResponseResult { status = 1, message = $"上传图片失败:{ex.Message}", data = null }; } } /// /// 删除检验项目的图片 /// /// 包含检验项目ID的JSON对象 /// 删除结果 [HttpPost("DeleteImageFromPicture")] public ResponseResult DeleteImageFromPicture([FromBody] JObject data) { try { var id = data["id"]?.ToString(); if (string.IsNullOrEmpty(id)) { return new ResponseResult { status = 1, message = "检验项目ID不能为空", data = null }; } // 调用服务方法删除图片 var service = new XJService(); var (status, message) = service.DeleteImageFromPicture(Convert.ToDecimal(id)); return new ResponseResult { status = status, message = message, data = null }; } catch (Exception ex) { return new ResponseResult { status = 1, message = $"删除图片失败:{ex.Message}", data = null }; } } }