using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; namespace Admin.NET.Application { /// /// 物料客户关联信息服务 /// [ApiDescriptionSettings("WmsBase", Name = "WmsMaterialCustomer", Order = 100)] [Route("api")] public class WmsMaterialCustomerService : IWmsMaterialCustomerService, IDynamicApiController, ITransient { private readonly IRepository _wmsMaterialCustomerRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsMaterialCustomerService( IRepository wmsMaterialCustomerRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsMaterialCustomerRep = wmsMaterialCustomerRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询物料客户关联信息 /// /// /// [HttpGet("WmsMaterialCustomer/page")] public async Task> Page([FromQuery] WmsMaterialCustomerSearch input) { var wmsMaterialCustomers = await _wmsMaterialCustomerRep.DetachedEntities .Where(input.MaterialId != null, u => u.MaterialId == input.MaterialId) .Where(!string.IsNullOrEmpty(input.MaterialCode), u => u.MaterialCode == input.MaterialCode) .Where(!string.IsNullOrEmpty(input.MaterialName), u => u.MaterialName == input.MaterialName) .Where(input.CustId != null, u => u.CustId == input.CustId) .Where(!string.IsNullOrEmpty(input.CustCode), u => u.CustCode == input.CustCode) .Where(!string.IsNullOrEmpty(input.CustEnglishName), u => u.CustEnglishName == input.CustEnglishName) .Where(!string.IsNullOrEmpty(input.CustChinaName), u => u.CustChinaName == input.CustChinaName) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName) .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsMaterialCustomers; } /// /// 不分页查询物料客户关联信息列表 /// /// 物料客户关联信息查询参数 /// (物料客户关联信息)实例列表 [HttpGet("WmsMaterialCustomer/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsMaterialCustomerSearchNonPage input) { var pMaterialId = input.MaterialId; var pMaterialCode = input.MaterialCode?.Trim() ?? ""; var pMaterialName = input.MaterialName?.Trim() ?? ""; var pCustId = input.CustId; var pCustCode = input.CustCode?.Trim() ?? ""; var pCustEnglishName = input.CustEnglishName?.Trim() ?? ""; var pCustChinaName = input.CustChinaName?.Trim() ?? ""; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsMaterialCustomers = await _wmsMaterialCustomerRep.DetachedEntities .Where(pMaterialId != null, u => u.MaterialId == pMaterialId) .Where(!string.IsNullOrEmpty(pMaterialCode), u => u.MaterialCode == pMaterialCode) .Where(!string.IsNullOrEmpty(pMaterialName), u => u.MaterialName == pMaterialName) .Where(pCustId != null, u => u.CustId == pCustId) .Where(!string.IsNullOrEmpty(pCustCode), u => u.CustCode == pCustCode) .Where(!string.IsNullOrEmpty(pCustEnglishName), u => u.CustEnglishName == pCustEnglishName) .Where(!string.IsNullOrEmpty(pCustChinaName), u => u.CustChinaName == pCustChinaName) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName) .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return wmsMaterialCustomers; } /// /// 获取物料客户关联信息 /// /// /// [HttpGet("WmsMaterialCustomer/detail")] public async Task Get([FromQuery] QueryeWmsMaterialCustomerInput input) { return (await _wmsMaterialCustomerRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取物料客户关联信息列表 /// /// /// [HttpGet("WmsMaterialCustomer/list")] public async Task> List([FromQuery] WmsMaterialCustomerInput input) { return await _wmsMaterialCustomerRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加物料客户关联信息 /// /// /// [HttpPost("WmsMaterialCustomer/add")] public async Task Add(AddWmsMaterialCustomerInput input) { var wmsMaterialCustomer = input.Adapt(); //验证 await CheckExisit(wmsMaterialCustomer); wmsMaterialCustomer.CreatedUserId = wmsMaterialCustomer.UpdatedUserId = SysHelper.GetUserId(); wmsMaterialCustomer.CreatedUserName = wmsMaterialCustomer.UpdatedUserName = SysHelper.GetUserName(); wmsMaterialCustomer.CreatedTime = wmsMaterialCustomer.UpdatedTime = SysHelper.GetNowTime(); await _wmsMaterialCustomerRep.InsertAsync(wmsMaterialCustomer); } /// /// 删除物料客户关联信息 /// /// /// [HttpPost("WmsMaterialCustomer/delete")] public async Task Delete(DeleteWmsMaterialCustomerInput input) { var wmsMaterialCustomer = await _wmsMaterialCustomerRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsMaterialCustomerRep.DeleteAsync(wmsMaterialCustomer); } /// /// 更新物料客户关联信息 /// /// /// [HttpPost("WmsMaterialCustomer/edit")] public async Task Update(UpdateWmsMaterialCustomerInput input) { var isExist = await _wmsMaterialCustomerRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsMaterialCustomer = input.Adapt(); //验证 await CheckExisit(wmsMaterialCustomer,true); wmsMaterialCustomer.UpdatedUserId = SysHelper.GetUserId(); wmsMaterialCustomer.UpdatedUserName = SysHelper.GetUserName(); wmsMaterialCustomer.UpdatedTime = SysHelper.GetNowTime(); await _wmsMaterialCustomerRep.UpdateAsync(wmsMaterialCustomer,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入物料客户关联信息功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsMaterialCustomer/importExcel")] public async Task ImportExcelAsync(IFormFile file) { int _HeadStartLine = 2;//第1行是说明,第2行是列名 int _DataStartLine = 3;//第3行开始是数据 DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList =await CommonImport(importDataTable, _DataStartLine); lock (_lock) { _wmsMaterialCustomerRep.InsertAsync(addList); } await Task.CompletedTask; return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsMaterialCustomer() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _MaterialId = "";//物料ID var _MaterialCode = "";//物料编号 var _MaterialName = "";//物料名称 var _CustId = "";//客户ID var _CustCode = "";//客户编号 var _CustEnglishName = "";//客户英文名称 var _CustChinaName = "";//客户中文名称 var _Id = "";//Id主键 #endregion #region 取值 _MaterialId = row["物料ID"]?.ToString() ; _MaterialCode = row["物料编号"]?.ToString() ; _MaterialName = row["物料名称"]?.ToString() ; _CustId = row["客户ID"]?.ToString() ; _CustCode = row["客户编号"]?.ToString() ; _CustEnglishName = row["客户英文名称"]?.ToString() ; _CustChinaName = row["客户中文名称"]?.ToString() ; _Id = row["Id主键"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_MaterialId)) { throw Oops.Oh($"第{index}行[物料ID]{_MaterialId}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialId)) { if (!long.TryParse(_MaterialId, out long outMaterialId)&&!string.IsNullOrEmpty(_MaterialId)) { throw Oops.Oh($"第{index}行[物料ID]{_MaterialId}值不正确!"); } if (outMaterialId <= 0&&!string.IsNullOrEmpty(_MaterialId)) { throw Oops.Oh($"第{index}行[物料ID]{_MaterialId}值不能小于等于0!"); } else { addItem.MaterialId = outMaterialId; } } if (string.IsNullOrEmpty(_MaterialCode)) { throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialCode)) { addItem.MaterialCode = (string)_MaterialCode; } if (string.IsNullOrEmpty(_MaterialName)) { throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialName)) { addItem.MaterialName = (string)_MaterialName; } if(!string.IsNullOrEmpty(_CustId)) { if (!long.TryParse(_CustId, out long outCustId)&&!string.IsNullOrEmpty(_CustId)) { throw Oops.Oh($"第{index}行[客户ID]{_CustId}值不正确!"); } if (outCustId <= 0&&!string.IsNullOrEmpty(_CustId)) { throw Oops.Oh($"第{index}行[客户ID]{_CustId}值不能小于等于0!"); } else { addItem.CustId = outCustId; } } if(!string.IsNullOrEmpty(_CustCode)) { addItem.CustCode = (string)_CustCode; } if(!string.IsNullOrEmpty(_CustEnglishName)) { addItem.CustEnglishName = (string)_CustEnglishName; } if(!string.IsNullOrEmpty(_CustChinaName)) { addItem.CustChinaName = (string)_CustChinaName; } if(!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!"); } if (outId <= 0&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!"); } else { addItem.Id = outId; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载物料客户关联信息的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("WmsMaterialCustomer/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsMaterialCustomer{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx"; var fileName = HttpUtility.UrlEncode($"导入模板(物料客户关联信息).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } #endregion #region 私有方法 /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// private async Task CheckExisit( WmsMaterialCustomer input,bool isEdit=false) { //没有配置联合主键,不需要验重 } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 } #endregion } }