using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using TaskManager.Entity; using TaskManager.EntityFramework.Repository; using TaskManager.EntityFramework; using Wood.Service.Controllers; using Magicodes.ExporterAndImporter.Core.Models; using System.Transactions; using Wood.Util; namespace Wood.Service.Datas { public class SupplierInfoDtService : NormalBaseController { const string _taskName = "供应商基础信息"; private readonly IRepository _taskSubRepository; private readonly IRepository _supplierInfoRepository; private readonly IRepository _taskConfigureRepository; private readonly CommonService _commonService; public SupplierInfoDtService(JobDbContext context, IServiceProvider builder, IConfiguration configuration, IRepository repository, IRepository taskSubRepository, IRepository supplierInfoRepository, IRepository taskConfigureRepository, CommonService commonService) : base(context, builder, configuration, repository) { _taskSubRepository = taskSubRepository; _supplierInfoRepository = supplierInfoRepository; _taskConfigureRepository = taskConfigureRepository; _commonService = commonService; _taskSubRepository.SetDbContext(_context); _supplierInfoRepository.SetDbContext(_context); _taskConfigureRepository.SetDbContext(_context); } [HttpPost] [Route("import")] public override async Task Import(IFormFile file) { if (file == null || file.Length == 0) { return NotFound(); } MemoryStream memStream = new MemoryStream(); await file.CopyToAsync(memStream); var importer = new ExcelImporter(); ImportResult impResult = await importer.Import(memStream); if (impResult.HasError) { StringBuilder sb = new StringBuilder(); foreach (var rowErr in impResult.RowErrors) { string temp = string.Join(";", rowErr.FieldErrors.Select(itm => $"第{rowErr.RowIndex}行:{itm.Key}-{itm.Value}")); sb.AppendLine(temp); } foreach (var templateErr in impResult.TemplateErrors) { string temp = $"列名:{templateErr.RequireColumnName},错误信息:{templateErr.Message}"; sb.AppendLine(temp); } throw new Exception(sb.ToString()); } var entityLst = impResult.Data; using var transaction = _context.Database.BeginTransaction(); try { #region 数据库操作 //添加任务 TaskSub taskSubObj = _commonService.BuildTaskSub(entityLst.Count, _taskName); await _taskSubRepository.AddAsync(taskSubObj); //添加任务明细 foreach (var empDtObj in entityLst) { SUPPLIER_INFO empObj = ExpressionGenericMapper.Trans(empDtObj); empObj.TaskId = taskSubObj.TaskId; await _supplierInfoRepository.AddAsync(empObj); } foreach (var empDtObj in entityLst) { //以“供应商代码+工厂代码+车间代码+产线代码+工位代码”为唯一标识,做新增或更新存储 var firstObj = _context.Set().FirstOrDefault( itm => itm.SupplierCode == empDtObj.SupplierCode && itm.PlantId == empDtObj.PlantId && itm.WorkshopId == empDtObj.WorkshopId && itm.ProductionLineId == empDtObj.ProductionLineId && itm.StationId == empDtObj.StationId ); if (firstObj == null) { var ret = await base.Create(empDtObj); } else { var ret = await base.Update(empDtObj); } } #endregion transaction.Commit(); return Ok(true); } catch (Exception ex) { transaction.Rollback(); throw new Exception("方法体执行报错,事务回滚:" + ex.Message); } } public override async Task> Create(SUPPLIER_INFO_DT entity) { using var transaction = _context.Database.BeginTransaction(); try { #region 数据库操作 //添加任务 TaskSub taskSubObj = _commonService.BuildTaskSub(1, _taskName); await _taskSubRepository.AddAsync(taskSubObj); //添加任务明细 SUPPLIER_INFO empObj = ExpressionGenericMapper.Trans(entity); empObj.TaskId = taskSubObj.TaskId; await _supplierInfoRepository.AddAsync(empObj); var firstObj = _context.Set().FirstOrDefault( itm => itm.SupplierCode == entity.SupplierCode && itm.PlantId == entity.PlantId && itm.WorkshopId == entity.WorkshopId && itm.ProductionLineId == entity.ProductionLineId && itm.StationId == entity.StationId ); if (firstObj == null) { var ret = await base.Create(entity); } else { throw new Exception("数据库已经存在,不能重复插入"); } #endregion transaction.Commit(); return Ok(true); } catch (Exception ex) { transaction.Rollback(); throw new Exception("方法体执行报错,事务回滚:" + ex.Message); } } public override async Task Update(SUPPLIER_INFO_DT entity) { using var transaction = _context.Database.BeginTransaction(); try { #region 数据库操作 //添加任务 TaskSub taskSubObj = _commonService.BuildTaskSub(1, _taskName); await _taskSubRepository.AddAsync(taskSubObj); //添加任务明细 SUPPLIER_INFO empObj = ExpressionGenericMapper.Trans(entity); empObj.TaskId = taskSubObj.TaskId; await _supplierInfoRepository.AddAsync(empObj); var firstObj = _context.Set().FirstOrDefault( itm => itm.SupplierCode == entity.SupplierCode && itm.PlantId == entity.PlantId && itm.WorkshopId == entity.WorkshopId && itm.ProductionLineId == entity.ProductionLineId && itm.StationId == entity.StationId ); if (firstObj == null) { throw new Exception("数据库不存在,不能更新"); } else { var ret = await base.Update(entity); } #endregion transaction.Commit(); return Ok(true); } catch (Exception ex) { transaction.Rollback(); throw new Exception("方法体执行报错,事务回滚:" + ex.Message); } } } }