diff --git a/Infrastructure/Controllers/BaseController.cs b/Infrastructure/Controllers/BaseController.cs
index 79965b309812d5c370fd0a8f8bd81d79c3b2dfd4..995eee6e56b16ad14c655bef6c8a4dd0e5c3e152 100644
--- a/Infrastructure/Controllers/BaseController.cs
+++ b/Infrastructure/Controllers/BaseController.cs
@@ -6,10 +6,16 @@ using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
+using NPOI.SS.UserModel;
+using NPOI.SS.Util;
+using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
+using System.Drawing;
using System.IO;
+using System.Linq;
using System.Web;
+using ZR.Model.DownM;
namespace Infrastructure.Controllers
{
@@ -84,6 +90,7 @@ namespace Infrastructure.Controllers
///
protected IActionResult DownFile(string path, string fileName)
{
+
if (!System.IO.File.Exists(path))
{
return NotFound();
@@ -168,16 +175,27 @@ namespace Infrastructure.Controllers
///
protected (string, string) ExportExcelMini(List list, string sheetName, string fileName)
{
- IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment));
- string sFileName = $"{fileName}_{DateTime.Now:MMdd-HHmmss}.xlsx";
- string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName);
+ try
+ {
+ IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment));
+ string sFileName = $"{fileName}_{DateTime.Now:MMdd-HHmmss}.xlsx";
+ string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName);
- Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
+ Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
- MiniExcel.SaveAs(fullPath, list, sheetName: sheetName);
- return (sFileName, fullPath);
+ MiniExcel.SaveAs(fullPath, list, sheetName: sheetName);
+ return (sFileName, fullPath);
+ }
+ catch (Exception ex)
+ {
+ var msg = ex.Message;
+
+ throw;
+ }
}
+
+
///
/// 导出多个工作表(Sheet)
///
@@ -234,5 +252,357 @@ namespace Infrastructure.Controllers
return (sFileName, fullPath);
}
+
+
+
+ #region 下载搬运回收清单
+
+ ///
+ /// 废旧系统中下载回收搬运清单
+ ///
+ ///
+ ///
+ ///
+ ///
+
+ protected (string, string) ExportRecycleBill( TransportInfo transportInfo, List dataList)
+ {
+ try
+ {
+ // 1. 初始化工作簿与工作表
+ IWebHostEnvironment env = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment));
+ string fileName = $"回收搬运单_{DateTime.Now:MMdd-HHmmss}.xlsx";
+ string fullPath = Path.Combine(env.WebRootPath, "export", fileName);
+ Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
+
+ using (var workbook = new XSSFWorkbook())
+ {
+ ISheet sheet = workbook.CreateSheet("回收搬运单");
+ // 定义Excel最大列数(根据实际表头+签名区列数确定,这里按10列预留,可根据实际调整)
+ const int MAX_COLUMN_COUNT = 10;
+
+ // 2. 构造【标题区】(第一部分)
+ CreateTitleArea(sheet, workbook, transportInfo);
+
+
+
+
+ // 3. 构造【物资明细表】(第二部分)
+
+ string[] headers = { "序号", "需求单位", "局点", "设备名称", "厂家/型号", "计量单位", "计划回收数", "实际回收数量", "备注" };
+
+ CreateMaterialTable(sheet, workbook, dataList, headers);
+
+ // 4. 构造【签名&备注区】(第三部分)
+ CreateSignatureArea(sheet, workbook, dataList);
+
+
+ // -------------------------- 核心:全局自动调整列宽 --------------------------
+ // 列宽配置:索引对应列(0=序号,1=需求单位...),值为宽度(1/256字符)
+ int[] columnWidths = {
+ 256 * 14, // 序号(9个字符宽)
+ 256 * 18, // 需求单位(15个中文字符)
+ 256 * 18, // 局点(12个中文字符)
+ 256 * 25, // 设备名称(20个中文字符)
+ 256 * 18, // 厂家/型号(18个中文字符)
+ 256 * 18, // 计量单位(10个中文字符)
+ 256 * 16, // 计划回收数(12个中文字符)
+ 256 * 16, // 实际回收数量(12个中文字符)
+ 256 * 25, // 备注(25个中文字符)
+ 256 * 12 // (8个中文字符)
+ };
+
+ // 应用固定列宽
+ for (int colIdx = 0; colIdx < columnWidths.Length; colIdx++)
+ {
+ sheet.SetColumnWidth(colIdx, columnWidths[colIdx]);
+ }
+ // ----------------------------------------------------------------------------
+
+
+
+ // 5. 保存文件
+ using (var fs = new FileStream(fullPath, FileMode.Create))
+ {
+ workbook.Write(fs);
+ }
+
+ return (fileName, fullPath);
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new Exception($"导出失败: {ex.Message}", ex);
+ }
+ }
+
+
+
+
+ // 接收外部数据
+ private void CreateTitleArea(ISheet sheet, XSSFWorkbook workbook, TransportInfo transportInfo)
+ {
+ try
+ {
+ // 合并单元格:标题行(A1:J1)
+ CellRangeAddress titleMerge = new CellRangeAddress(0, 2, 0, 9);
+ sheet.AddMergedRegion(titleMerge);
+
+ IRow titleRow = sheet.GetRow(0) ?? sheet.CreateRow(0);
+ ICell titleCell = titleRow.CreateCell(0);
+ titleCell.SetCellValue("中通服供应链股份有限公司四川分公司\n运输搬运单");
+
+ // 标题样式:居中、加粗、换行
+ ICellStyle titleStyle = workbook.CreateCellStyle();
+ IFont titleFont = workbook.CreateFont();
+ titleFont.FontHeightInPoints = 14;
+ titleFont.IsBold = true;
+ titleStyle.SetFont(titleFont);
+ titleStyle.Alignment = HorizontalAlignment.Center;
+ titleStyle.VerticalAlignment = VerticalAlignment.Center;
+ titleStyle.WrapText = true; // 自动换行
+ titleCell.CellStyle = titleStyle;
+
+ // 客户问候行(A2:J2)
+ CellRangeAddress greetMerge = new CellRangeAddress(3, 4, 0, 9);
+ sheet.AddMergedRegion(greetMerge);
+
+ IRow greetRow = sheet.GetRow(3) ?? sheet.CreateRow(3);
+ ICell greetCell = greetRow.CreateCell(0);
+ greetCell.SetCellValue("尊敬的客户:\n您好!下列货物请清点无误后签字确认,并加盖单位公章。注意:(请加盖单位主办公章,谢谢合作!)");
+
+ // 问候样式:居中、换行
+ ICellStyle greetStyle = workbook.CreateCellStyle();
+ greetStyle.Alignment = HorizontalAlignment.Center;
+ greetStyle.VerticalAlignment = VerticalAlignment.Center;
+ greetStyle.WrapText = true;
+ greetCell.CellStyle = greetStyle;
+
+ // 使用外部传入的动态数据构建标签数组
+ string[] labels = {
+ "编号:", transportInfo.Number,
+ "项目类型:", transportInfo.ProjectType,
+ "备注:", transportInfo.Remark,
+ "回收物资:", transportInfo.RecoveryMaterials,
+ "回收目的地:", transportInfo.RecoveryDestination,
+ "客户单位:", transportInfo.CustomerUnit,
+ "回收地点:", transportInfo.RecoveryLocation,
+ "联系人:", transportInfo.ContactPerson,
+ "联系人电话:", transportInfo.ContactPhone,
+ "配送方式:", transportInfo.DeliveryMethod,
+ "车辆型号:", transportInfo.VehicleModel,
+ "体积:", transportInfo.Volume,
+ "配送计划经办人:", transportInfo.DeliveryPlanner
+ };
+
+ // 修复循环索引计算错误(原代码有越界风险)
+ for (int i = 0; i < 3; i++) // 行:3行数据
+ {
+ IRow infoRow = sheet.GetRow(i + 6) ?? sheet.CreateRow(i + 6);
+ for (int j = 0; j < 5; j++) // 每行列数:5组键值对
+ {
+ int index = i * 10 + j * 2; // 修正索引计算方式
+ if (index + 1 < labels.Length) // 避免数组越界
+ {
+ infoRow.CreateCell(j * 2).SetCellValue(labels[index]);
+ infoRow.CreateCell(j * 2 + 1).SetCellValue(labels[index + 1]);
+ }
+ }
+ }
+
+
+
+
+ //// 自动调整列宽
+ //for (int i = 0; i < labels.Length; i++)
+ //{
+ // sheet.AutoSizeColumn(i);
+ // int width = (int)(sheet.GetColumnWidth(i) + 256); // 增加宽度避免挤压
+ // sheet.SetColumnWidth(i, width > 65535 ? 65535 : width);
+ //}
+
+
+ }
+ catch (Exception ex)
+ {
+ var m = ex.Message;
+ throw; // 抛出异常便于上层处理
+ }
+ }
+
+
+
+ private void CreateMaterialTable(ISheet sheet, XSSFWorkbook workbook,
+ List dataList,
+ string[] headers) // 新增表头参数
+ {
+ try
+ {
+ int startRowIdx = 10; // 从第11行开始(NPOI行索引10)
+
+ // 表头行
+ IRow headerRow = sheet.GetRow(startRowIdx) ?? sheet.CreateRow(startRowIdx);
+
+ ICellStyle headerStyle = workbook.CreateCellStyle();
+ IFont headerFont = workbook.CreateFont();
+ headerFont.IsBold = true;
+ headerStyle.SetFont(headerFont);
+ headerStyle.FillForegroundColor = IndexedColors.Grey25Percent.Index;
+ headerStyle.FillPattern = FillPattern.SolidForeground;
+
+ // 使用外部传入的表头数组
+ for (int i = 0; i < headers.Length; i++)
+ {
+ ICell cell = headerRow.CreateCell(i);
+ cell.SetCellValue(headers[i]);
+ cell.CellStyle = headerStyle;
+ }
+
+ // 数据行
+ for (int i = 0; i < dataList.Count; i++)
+ {
+ IRow dataRow = sheet.GetRow(startRowIdx + 1 + i) ?? sheet.CreateRow(startRowIdx + 1 + i);
+ var item = dataList[i];
+
+ // 注意:这里需要根据实际的表头数量和顺序调整单元格赋值
+ // 以下为示例,需根据你的Dto实际属性对应修改
+ dataRow.CreateCell(0).SetCellValue(i + 1); // 序号(自增)
+ dataRow.CreateCell(1).SetCellValue(item.DemandUnit);
+ dataRow.CreateCell(2).SetCellValue(item.Site);
+ dataRow.CreateCell(3).SetCellValue(item.MaterialName);
+ dataRow.CreateCell(4).SetCellValue(item.Specification);
+ dataRow.CreateCell(5).SetCellValue(item.Unit);
+ dataRow.CreateCell(6).SetCellValue(item.PlanRecycleCount);
+ dataRow.CreateCell(7).SetCellValue(item.ActualRecycleCount);
+ dataRow.CreateCell(8).SetCellValue(item.Remarks);
+ }
+
+ // 合计行
+ IRow totalRow = sheet.GetRow(startRowIdx + 1 + dataList.Count) ?? sheet.CreateRow(startRowIdx + 1 + dataList.Count);
+ totalRow.CreateCell(0).SetCellValue("合计");
+
+ // 计算实际合计值(示例)
+
+ int totalPlan = dataList.Sum(d =>
+ {
+ // 先判断是否为null
+ if (d.PlanRecycleCount == null)
+ return 0;
+
+ // 尝试转换为int,失败则返回0
+ if (int.TryParse(d.PlanRecycleCount.ToString(), out int count))
+ return count;
+ else
+ return 0;
+ });
+
+
+ int totalActual = dataList.Sum(d =>
+ {
+ // 先判断是否为null
+ if (d.ActualRecycleCount == null)
+ return 0;
+
+ // 尝试转换为int,失败则返回0
+ if (int.TryParse(d.ActualRecycleCount.ToString(), out int count))
+ return count;
+ else
+ return 0;
+ });
+
+
+ totalRow.CreateCell(6).SetCellValue(totalPlan);
+ totalRow.CreateCell(7).SetCellValue(totalActual);
+
+ //// 自动调整列宽
+ //for (int i = 0; i < headers.Length; i++)
+ //{
+ // sheet.AutoSizeColumn(i);
+ // int width = (int)(sheet.GetColumnWidth(i) + 256); // 增加宽度避免挤压
+ // sheet.SetColumnWidth(i, width > 65535 ? 65535 : width);
+ //}
+ }
+ catch (Exception ex)
+ {
+ var m = ex.Message;
+ throw;
+ }
+ }
+
+
+
+
+ private void CreateSignatureArea(ISheet sheet, XSSFWorkbook workbook, List dataList)
+ {
+
+
+ try
+ {
+ // int startRowIdx = 10 + dataList.Count; // 从物资表下方开始(需根据数据行数调整)
+
+ int startRowIdx = 12 + dataList.Count; // 从物资表下方开始(需根据数据行数调整)
+
+ // 合并签名区单元格
+ CellRangeAddress signMerge1 = new CellRangeAddress(startRowIdx, startRowIdx, 0, 1);
+ CellRangeAddress signMerge2 = new CellRangeAddress(startRowIdx, startRowIdx, 2, 3);
+ CellRangeAddress signMerge3 = new CellRangeAddress(startRowIdx + 1, startRowIdx + 1, 0, 1);
+ CellRangeAddress signMerge4 = new CellRangeAddress(startRowIdx + 1, startRowIdx + 1, 2, 3);
+ sheet.AddMergedRegion(signMerge1);
+ sheet.AddMergedRegion(signMerge2);
+ sheet.AddMergedRegion(signMerge3);
+ sheet.AddMergedRegion(signMerge4);
+
+ // 签名行
+ IRow signRow1 = sheet.GetRow(startRowIdx) ?? sheet.CreateRow(startRowIdx);
+ signRow1.CreateCell(0).SetCellValue("交接单位(盖章)");
+ signRow1.CreateCell(4).SetCellValue("收货单位(盖章)");
+
+ IRow signRow2 = sheet.GetRow(startRowIdx + 1) ?? sheet.CreateRow(startRowIdx + 1);
+ signRow2.CreateCell(0).SetCellValue("交接人(签字): ");
+ signRow2.CreateCell(4).SetCellValue("接收人:");
+ signRow2.CreateCell(7).SetCellValue("联电话:");
+
+ IRow signRow21 = sheet.GetRow(startRowIdx + 2) ?? sheet.CreateRow(startRowIdx + 2);
+
+ signRow21.CreateCell(7).SetCellValue("身份证号码:");
+
+ // 联系方式行
+ IRow contactRow = sheet.GetRow(startRowIdx + 3) ?? sheet.CreateRow(startRowIdx + 3);
+ contactRow.CreateCell(0).SetCellValue("联系电话:");
+ contactRow.CreateCell(4).SetCellValue("提货司机签字:");
+ contactRow.CreateCell(7).SetCellValue("联系电话:");
+ // 身份证行
+ IRow idRow = sheet.GetRow(startRowIdx + 4) ?? sheet.CreateRow(startRowIdx + 4);
+ idRow.CreateCell(0).SetCellValue("身份证号码:");
+ idRow.CreateCell(7).SetCellValue("身份证号码:");
+
+
+ IRow idRow1 = sheet.GetRow(startRowIdx + 5) ?? sheet.CreateRow(startRowIdx + 5);
+ idRow1.CreateCell(0).SetCellValue("地点:");
+ idRow1.CreateCell(4).SetCellValue("日期:");
+
+ // 备注行
+ //CellRangeAddress remarkMerge = new CellRangeAddress(startRowIdx + 4, startRowIdx + 4, 0, 3);
+ CellRangeAddress remarkMerge = new CellRangeAddress(startRowIdx + 6, startRowIdx + 6, 0, 9);
+ sheet.AddMergedRegion(remarkMerge);
+ IRow remarkRow = sheet.GetRow(startRowIdx + 6) ?? sheet.CreateRow(startRowIdx + 6);
+ remarkRow.CreateCell(0).SetCellValue("注:本单一式四联(留底一联、承运方留一联、交接单位留二联) 加盖指定签收章对本单货物的确认,如有疑问请及时与配送负责人联系,请您在签字后加盖公章,签收时间请写签收日期时间。");
+ remarkRow.Cells[0].CellStyle.WrapText = true; // 自动换行
+
+ }
+ catch (Exception ex)
+ {
+ var m = ex.Message;
+ throw;
+ }
+
+ }
+
+
+
+ #endregion
+
+
+
}
}
diff --git a/Infrastructure/ZR.Infrastructure.csproj b/Infrastructure/ZR.Infrastructure.csproj
index c7ee5e653701a7c835387d6a28ed54bb77e8de7b..450416890b9e9456fc31a8522b5b36d16ed6b23f 100644
--- a/Infrastructure/ZR.Infrastructure.csproj
+++ b/Infrastructure/ZR.Infrastructure.csproj
@@ -14,13 +14,18 @@
+
-
+
+
+
+
+
diff --git a/Infrastructure/ZskDataProcessor.cs b/Infrastructure/ZskDataProcessor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..96adb7e3e48e870d6e81be896c1540b5d3898b95
--- /dev/null
+++ b/Infrastructure/ZskDataProcessor.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ZR.Model.Knowledge.Dto;
+
+namespace ZR.Infrastructure
+{/// 数据处理工具类
+ public class ZskDataProcessor
+ {
+ ///
+ /// 处理列表中A列数据:
+ /// - 若MaterialName列当前行为空,取前面最近的非空A列值
+ /// - 若A列当前行不为空,保持原值
+ ///
+ /// 原始数据列表
+ /// 处理后的列表
+ public static List ProcessColumnA(List dataList)
+ {
+ if (dataList == null || dataList.Count == 0)
+ return dataList;
+
+ // 记录上一个非空的A列值
+ string lastNonEmptyA = null;
+
+ foreach (var item in dataList)
+ {
+ // 判断当前MaterialName列是否为空(包含null、空字符串、纯空格)
+ bool isCurrentAEmpty = string.IsNullOrWhiteSpace(item.MaterialName);
+
+ if (!isCurrentAEmpty)
+ {
+ // 当前A列不为空:更新"上一个非空值"为当前值
+ lastNonEmptyA = item.MaterialName;
+ }
+ else
+ {
+ // 当前A列为空:用"上一个非空值"填充(如果存在)
+ if (lastNonEmptyA != null)
+ {
+ item.MaterialName = lastNonEmptyA;
+ }
+ // 若"上一个非空值"不存在(如列表开头连续空值),保持空
+ }
+ }
+
+ return dataList;
+ }
+
+ }
+}
diff --git a/Test/ImageTest.cs b/Test/ImageTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e9e7775a3689f6a1d748aacfb8207371ac80f59e
--- /dev/null
+++ b/Test/ImageTest.cs
@@ -0,0 +1,79 @@
+using ImageProcessingToolkit;
+using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.Formats.Png;
+using SixLabors.ImageSharp.Processing;
+using SixLabors.ImageSharp.Processing.Processors;
+
+namespace Test
+{
+ public class ImageTest
+ {
+ public void Test()
+ {
+ // 加载图片
+ // 1. 加载图片
+ var image = ImageHelper.LoadImage("input.jpg");
+
+ // 2. 裁剪图片
+ var croppedImage = ImageHelper.Crop(image, 100, 100, 300, 200);
+
+ // 3. 缩放图片
+ var resizedImage = ImageHelper.Resize(image, 800, 600);
+
+ // 4. 按比例缩放
+ var scaledImage = ImageHelper.Scale(image, 0.5f); // 缩小到50%
+
+ // 5. 旋转图片
+ var rotatedImage = ImageHelper.Rotate(image, 45); // 旋转45度
+
+ // 6. 翻转图片
+ var flippedImage = ImageHelper.Flip(image, FlipMode.Horizontal); // 水平翻转
+
+ // 7. 添加文字水印
+ var textWatermarkedImage = ImageHelper.AddTextWatermark(
+ image,
+ "Sample Watermark",
+ 24,
+ Color.White,
+ new PointF(10, 10),
+ 0.7f);
+
+ // 8. 添加图片水印
+ var watermark = ImageHelper.LoadImage("watermark.png");
+ var imageWatermarkedImage = ImageHelper.AddImageWatermark(
+ image,
+ watermark,
+ new Point(10, 10),
+ 0.5f,
+ new Size(100, 50));
+
+ // 9. 去除杂物/水印
+ var cleanedImage = ImageHelper.RemoveObject(image, 50, 50, 100, 100);
+
+ // 10. 图层合成
+ var overlay = ImageHelper.LoadImage("overlay.png");
+ var compositedImage = ImageHelper.Composite(image, overlay, new Point(0, 0), 0.5f);
+
+ // 11. 格式转换
+ var pngImage = ImageHelper.ConvertFormat(image, PngFormat.Instance);
+
+ // 12. 图片压缩
+ var compressedImage = ImageHelper.Compress(image, 80); // 80%质量
+
+ // 13. 灰度化
+ var grayscaleImage = ImageHelper.Grayscale(image);
+
+ // 14. 保存图片
+ ImageHelper.SaveImage(compressedImage, "output.jpg");
+
+ // 15. 保存到字节数组
+ byte[] imageBytes = ImageHelper.SaveImageToBytes(grayscaleImage);
+
+ // 每个图片都需要释放资源
+ image.Dispose();
+ croppedImage.Dispose();
+ resizedImage.Dispose();
+
+ }
+ }
+}
diff --git a/Test/ZR.Test.csproj b/Test/ZR.Test.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..1e41cb6783ce248970d92a6294dd4a8175d9f89f
--- /dev/null
+++ b/Test/ZR.Test.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/ZR.Admin.WebApi/Controllers/BaseInfo/EmployeeController.cs b/ZR.Admin.WebApi/Controllers/BaseInfo/EmployeeController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1958f167cb314747d54f4c6d4b42bab7f32f70fa
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/BaseInfo/EmployeeController.cs
@@ -0,0 +1,171 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.BaseInfo.Dto;
+using ZR.Model.BaseInfo;
+using ZR.Service.BaseInfo.IBaseInfoService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-04-10
+namespace ZR.Admin.WebApi.Controllers.BaseInfo
+{
+ ///
+ /// 员工信息
+ ///
+ [Verify]
+ [Route("BaseInfo/Employee")]
+ public class EmployeeController : BaseController
+ {
+ ///
+ /// 员工信息接口
+ ///
+ private readonly IEmployeeService _EmployeeService;
+
+ public EmployeeController(IEmployeeService EmployeeService)
+ {
+ _EmployeeService = EmployeeService;
+ }
+
+ ///
+ /// 查询员工信息列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "Employee:list")]
+ public IActionResult QueryEmployee([FromQuery] EmployeeQueryDto parm)
+ {
+ var response = _EmployeeService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询员工信息详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "Employee:query")]
+ public IActionResult GetEmployee(int Id)
+ {
+ var response = _EmployeeService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加员工信息
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "Employee:add")]
+ [Log(Title = "员工信息", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddEmployee([FromBody] EmployeeDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _EmployeeService.AddEmployee(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新员工信息
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "Employee:edit")]
+ [Log(Title = "员工信息", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateEmployee([FromBody] EmployeeDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _EmployeeService.UpdateEmployee(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除员工信息
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "Employee:delete")]
+ [Log(Title = "员工信息", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteEmployee([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_EmployeeService.Delete(idArr));
+ }
+
+ ///
+ /// 导出员工信息
+ ///
+ ///
+ [Log(Title = "员工信息", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "Employee:export")]
+ public IActionResult Export([FromQuery] EmployeeQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _EmployeeService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "员工信息", "员工信息");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空员工信息
+ ///
+ ///
+ [Log(Title = "员工信息", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "Employee:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_EmployeeService.TruncateEmployee());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "员工信息导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "Employee:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_EmployeeService.ImportEmployee(list.Adapt>()));
+ }
+
+ ///
+ /// 员工信息导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "员工信息模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "Employee");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/BaseInfo/PmsAccountingDetailsController.cs b/ZR.Admin.WebApi/Controllers/BaseInfo/PmsAccountingDetailsController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6ccb5e856e7463f01980f590d0c760c4d7de9e1f
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/BaseInfo/PmsAccountingDetailsController.cs
@@ -0,0 +1,171 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.BaseInfo.Dto;
+using ZR.Model.BaseInfo;
+using ZR.Service.BaseInfo.IBaseInfoService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-10-09
+namespace ZR.Admin.WebApi.Controllers.BaseInfo
+{
+ ///
+ /// 核算明细
+ ///
+ [Verify]
+ [Route("BaseInfo/PmsAccountingDetails")]
+ public class PmsAccountingDetailsController : BaseController
+ {
+ ///
+ /// 核算明细接口
+ ///
+ private readonly IPmsAccountingDetailsService _PmsAccountingDetailsService;
+
+ public PmsAccountingDetailsController(IPmsAccountingDetailsService PmsAccountingDetailsService)
+ {
+ _PmsAccountingDetailsService = PmsAccountingDetailsService;
+ }
+
+ ///
+ /// 查询核算明细列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:list")]
+ public IActionResult QueryPmsAccountingDetails([FromQuery] PmsAccountingDetailsQueryDto parm)
+ {
+ var response = _PmsAccountingDetailsService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询核算明细详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:query")]
+ public IActionResult GetPmsAccountingDetails(int Id)
+ {
+ var response = _PmsAccountingDetailsService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加核算明细
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:add")]
+ [Log(Title = "核算明细", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddPmsAccountingDetails([FromBody] PmsAccountingDetailsDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _PmsAccountingDetailsService.AddPmsAccountingDetails(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新核算明细
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:edit")]
+ [Log(Title = "核算明细", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdatePmsAccountingDetails([FromBody] PmsAccountingDetailsDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _PmsAccountingDetailsService.UpdatePmsAccountingDetails(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除核算明细
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:delete")]
+ [Log(Title = "核算明细", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeletePmsAccountingDetails([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_PmsAccountingDetailsService.Delete(idArr, "删除核算明细"));
+ }
+
+ ///
+ /// 导出核算明细
+ ///
+ ///
+ [Log(Title = "核算明细", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:export")]
+ public IActionResult Export([FromQuery] PmsAccountingDetailsQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _PmsAccountingDetailsService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "核算明细", "核算明细");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空核算明细
+ ///
+ ///
+ [Log(Title = "核算明细", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_PmsAccountingDetailsService.TruncatePmsAccountingDetails());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "核算明细导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "PmsAccountingDetails:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_PmsAccountingDetailsService.ImportPmsAccountingDetails(list.Adapt>()));
+ }
+
+ ///
+ /// 核算明细导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "核算明细模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "PmsAccountingDetails");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/BaseInfo/PmsMonthSalaryController.cs b/ZR.Admin.WebApi/Controllers/BaseInfo/PmsMonthSalaryController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..28d2243362eb05abb553be512da83d977dc99000
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/BaseInfo/PmsMonthSalaryController.cs
@@ -0,0 +1,171 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.BaseInfo.Dto;
+using ZR.Model.BaseInfo;
+using ZR.Service.BaseInfo.IBaseInfoService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-04-23
+namespace ZR.Admin.WebApi.Controllers.BaseInfo
+{
+ ///
+ /// 每月工资明细表
+ ///
+ [Verify]
+ [Route("BaseInfo/PmsMonthSalary")]
+ public class PmsMonthSalaryController : BaseController
+ {
+ ///
+ /// 每月工资明细表接口
+ ///
+ private readonly IPmsMonthSalaryService _PmsMonthSalaryService;
+
+ public PmsMonthSalaryController(IPmsMonthSalaryService PmsMonthSalaryService)
+ {
+ _PmsMonthSalaryService = PmsMonthSalaryService;
+ }
+
+ ///
+ /// 查询每月工资明细表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:list")]
+ public IActionResult QueryPmsMonthSalary([FromQuery] PmsMonthSalaryQueryDto parm)
+ {
+ var response = _PmsMonthSalaryService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询每月工资明细表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:query")]
+ public IActionResult GetPmsMonthSalary(int Id)
+ {
+ var response = _PmsMonthSalaryService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加每月工资明细表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:add")]
+ [Log(Title = "每月工资明细表", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddPmsMonthSalary([FromBody] PmsMonthSalaryDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _PmsMonthSalaryService.AddPmsMonthSalary(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新每月工资明细表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:edit")]
+ [Log(Title = "每月工资明细表", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdatePmsMonthSalary([FromBody] PmsMonthSalaryDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _PmsMonthSalaryService.UpdatePmsMonthSalary(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除每月工资明细表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:delete")]
+ [Log(Title = "每月工资明细表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeletePmsMonthSalary([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_PmsMonthSalaryService.Delete(idArr));
+ }
+
+ ///
+ /// 导出每月工资明细表
+ ///
+ ///
+ [Log(Title = "每月工资明细表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:export")]
+ public IActionResult Export([FromQuery] PmsMonthSalaryQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _PmsMonthSalaryService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "每月工资明细表", "每月工资明细表");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空每月工资明细表
+ ///
+ ///
+ [Log(Title = "每月工资明细表", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_PmsMonthSalaryService.TruncatePmsMonthSalary());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "每月工资明细表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "pmsmonthsalary:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_PmsMonthSalaryService.ImportPmsMonthSalary(list.Adapt>()));
+ }
+
+ ///
+ /// 每月工资明细表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "每月工资明细表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "PmsMonthSalary");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/BaseInfo/SalaryLevelController.cs b/ZR.Admin.WebApi/Controllers/BaseInfo/SalaryLevelController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..af28ce24a4eac0d874a8e3cc1d343a5383e015da
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/BaseInfo/SalaryLevelController.cs
@@ -0,0 +1,171 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.BaseInfo.Dto;
+using ZR.Model.BaseInfo;
+using ZR.Service.BaseInfo.IBaseInfoService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-04-10
+namespace ZR.Admin.WebApi.Controllers.BaseInfo
+{
+ ///
+ /// 岗位工资
+ ///
+ [Verify]
+ [Route("BaseInfo/SalaryLevel")]
+ public class SalaryLevelController : BaseController
+ {
+ ///
+ /// 岗位工资接口
+ ///
+ private readonly ISalaryLevelService _SalaryLevelService;
+
+ public SalaryLevelController(ISalaryLevelService SalaryLevelService)
+ {
+ _SalaryLevelService = SalaryLevelService;
+ }
+
+ ///
+ /// 查询岗位工资列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "SalaryLevel:list")]
+ public IActionResult QuerySalaryLevel([FromQuery] SalaryLevelQueryDto parm)
+ {
+ var response = _SalaryLevelService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询岗位工资详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "SalaryLevel:query")]
+ public IActionResult GetSalaryLevel(int Id)
+ {
+ var response = _SalaryLevelService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加岗位工资
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "SalaryLevel:add")]
+ [Log(Title = "岗位工资", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddSalaryLevel([FromBody] SalaryLevelDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _SalaryLevelService.AddSalaryLevel(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新岗位工资
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "SalaryLevel:edit")]
+ [Log(Title = "岗位工资", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateSalaryLevel([FromBody] SalaryLevelDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _SalaryLevelService.UpdateSalaryLevel(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除岗位工资
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "SalaryLevel:delete")]
+ [Log(Title = "岗位工资", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteSalaryLevel([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_SalaryLevelService.Delete(idArr));
+ }
+
+ ///
+ /// 导出岗位工资
+ ///
+ ///
+ [Log(Title = "岗位工资", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "SalaryLevel:export")]
+ public IActionResult Export([FromQuery] SalaryLevelQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _SalaryLevelService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "岗位工资", "岗位工资");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空岗位工资
+ ///
+ ///
+ [Log(Title = "岗位工资", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "SalaryLevel:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_SalaryLevelService.TruncateSalaryLevel());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "岗位工资导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "SalaryLevel:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_SalaryLevelService.ImportSalaryLevel(list.Adapt>()));
+ }
+
+ ///
+ /// 岗位工资导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "岗位工资模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "SalaryLevel");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/DocManage/DocBaseOrgController.cs b/ZR.Admin.WebApi/Controllers/DocManage/DocBaseOrgController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..401d4cceb4fdd4a4af07905f3060602d814071e6
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/DocManage/DocBaseOrgController.cs
@@ -0,0 +1,171 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.DocManage.Dto;
+using ZR.Model.DocManage;
+using ZR.Service.DocManage.IDocManageService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-10-13
+namespace ZR.Admin.WebApi.Controllers.DocManage
+{
+ ///
+ /// 全省仓库代码
+ ///
+ [Verify]
+ [Route("docManage/DocBaseOrg")]
+ public class DocBaseOrgController : BaseController
+ {
+ ///
+ /// 全省仓库代码接口
+ ///
+ private readonly IDocBaseOrgService _DocBaseOrgService;
+
+ public DocBaseOrgController(IDocBaseOrgService DocBaseOrgService)
+ {
+ _DocBaseOrgService = DocBaseOrgService;
+ }
+
+ ///
+ /// 查询全省仓库代码列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "docbaseorg:list")]
+ public IActionResult QueryDocBaseOrg([FromQuery] DocBaseOrgQueryDto parm)
+ {
+ var response = _DocBaseOrgService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询全省仓库代码详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "docbaseorg:query")]
+ public IActionResult GetDocBaseOrg(int Id)
+ {
+ var response = _DocBaseOrgService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加全省仓库代码
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "docbaseorg:add")]
+ [Log(Title = "全省仓库代码", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddDocBaseOrg([FromBody] DocBaseOrgDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _DocBaseOrgService.AddDocBaseOrg(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新全省仓库代码
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "docbaseorg:edit")]
+ [Log(Title = "全省仓库代码", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateDocBaseOrg([FromBody] DocBaseOrgDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _DocBaseOrgService.UpdateDocBaseOrg(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除全省仓库代码
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "docbaseorg:delete")]
+ [Log(Title = "全省仓库代码", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteDocBaseOrg([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_DocBaseOrgService.Delete(idArr));
+ }
+
+ ///
+ /// 导出全省仓库代码
+ ///
+ ///
+ [Log(Title = "全省仓库代码", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "docbaseorg:export")]
+ public IActionResult Export([FromQuery] DocBaseOrgQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _DocBaseOrgService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "全省仓库代码", "全省仓库代码");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空全省仓库代码
+ ///
+ ///
+ [Log(Title = "全省仓库代码", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "docbaseorg:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_DocBaseOrgService.TruncateDocBaseOrg());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "全省仓库代码导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "docbaseorg:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_DocBaseOrgService.ImportDocBaseOrg(list.Adapt>()));
+ }
+
+ ///
+ /// 全省仓库代码导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "全省仓库代码模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "DocBaseOrg");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/FjhsDetail/FjhsRecycleDetailController.cs b/ZR.Admin.WebApi/Controllers/FjhsDetail/FjhsRecycleDetailController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..cf49f4b09a4e538e6c2a90bb1c159ab29f1ac445
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/FjhsDetail/FjhsRecycleDetailController.cs
@@ -0,0 +1,296 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.FjhsDetail.Dto;
+using ZR.Model.FjhsDetail;
+using ZR.Service.FjhsDetail.IFjhsDetailService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+using ZR.Model.FjhsRecycle;
+using ZR.Model.FjhsRecycleSampling.Dto;
+using ZR.Model.FjhsRecycleSampling;
+using ZR.Service.FjhsRecycle.IFjhsRecycleService;
+
+//创建时间:2025-09-10
+namespace ZR.Admin.WebApi.Controllers.FjhsDetail
+{
+ ///
+ /// 回收明细表
+ ///
+ [Verify]
+ [Route("FjhsDetail/FjhsRecycleDetail")]
+ public class FjhsRecycleDetailController : BaseController
+ {
+ ///
+ /// 回收明细表接口
+ ///
+ private readonly IFjhsRecycleDetailService _FjhsRecycleDetailService;
+ private readonly IFjhsRecycleTaskHeadService _FjhsRecycleTaskHeadService;
+
+ public FjhsRecycleDetailController(IFjhsRecycleDetailService FjhsRecycleDetailService, IFjhsRecycleTaskHeadService fjhsRecycleTaskHeadService)
+ {
+ _FjhsRecycleDetailService = FjhsRecycleDetailService;
+ _FjhsRecycleTaskHeadService = fjhsRecycleTaskHeadService;
+ }
+
+
+
+ ///
+ /// 更新回收任务
+ ///
+ ///
+ //[HttpPut]
+ [HttpPost("updateFjhsRecycleSamplingDetail")] // 关键:添加路由后缀,与前端URL对应
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:edit")]
+ [Log(Title = "回收任务", BusinessType = BusinessType.UPDATE)]
+ public IActionResult updateFjhsRecycleSamplingDetail([FromBody] FjhsRecycleDetailDto parm)
+ {
+
+
+ //var modal = parm.materialDetails.Adapt().ToUpdate(HttpContext);
+ //var response = _FjhsRecycleSamplingDetailService.UpdateFjhsRecycleSamplingDetail(modal);
+
+ //return ToResponse(response);
+
+
+ // 基础参数验证
+ if (parm == null)
+ {
+ return BadRequest("参数不能为空");
+ }
+
+ if (parm.materialDetails == null || !parm.materialDetails.Any())
+ {
+ return BadRequest("没有需要更新的材料详情数据");
+ }
+
+
+
+ if (parm.IsMeetRecycleCondition == "不具备")
+ {
+ parm.IsMeetRecycleCondition = "0"; // 或直接转换为整数类型 0
+ }
+ else if (parm.IsMeetRecycleCondition == "具备")
+ {
+ parm.IsMeetRecycleCondition = "1"; // 或直接转换为整数类型 1
+ }
+ else
+ {
+ parm.IsMeetRecycleCondition = "1"; // 或直接转换为整数类型 1
+
+ }
+
+
+
+ try
+ {
+
+ // 转换为实体并设置更新信息
+ var main = parm.Adapt()
+ .ToUpdate(HttpContext);
+
+ // 调用服务更新
+
+
+
+ var m = _FjhsRecycleTaskHeadService.UpdateFjhsRecycleTaskHead(main);
+
+
+ foreach (var item in parm.materialDetails)
+ {
+ // 单个项目验证
+ if (item == null /*|| item.Id <= 0*/) // 假设Id是必须的标识字段
+ {
+ return BadRequest("存在无效的材料详情记录");
+ }
+
+
+
+
+
+
+ // 转换为实体并设置更新信息
+ var modal = item.Adapt()
+ .ToUpdate(HttpContext);
+
+ // 调用服务更新
+ var updateSuccess = _FjhsRecycleDetailService
+ .UpdateFjhsRecycleDetail(modal);
+
+ // 处理单个更新失败的情况
+ if (updateSuccess <= 0)
+ {
+ return StatusCode(500, $"更新失败,ID: {item.MaterialName}");
+ }
+ }
+
+
+
+ // 所有更新成功
+ return Ok($"成功更新 {parm.materialDetails.Count} 条材料详情记录");
+ }
+ catch (Exception ex)
+ {
+ // 直接返回异常信息(生产环境建议只返回通用信息)
+ return StatusCode(500, $"系统异常:{ex.Message}");
+ }
+
+ }
+
+
+
+
+ ///
+ /// 查询回收明细表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:list")]
+ public IActionResult QueryFjhsRecycleDetail([FromQuery] FjhsRecycleDetailQueryDto parm)
+ {
+ var response = _FjhsRecycleDetailService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询回收明细表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:query")]
+ public IActionResult GetFjhsRecycleDetail(int Id)
+ {
+
+
+
+ try
+ {
+ var response = _FjhsRecycleDetailService.GetInfo(Id).First();
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+ catch (Exception ex)
+ {
+ var m = ex.Message;
+
+ throw;
+ }
+ }
+
+ ///
+ /// 添加回收明细表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:add")]
+ [Log(Title = "回收明细表", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddFjhsRecycleDetail([FromBody] FjhsRecycleDetailDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _FjhsRecycleDetailService.AddFjhsRecycleDetail(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新回收明细表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:edit")]
+ [Log(Title = "回收明细表", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateFjhsRecycleDetail([FromBody] FjhsRecycleDetailDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _FjhsRecycleDetailService.UpdateFjhsRecycleDetail(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除回收明细表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:delete")]
+ [Log(Title = "回收明细表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteFjhsRecycleDetail([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_FjhsRecycleDetailService.Delete(idArr));
+ }
+
+ ///
+ /// 导出回收明细表
+ ///
+ ///
+ [Log(Title = "回收明细表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:export")]
+ public IActionResult Export([FromQuery] FjhsRecycleDetailQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _FjhsRecycleDetailService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "回收明细表", "回收明细表");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空回收明细表
+ ///
+ ///
+ [Log(Title = "回收明细表", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_FjhsRecycleDetailService.TruncateFjhsRecycleDetail());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "回收明细表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "fjhsrecycledetail:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_FjhsRecycleDetailService.ImportFjhsRecycleDetail(list.Adapt>()));
+ }
+
+ ///
+ /// 回收明细表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "回收明细表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "FjhsRecycleDetail");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/FjhsImage/FjhsRecycleTaskDetailImageController.cs b/ZR.Admin.WebApi/Controllers/FjhsImage/FjhsRecycleTaskDetailImageController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9140e5afde8442d40c6bbeb01e0910b70f831283
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/FjhsImage/FjhsRecycleTaskDetailImageController.cs
@@ -0,0 +1,173 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.FjhsImage.Dto;
+using ZR.Model.FjhsImage;
+using ZR.Service.FjhsImage.IFjhsImageService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+
+//创建时间:2025-09-17
+namespace ZR.Admin.WebApi.Controllers.FjhsImage
+{
+ ///
+ /// 回收任务明细图片表
+ ///
+ [Verify]
+ [Route("FjhsImage/FjhsRecycleTaskDetailImage")]
+ public class FjhsRecycleTaskDetailImageController : BaseController
+ {
+ ///
+ /// 回收任务明细图片表接口
+ ///
+ private readonly IFjhsRecycleTaskDetailImageService _FjhsRecycleTaskDetailImageService;
+
+ public FjhsRecycleTaskDetailImageController(IFjhsRecycleTaskDetailImageService FjhsRecycleTaskDetailImageService)
+ {
+ _FjhsRecycleTaskDetailImageService = FjhsRecycleTaskDetailImageService;
+ }
+
+ ///
+ /// 查询回收任务明细图片表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:list")]
+ public IActionResult QueryFjhsRecycleTaskDetailImage([FromQuery] FjhsRecycleTaskDetailImageQueryDto parm)
+ {
+
+
+ var response = _FjhsRecycleTaskDetailImageService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询回收任务明细图片表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:query")]
+ public IActionResult GetFjhsRecycleTaskDetailImage(int Id)
+ {
+ var response = _FjhsRecycleTaskDetailImageService.GetInfo(Id);
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+ ///
+ /// 添加回收任务明细图片表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:add")]
+ [Log(Title = "回收任务明细图片表", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddFjhsRecycleTaskDetailImage([FromBody] FjhsRecycleTaskDetailImageDto parm)
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _FjhsRecycleTaskDetailImageService.AddFjhsRecycleTaskDetailImage(modal);
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 更新回收任务明细图片表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:edit")]
+ [Log(Title = "回收任务明细图片表", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateFjhsRecycleTaskDetailImage([FromBody] FjhsRecycleTaskDetailImageDto parm)
+ {
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _FjhsRecycleTaskDetailImageService.UpdateFjhsRecycleTaskDetailImage(modal);
+
+ return ToResponse(response);
+ }
+
+ ///
+ /// 删除回收任务明细图片表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:delete")]
+ [Log(Title = "回收任务明细图片表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteFjhsRecycleTaskDetailImage([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_FjhsRecycleTaskDetailImageService.Delete(idArr));
+ }
+
+ ///
+ /// 导出回收任务明细图片表
+ ///
+ ///
+ [Log(Title = "回收任务明细图片表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:export")]
+ public IActionResult Export([FromQuery] FjhsRecycleTaskDetailImageQueryDto parm)
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _FjhsRecycleTaskDetailImageService.ExportList(parm).Result;
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "回收任务明细图片表", "回收任务明细图片表");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ ///
+ /// 清空回收任务明细图片表
+ ///
+ ///
+ [Log(Title = "回收任务明细图片表", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_FjhsRecycleTaskDetailImageService.TruncateFjhsRecycleTaskDetailImage());
+ }
+
+ ///
+ /// 导入
+ ///
+ ///
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "回收任务明细图片表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskdetailimage:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ {
+ List list = new();
+ using (var stream = formFile.OpenReadStream())
+ {
+ list = stream.Query(startCell: "A1").ToList();
+ }
+
+ return SUCCESS(_FjhsRecycleTaskDetailImageService.ImportFjhsRecycleTaskDetailImage(list.Adapt>()));
+ }
+
+ ///
+ /// 回收任务明细图片表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "回收任务明细图片表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "FjhsRecycleTaskDetailImage");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Controllers/FjhsRecycle/FjhsRecycleTaskHeadController.cs b/ZR.Admin.WebApi/Controllers/FjhsRecycle/FjhsRecycleTaskHeadController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4a50a8b83b898f4fcb8ec3b79df416421d18481e
--- /dev/null
+++ b/ZR.Admin.WebApi/Controllers/FjhsRecycle/FjhsRecycleTaskHeadController.cs
@@ -0,0 +1,1161 @@
+using Microsoft.AspNetCore.Mvc;
+using ZR.Model.FjhsRecycle.Dto;
+using ZR.Model.FjhsRecycle;
+using ZR.Service.FjhsRecycle.IFjhsRecycleService;
+using ZR.Admin.WebApi.Filters;
+using MiniExcelLibs;
+using ZR.Service.FjhsRecycleSampling.IFjhsRecycleSamplingService;
+using ZR.Service.FjhsRecycleSampling;
+using Aliyun.OSS;
+using ZR.Model.FjhsRecycleSampling;
+using ZR.Model.FjhsRecycleSampling.Dto;
+using Microsoft.IdentityModel.Tokens;
+using Org.BouncyCastle.Crypto;
+using ZR.Service.FjhsRecycle;
+using SqlSugar;
+using System.Collections.Generic;
+using NPOI.SS.UserModel;
+using NPOI.XSSF.UserModel;
+using NPOI.SS.Util;
+using materialDetailsList = ZR.Model.FjhsRecycle.Dto.materialDetailsList;
+using ZR.Model.DownM;
+using NPOI.HSSF.UserModel;
+using NPOI.SS.Formula.Functions;
+using NPOI.HPSF;
+
+//创建时间:2025-08-15
+namespace ZR.Admin.WebApi.Controllers.FjhsRecycle
+{
+ ///
+ /// 回收任务主表
+ ///
+ [Verify]
+ [Route("FjhsRecycle/FjhsRecycleTaskHead")]
+ public class FjhsRecycleTaskHeadController : BaseController
+ {
+ ///
+ /// 回收任务主表接口
+ ///
+ private readonly IFjhsRecycleTaskHeadService _FjhsRecycleTaskHeadService;
+
+ private readonly IFjhsRecycleTaskDetailService _FfjhsRecycleTaskDetailService;
+ private readonly IFjhsRecycleSamplingDetailService _FjhsRecycleSamplingDetailService;
+
+ private readonly ISysUserService _sysUserService;
+
+ public FjhsRecycleTaskHeadController(IFjhsRecycleTaskHeadService FjhsRecycleTaskHeadService, IFjhsRecycleTaskDetailService FfjhsRecycleTaskDetailService, ISysUserService sysUserService, IFjhsRecycleSamplingDetailService FjhsRecycleSamplingDetailService)
+ {
+ _FjhsRecycleTaskHeadService = FjhsRecycleTaskHeadService;
+ _FfjhsRecycleTaskDetailService = FfjhsRecycleTaskDetailService;
+ _FjhsRecycleSamplingDetailService = FjhsRecycleSamplingDetailService;
+ _sysUserService = sysUserService;
+ }
+
+ ///
+ /// 查询回收任务主表列表
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:list")]
+ public IActionResult QueryFjhsRecycleTaskHead([FromQuery] FjhsRecycleTaskHeadQueryDto parm)
+ {
+ var response = _FjhsRecycleTaskHeadService.GetList(parm);
+ return SUCCESS(response);
+ }
+
+
+ ///
+ /// 查询回收任务主表详情
+ ///
+ ///
+ ///
+ [HttpGet("{Id}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:query")]
+ public IActionResult GetFjhsRecycleTaskHead(int Id)
+ {
+ var response = _FjhsRecycleTaskHeadService.GetInfo(Id).First();
+
+ var info = response.Adapt();
+ return SUCCESS(info);
+ }
+
+
+
+
+ ///
+ /// 查询堪样任务表和主表详情,在这里暂时没有用,需要查前handlePreview按钮对应的逻辑
+ ///
+ ///
+ ///
+ [HttpGet("sampleList/{Id}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:query")]
+ public IActionResult getFjhsRecycleSampleList(int Id)
+ {
+ var response = _FjhsRecycleTaskHeadService.GetFjhsRecycleSampleList(Id).First();
+
+ var info = response.Adapt();
+
+ //var info = "";
+
+
+
+ return SUCCESS(info);
+ }
+
+
+
+ ///
+ /// 搬运回收清单
+ ///
+ ///
+ ///
+ [HttpGet("transport/{Id}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:query")]
+ public IActionResult transport(int Id)
+ {
+ var response = _FjhsRecycleTaskHeadService.GetFjhsRecycleSampleList(Id).First();
+
+ var info = response.Adapt();
+
+ //var info = "";
+
+
+
+ return SUCCESS(info);
+ }
+
+
+
+
+ /////
+ ///// 查询回收任务主表详情
+ /////
+ /////
+ /////
+ //[HttpGet("{Id}")]
+ //[ActionPermissionFilter(Permission = "fjhsrecycletaskhead:query")]
+ //public IActionResult getFjhsRecycleTaskMaterial(int Id)
+ //{
+ // var response = _FjhsRecycleTaskHeadService.GetInfo(Id);
+
+ // var info = response.Adapt();
+ // return SUCCESS(info);
+ //}
+
+
+
+ // 新增:获取回收任务的物料详情列表
+ ///
+ /// 查询回收任务关联的物料详情
+ ///
+ /// 回收任务主表ID(关联查询条件)
+ /// 物料详情列表
+ [HttpGet("material/{taskId}")] // 路由匹配前端的 "material/{taskId}"
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:query")] // 复用主表的查询权限
+ public IActionResult GetFjhsRecycleTaskMaterial(int taskId)
+ {
+ // 1. 调用服务层获取物料详情(根据实际业务调整方法名)
+ var materialList = _FfjhsRecycleTaskDetailService.GetInfo(taskId);
+
+ // 2. 转换为DTO(若有物料详情的DTO)
+ //var materialDtos = materialList.Adapt>();
+
+ var materialDtos = materialList.Adapt();
+
+ // 3. 返回统一格式的成功响应(与主表接口保持一致)
+ return SUCCESS(materialDtos);
+ }
+
+
+
+
+ ///
+ /// 保存回收任务后生成堪样任务
+ ///
+ /// 回收任务主键ID
+ /// 请求头中的当前用户名(用于日志和权限)
+ ///
+ [HttpPost("generateSample")] // 接口路径与前端一致
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:generateSample")] // 对应权限
+ [Log(Title = "回收任务生成堪样", BusinessType = BusinessType.OTHER)] // 日志记录
+ public IActionResult GenerateSampleTask(
+ // [FromQuery] long taskId, // 从查询参数获取回收任务ID(与前端params对应)
+ // [FromBody] List taskIds, // 接收ID数组(参数名改为taskIds,避免歧义)
+ // [FromBody] GenerateSampleRequest request, // 从请求体获取ID列表
+ [FromBody] GenerateSampleRequest taskIds,
+
+ //[FromHeader(Name = "updater")] string username) // 从请求头获取用户名
+ [FromHeader(Name = "username")] string username) // 从请求头获取用户名
+ {
+ // 1.参数校验
+ //if (taskId <= 0)
+ //{
+ // return ToResponse(ResultCode.FAIL, "回收任务ID不能为空");
+ //}
+
+ //if (taskIds == null || taskIds.Count == 0)
+ //{
+ // return ToResponse(ResultCode.FAIL, "回收任务ID列表不能为空");
+ //}
+ //if (taskIds.Any(id => id <= 0))
+ //{
+ // return ToResponse(ResultCode.FAIL, "存在无效的回收任务ID");
+ //}
+
+ if (string.IsNullOrEmpty(username))
+ {
+ return ToResponse(ResultCode.FAIL, "未获取到当前用户信息");
+ }
+
+ // var taskIds = Tools.SplitAndConvert(taskId.ToString());
+
+ try
+ {
+ foreach (var taskId1 in taskIds.TaskIds)
+ {
+
+ var response = _FjhsRecycleTaskHeadService.Getlist(taskId1.ParseToInt());
+
+
+
+
+
+ if (string.IsNullOrEmpty(response.First().Site))
+ {
+ return ToResponse(ResultCode.FAIL, "生成堪样任务前局点不能为空");
+ }
+
+ if (string.IsNullOrEmpty(response.First().DemandUnit))
+ {
+ return ToResponse(ResultCode.FAIL, "生成堪样任务前需求单位不能为空");
+ }
+
+ if (string.IsNullOrEmpty(response.First().ContactPerson))
+ {
+ return ToResponse(ResultCode.FAIL, "生成堪样任务前联系人不能为空");
+ }
+
+ if (string.IsNullOrEmpty(response.First().ContactPhone))
+ {
+ return ToResponse(ResultCode.FAIL, "生成堪样任务前联系电话不能为空");
+ }
+
+
+ foreach (var item in response)
+ {
+ var requst = new FjhsRecycleSamplingDetail
+ {
+ DocNumber = item.DocNumber,
+ MaterialName = item.materialName,
+ AssetName = item.assetName,
+ AssetCardNumber = item.assetCardNo,
+ Specification = item.specification,
+ UnitCard = item.unit,
+ EstimatedRecycleQuantity = int.Parse(item.expectedRecycleQty),
+
+
+
+ };
+
+
+ var modal = requst.Adapt().ToCreate(HttpContext);
+
+ var resulte = _FjhsRecycleSamplingDetailService.AddFjhsRecycleSamplingDetail(modal);
+
+ }
+
+
+
+
+
+
+ var requsetTask = new FjhsRecycleTaskHead()
+ {
+ CurrentProcessStatus = "01",
+ Id = response.First().Id,
+ };
+
+
+
+ var m =_FjhsRecycleTaskHeadService.UpdateFjhsRecycleTaskHead(requsetTask);
+
+
+ // return SUCCESS(resulte);
+ }
+ return SUCCESS("批量生成堪样任务成功");
+ }
+ catch (Exception ex)
+ {
+ var resulte = ex.Message;
+
+ throw;
+ }
+
+
+
+ }
+
+
+
+
+ ///
+ /// 添加回收任务主表
+ ///
+ ///
+ [HttpPost]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:add")]
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.INSERT)]
+ public IActionResult AddFjhsRecycleTaskHead([FromBody] FjhsRecycleTaskHeadDto parm)
+ {
+
+
+
+
+
+
+ // 2. 生成单据编号:当前年月日(yyyyMMdd) + 序号
+ // 假设序号从1开始,实际应用中可能需要从数据库获取最大序号
+ string datePart = DateTime.Now.ToString("yyyyMMdd");
+ DateTime datePart1 = DateTime.Now;
+
+ int sequence = _FjhsRecycleTaskHeadService.GetMaxSequenceByDate(datePart1); // 这里可以根据实际情况从数据库获取最新序号
+
+ var username = parm.Creator; //创建人
+ var city = _sysUserService.SelectUser(username).City; //归属地
+
+ // 3. 创建主表数据并设置相关字段
+
+
+ parm.DocNumber = $"FJ{datePart}{sequence:D4}";// 格式如:FJ202508250001 单据编号
+ parm.CurrentProcessStatus = "0"; //当前流程状态
+ parm.CurrentExpectedStatus = "1"; //当前预期状态
+ parm.BelongArea = city; //归属地
+ parm.CreateTime = datePart1; //创建时间
+
+
+
+
+ var modal = parm.Adapt().ToCreate(HttpContext);
+
+ var response = _FjhsRecycleTaskHeadService.AddFjhsRecycleTaskHead(modal);
+
+ // 4 处理明细数据,可以在这里为明细设置关联的单据编号
+
+ FjhsRecycleTaskDetail marterDetail = new FjhsRecycleTaskDetail();
+
+ foreach (var detail in parm.materialDetails)
+ {
+
+
+ marterDetail.DocNumber = parm.DocNumber; // 关联主表单据编号
+ marterDetail.CreateTime = DateTime.Now;
+ marterDetail.Creator = username;//创建人
+ marterDetail.StorageTime = parm.StorageTime; //缴库时间
+ marterDetail.AssetName = detail.assetName; //资产名称
+ marterDetail.AssetCardNumber = detail.assetCardNumber; //资产卡片号
+ marterDetail.MaterialName = detail.materialName; //物料名称
+ marterDetail.UnitCard = detail.unitCard; //计量单位
+ marterDetail.Specification = detail.specification; //规格型号
+ marterDetail.ApprovedQuantity = int.Parse(detail.approvedQuantity); //预计回收数据
+
+
+
+ var marterDetailDate = marterDetail.Adapt().ToCreate(HttpContext);
+ var response1 = _FfjhsRecycleTaskDetailService.AddFjhsRecycleTaskDetail(marterDetailDate);
+
+
+ }
+
+
+
+
+
+
+ return SUCCESS(response);
+ }
+
+ ///
+ /// 新增回收任务物料明细
+ ///
+ ///
+ //[HttpPost("addDetail/{parm}")]
+ // 修正:移除{parm},路由仅为"addDetail"(与前端路径对应)
+ [HttpPost("addDetail")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:add")]
+ [Log(Title = "回收任务物料明细", BusinessType = BusinessType.INSERT)]
+ public IActionResult addFjhsRecycleTaskDetail([FromBody] FjhsRecycleTaskDetailDto parm)
+ {
+ //var modal = parm.Adapt().ToCreate(HttpContext);
+
+ //var response = _FfjhsRecycleTaskDetailService.AddFjhsRecycleTaskDetail(modal);
+
+ //return SUCCESS(response);
+
+ try
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ var response = _FfjhsRecycleTaskDetailService.AddFjhsRecycleTaskDetail(modal);
+ return SUCCESS(response);
+ }
+ catch (Exception ex)
+ {
+ // 日志记录
+ return StatusCode(500, "添加失败:" + ex.Message);
+ }
+
+
+
+ }
+
+
+
+
+ ///
+ /// 新增图片上传
+ ///
+ ///
+ //[HttpPost("addDetail/{parm}")]
+ // 修正:移除{parm},路由仅为"addDetail"(与前端路径对应)
+ [HttpPost("Image")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:add")]
+ [Log(Title = "回收任务物料明细", BusinessType = BusinessType.INSERT)]
+ public IActionResult uploadImageRelation([FromBody] FjhsRecycleTaskDetailDto parm)
+ {
+ //var modal = parm.Adapt().ToCreate(HttpContext);
+
+ //var response = _FfjhsRecycleTaskDetailService.AddFjhsRecycleTaskDetail(modal);
+
+ //return SUCCESS(response);
+
+ try
+ {
+ var modal = parm.Adapt().ToCreate(HttpContext);
+ var response = _FfjhsRecycleTaskDetailService.AddFjhsRecycleTaskDetail(modal);
+ return SUCCESS(response);
+ }
+ catch (Exception ex)
+ {
+ // 日志记录
+ return StatusCode(500, "添加失败:" + ex.Message);
+ }
+
+
+
+ }
+
+
+
+
+
+
+ ///
+ /// 更新回收任务主表
+ ///
+ ///
+ [HttpPut]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:edit")]
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.UPDATE)]
+ public IActionResult UpdateFjhsRecycleTaskHead([FromBody] FjhsRecycleTaskHeadDto parm)
+ {
+ //var username1 = username;
+
+
+ if (parm.IsMeetRecycleCondition == "不具备")
+ {
+ parm.IsMeetRecycleCondition = "0"; // 或直接转换为整数类型 0
+ }
+ else if (parm.IsMeetRecycleCondition == "具备")
+ {
+ parm.IsMeetRecycleCondition = "1"; // 或直接转换为整数类型 1
+ }
+ else
+ {
+ parm.IsMeetRecycleCondition = "1"; // 或直接转换为整数类型 1
+
+ }
+
+ if (parm.CurrentProcessStatus =="生成单据")
+ {
+ parm.CurrentProcessStatus = "0";
+ }
+
+ if (parm.CurrentProcessStatus == "待堪样")
+ {
+ parm.CurrentProcessStatus = "01";
+ }
+
+ if (parm.CurrentProcessStatus == "堪样暂存")
+ {
+ parm.CurrentProcessStatus = "02";
+ }
+
+ if (parm.CurrentProcessStatus == "堪样完成")
+ {
+ parm.CurrentProcessStatus = "03";
+ }
+
+ if (parm.CurrentProcessStatus == "待回收搬运")
+ {
+ parm.CurrentProcessStatus = "1";
+ }
+
+ if (parm.CurrentProcessStatus == "回收搬运暂存")
+ {
+ parm.CurrentProcessStatus = "11";
+ }
+
+ if (parm.CurrentProcessStatus == "完成")
+ {
+ parm.CurrentProcessStatus = "2";
+ }
+
+ if (parm.CurrentProcessStatus == "取消")
+ {
+ parm.CurrentProcessStatus = "99";
+ }
+
+
+
+ var modal = parm.Adapt().ToUpdate(HttpContext);
+ var response = _FjhsRecycleTaskHeadService.UpdateFjhsRecycleTaskHead(modal);
+
+ return ToResponse(response);
+
+
+
+ //// 1. 参数校验
+ //if (parm == null)
+ //{
+ // return ToResponse(ResultCode.FAIL, "参数不能为空");
+ //}
+
+ //if (string.IsNullOrEmpty(username))
+ //{
+ // return ToResponse(ResultCode.FAIL, "未获取到用户信息");
+ //}
+
+ //if (parm.Id <= 0)
+ //{
+ // return ToResponse(ResultCode.FAIL, "主键ID不能为空");
+ //}
+
+ //// 2. 转换DTO为实体并设置审计字段
+ //var modal = parm.Adapt();
+
+ //// 3. 设置更新人信息(关键修改点)
+ //modal.Updater = username; // 更新修改人
+ //modal.UpdateTime = DateTime.Now; // 更新修改时间
+
+ //// 4. 如果需要,可以在这里补充其他业务逻辑
+ //// 例如:验证当前用户是否有权限修改该记录
+ //// var user = _sysUserService.SelectUser(username);
+ //// if (user == null)
+ //// {
+ //// return ToResponse(ResultCode.FAIL, "用户不存在");
+ //// }
+
+ //// 5. 调用服务层执行更新操作
+ //var response = _FjhsRecycleTaskHeadService.UpdateFjhsRecycleTaskHead(modal);
+
+ //return ToResponse(response);
+
+ }
+
+
+
+
+ ///
+ /// 删除回收任务主表
+ ///
+ ///
+ [HttpPost("delete/{ids}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:delete")]
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.DELETE)]
+ public IActionResult DeleteFjhsRecycleTaskHead([FromRoute]string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_FjhsRecycleTaskHeadService.Delete(idArr));
+ }
+
+
+
+ ///
+ /// 取消回收任务主表
+ ///
+ ///
+ [HttpPost("cance/{ids}")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:cance")]
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.DELETE)]
+ public IActionResult CanceFjhsRecycleTaskHead([FromRoute] string ids)
+ {
+ var idArr = Tools.SplitAndConvert(ids);
+
+ return ToResponse(_FjhsRecycleTaskHeadService.CanceFjhsRecycleTaskHead(idArr));
+ }
+
+
+
+ ///
+ /// 导出回收任务主表
+ ///
+ ///
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [HttpGet("export")]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:export")]
+ public IActionResult Export([FromQuery] FjhsRecycleTaskHeadQueryDto parm)
+ {
+
+ try
+ {
+ parm.PageNum = 1;
+ parm.PageSize = 100000;
+ var list = _FjhsRecycleTaskHeadService.ExportList(parm).Result;
+
+ if (list == null || list.Count <= 0)
+ {
+ return ToResponse(ResultCode.FAIL, "没有要导出的数据");
+ }
+ var result = ExportExcelMini(list, "回收任务主表", "回收任务主表");
+
+ return ExportExcel(result.Item2, result.Item1);
+ }
+ catch (Exception ex)
+ {
+ var msg = ex.Message;
+ throw;
+ }
+ }
+
+
+
+
+
+
+
+ ///
+ /// 导出回收搬运任务清单
+ ///
+ ///
+ [Log(Title = "导出回收搬运任务清单", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ //[HttpGet("RecycleExport")]
+ [HttpGet("RecycleExport/{id}")]
+ // [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:export")]
+ public IActionResult RecycleExport([FromRoute] string id)
+ {
+
+
+
+ try
+ {
+ var ID = int.Parse(id);
+
+
+ var transportInfo = _FjhsRecycleTaskHeadService.GetTransportInfoList(ID).First();
+ var RecycleMaterialDetail = _FjhsRecycleTaskHeadService.GetRecycleMaterialDetailList(ID);
+
+ var m = ExportRecycleBill(transportInfo, RecycleMaterialDetail);
+
+ return ExportExcel(m.Item2, m.Item1);
+
+
+ }
+ catch (Exception ex)
+ {
+ var msg = ex.Message;
+ throw;
+ }
+ }
+
+
+
+
+
+
+ ///
+ /// 清空回收任务主表
+ ///
+ ///
+ [Log(Title = "回收任务主表", BusinessType = BusinessType.CLEAN)]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:delete")]
+ [HttpPost("clean")]
+ public IActionResult Clear()
+ {
+ if (!HttpContextExtension.IsAdmin(HttpContext))
+ {
+ return ToResponse(ResultCode.FAIL, "操作失败");
+ }
+ return SUCCESS(_FjhsRecycleTaskHeadService.TruncateFjhsRecycleTaskHead());
+ }
+
+ /////
+ ///// 导入
+ /////
+ /////
+ /////
+ //[HttpPost("importData")]
+ //[Log(Title = "回收任务主表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ //[ActionPermissionFilter(Permission = "fjhsrecycletaskhead:import")]
+ //public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ //{
+ // List list = new();
+ // using (var stream = formFile.OpenReadStream())
+ // {
+ // list = stream.Query(startCell: "A1").ToList();
+ // }
+
+ // return SUCCESS(_FjhsRecycleTaskHeadService.ImportFjhsRecycleTaskHead(list.Adapt>()));
+ //}
+
+
+ ///
+ /// 导入
+ ///
+ ///
+ /// 从请求头获取用户名
+ ///
+ [HttpPost("importData")]
+ [Log(Title = "回收任务主表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:import")]
+ public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile, [FromHeader(Name = "userName")] string username)
+ {
+ //List list = new();
+
+
+ //using (var stream = formFile.OpenReadStream())
+ //{
+ // list = stream.Query(startCell: "A1").ToList();
+ //}
+
+ //return SUCCESS(_FjhsRecycleTaskHeadService.ImportFjhsRecycleTaskHead(list.Adapt>()));
+ try
+ {
+
+ List list = new();
+ List list_Detail = new();
+ var storageTime = DateTime.Now;
+
+
+ // --------------- 关键修复:1. 校验并获取 Excel 文件类型 ---------------
+ if (formFile == null || formFile.Length == 0)
+ {
+ return ToResponse(ResultCode.FAIL, "请选择上传的Excel文件");
+ }
+
+ // 获取文件后缀(如 .xlsx 或 .xls)
+ var fileExtension = Path.GetExtension(formFile.FileName).ToLower();
+ //ExcelType excelType; // MiniExcel 的文件类型枚举
+
+ //// 根据后缀指定 ExcelType
+ //if (fileExtension == ".xlsx")
+ //{
+ // excelType = ExcelType.XLSX; // .xlsx 格式
+ //}
+ //else if (fileExtension == ".xls")
+ //{
+ // // excelType = ExcelType.XLSX; // .xls 格式(旧版)
+
+ // excelType = ExcelType.XLSX; // .xls 格式(旧版)- 这里之前错误地写成了XLSX
+
+ // // 若为.xls,明确提示使用.xlsx;其他格式提示不支持
+ // var errorMsg = fileExtension == ".xls"
+ // ? "请使用.xlsx格式文件,暂不支持.xls格式!"
+ // : "不支持的文件类型!仅支持.xlsx格式";
+ // return ToResponse(ResultCode.FAIL, errorMsg);
+
+ //}
+ //else
+ //{
+ // return ToResponse(ResultCode.FAIL, "不支持的文件类型!仅支持 .xlsx 和 .xls 格式");
+ //}
+
+
+
+ //using (var stream = formFile.OpenReadStream())
+ //{
+ // // 关键修复:2. 将获取到的excelType传递给Query方法
+ // list_Detail = stream.Query(
+ // startCell: "A1",
+ // excelType: excelType // 显式指定文件类型
+ // ).ToList();
+ //}
+
+
+
+ // 支持 .xlsx 和 .xls 格式
+ if (fileExtension != ".xlsx" && fileExtension != ".xls")
+ {
+ return ToResponse(ResultCode.FAIL, "不支持的文件类型!仅支持 .xlsx 和 .xls 格式");
+ }
+
+ using (var stream = formFile.OpenReadStream())
+ {
+ if (fileExtension == ".xlsx")
+ {
+ // 使用 MiniExcel 处理 .xlsx
+ list_Detail = stream.Query(
+ startCell: "A1",
+ excelType: ExcelType.XLSX
+ ).ToList();
+ }
+ else // .xls 格式
+ {
+ // 使用 NPOI 处理 .xls
+ IWorkbook workbook = new HSSFWorkbook(stream);
+ ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表
+
+ // 从第二行开始读取(跳过标题行)
+ for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
+ {
+ IRow row = sheet.GetRow(rowIndex);
+ if (row == null) continue;
+
+ var detailDto = new FjhsRecycleTaskDetailDto();
+
+ // 根据列索引映射数据(需要根据实际Excel结构调整)
+ detailDto.AssetName = row.GetCell(0)?.ToString();
+ detailDto.AssetCardNumber = row.GetCell(2)?.ToString();
+ detailDto.Specification = row.GetCell(16)?.ToString();
+ detailDto.UnitCard = row.GetCell(17)?.ToString();
+ // detailDto.ApprovedQuantity = row.GetCell(20)?.ToString();
+ detailDto.MaterialName = row.GetCell(24)?.ToString();
+
+
+ if (row.GetCell(20) != null)
+ {
+ // 尝试将单元格值转换为整数
+ if (decimal.TryParse(row.GetCell(20).ToString()?.Trim(), out decimal result))
+ {
+ detailDto.ApprovedQuantity =(int) result;
+ }
+ else
+ {
+ // 转换失败时的默认值(根据业务需求设置,如0或null)
+ detailDto.ApprovedQuantity = 0;
+ // 可选:记录日志,提示哪一行的哪一列转换失败
+ // _logger.LogWarning($"行号 {row.RowNum + 1} 第21列无法转换为整数,值为:{cell.ToString()}");
+ }
+ }
+ else
+ {
+ // 单元格为空时的默认值
+ detailDto.ApprovedQuantity = 0; // 或 null(需字段允许为null)
+ }
+
+ // ... 其他属性映射
+
+ // 特殊类型处理(如日期)
+ if (row.GetCell(27) != null)
+ {
+ if (row.GetCell(27).CellType == CellType.Numeric)
+ {
+ detailDto.StorageTime = row.GetCell(27).DateCellValue;
+ }
+ else
+ {
+ detailDto.StorageTime = DateTime.Parse(row.GetCell(27).ToString());
+ }
+ }
+
+ list_Detail.Add(detailDto);
+ }
+ }
+ }
+
+
+
+
+
+
+
+ // 1. 从明细中获取缴库时间(假设取第一条明细的缴库时间)
+
+ if (list_Detail != null && list_Detail.Count > 0)
+ {
+ // 假设明细中有StorageTime字段存储缴库时间
+ if (list_Detail[0].StorageTime.HasValue)
+ {
+ storageTime = list_Detail[0].StorageTime.Value;
+ }
+ }
+
+ // 2. 生成单据编号:当前年月日(yyyyMMdd) + 序号
+ // 假设序号从1开始,实际应用中可能需要从数据库获取最大序号
+ string datePart = DateTime.Now.ToString("yyyyMMdd");
+ DateTime datePart1 = DateTime.Now;
+
+ int sequence = _FjhsRecycleTaskHeadService.GetMaxSequenceByDate(datePart1); // 这里可以根据实际情况从数据库获取最新序号
+
+ var usr = username; //创建人
+ var city = _sysUserService.SelectUser(username).City; //归属地
+
+ // 3. 创建主表数据并设置相关字段
+ var headDto = new FjhsRecycleTaskHeadDto
+ {
+ DocNumber = $"FJ{datePart}{sequence:D4}", // 格式如:202508250001
+ CurrentProcessStatus = "0", // 当前流程状态 0 表示生成单据
+ CurrentExpectedStatus = "1", // 当前逾期状态 1表示正常
+ StorageTime = storageTime, // 缴库时间
+ CreateTime = DateTime.Now,
+ Creator = username, //创建人
+
+ BelongArea = city, //归属地
+
+ };
+ list.Add(headDto);
+
+ // 4 处理明细数据,可以在这里为明细设置关联的单据编号
+
+ foreach (var detail in list_Detail)
+ {
+ detail.DocNumber = headDto.DocNumber; // 关联主表单据编号
+ detail.CreateTime = DateTime.Now;
+ detail.Creator = username;//创建人
+ }
+
+
+
+ var result1 = SUCCESS(_FjhsRecycleTaskHeadService.ImportFjhsRecycleTaskHead(list.Adapt>()));
+
+ // 导入明细数据
+ var result_Detail = SUCCESS(_FfjhsRecycleTaskDetailService.ImportFjhsRecycleTaskDetail(list_Detail.Adapt>()));
+
+
+ // 导入主表数据
+ return result1;
+
+ }
+ catch (Exception ex)
+ {
+ var result = ex.Message;
+
+
+ throw;
+ }
+
+
+
+
+
+ }
+
+
+
+
+
+
+ ///
+ /// 回收任务主表导入模板下载
+ ///
+ ///
+ [HttpGet("importTemplate")]
+ [Log(Title = "回收任务主表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult ImportTemplateExcel()
+ {
+ var result = DownloadImportTemplate(new List() { }, "FjhsRecycleTaskHead");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+
+ // 新增请求模型类(用于接收前端传递的参数)
+ public class GenerateSampleRequest
+ {
+ // 字段名要与前端传递的JSON键名一致
+ public List TaskIds { get; set; }
+ }
+
+
+
+ ///
+ /// 回收任务主表导入模板下载
+ ///
+ ///
+ [HttpGet("materialImportTemplate")]
+ [Log(Title = "回收任务主表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
+ [AllowAnonymous]
+ public IActionResult materialImportTemplateExcel()
+ {
+ //var result = DownloadImportTemplate(new List() { }, "FjhsRecycleTaskHead");
+ //return ExportExcel(result.Item2, result.Item1);
+
+ var result = DownloadImportTemplate(new List(), "MaterialImport");
+ return ExportExcel(result.Item2, result.Item1);
+ }
+
+
+ /////
+ ///// 导入
+ /////
+ /////
+ /////
+ //[HttpPost("importData")]
+ //[Log(Title = "回收任务主表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ //[ActionPermissionFilter(Permission = "fjhsrecycletaskhead:import")]
+ //public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
+ //{
+ // List list = new();
+ // using (var stream = formFile.OpenReadStream())
+ // {
+ // list = stream.Query(startCell: "A1").ToList();
+ // }
+
+ // return SUCCESS(_FjhsRecycleTaskHeadService.ImportFjhsRecycleTaskHead(list.Adapt>()));
+ //}
+
+
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpPost("importMaterial")]
+ [Log(Title = "物料明细导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
+ [ActionPermissionFilter(Permission = "fjhsrecycletaskhead:import")]
+ public IActionResult importMaterial([FromForm(Name = "file")] IFormFile formFile)
+ {
+
+
+ // try
+ // {
+
+ // // 这里是你的导入处理逻辑
+ // // 实际项目中应该从文件中读取并处理数据
+ // var materialList = new List