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 = "BaseCustomer", Order = 100)] [Route("api")] public class BaseCustomerService : IBaseCustomerService, IDynamicApiController, ITransient { private readonly IRepository _baseCustomerRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public BaseCustomerService( IRepository baseCustomerRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _baseCustomerRep = baseCustomerRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询往来单位 /// /// /// [HttpGet("BaseCustomer/page")] public async Task> Page([FromQuery] BaseCustomerSearch input) { var baseCustomers = await _baseCustomerRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.CustCode), u => u.CustCode == input.CustCode) .Where(!string.IsNullOrEmpty(input.CustChinaName), u => u.CustChinaName == input.CustChinaName) .Where(!string.IsNullOrEmpty(input.CustEnglishName), u => u.CustEnglishName == input.CustEnglishName) .Where(!string.IsNullOrEmpty(input.MnemonicCode), u => u.MnemonicCode == input.MnemonicCode) .Where(input.CustType != null, u => u.CustType == input.CustType) .Where(!string.IsNullOrEmpty(input.LinkMan), u => u.LinkMan == input.LinkMan) .Where(!string.IsNullOrEmpty(input.Phone), u => u.Phone == input.Phone) .Where(!string.IsNullOrEmpty(input.Email), u => u.Email == input.Email) .Where(!string.IsNullOrEmpty(input.ZipCode), u => u.ZipCode == input.ZipCode) .Where(!string.IsNullOrEmpty(input.Province), u => u.Province == input.Province) .Where(!string.IsNullOrEmpty(input.City), u => u.City == input.City) .Where(!string.IsNullOrEmpty(input.Address), u => u.Address == input.Address) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .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 baseCustomers; } /// /// 不分页查询往来单位列表 /// /// 往来单位查询参数 /// (往来单位)实例列表 [HttpGet("BaseCustomer/listNonPage")] public async Task> ListNonPageAsync([FromQuery] BaseCustomerSearchNonPage input) { var pCustCode = input.CustCode?.Trim() ?? ""; var pCustChinaName = input.CustChinaName?.Trim() ?? ""; var pCustEnglishName = input.CustEnglishName?.Trim() ?? ""; var pMnemonicCode = input.MnemonicCode?.Trim() ?? ""; var pCustType = input.CustType; var pLinkMan = input.LinkMan?.Trim() ?? ""; var pPhone = input.Phone?.Trim() ?? ""; var pEmail = input.Email?.Trim() ?? ""; var pZipCode = input.ZipCode?.Trim() ?? ""; var pProvince = input.Province?.Trim() ?? ""; var pCity = input.City?.Trim() ?? ""; var pAddress = input.Address?.Trim() ?? ""; var pIsDisabled = input.IsDisabled; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var baseCustomers = await _baseCustomerRep.DetachedEntities .Where(!string.IsNullOrEmpty(pCustCode), u => u.CustCode == pCustCode) .Where(!string.IsNullOrEmpty(pCustChinaName), u => u.CustChinaName == pCustChinaName) .Where(!string.IsNullOrEmpty(pCustEnglishName), u => u.CustEnglishName == pCustEnglishName) .Where(!string.IsNullOrEmpty(pMnemonicCode), u => u.MnemonicCode == pMnemonicCode) .Where(pCustType != null, u => u.CustType == pCustType) .Where(!string.IsNullOrEmpty(pLinkMan), u => u.LinkMan == pLinkMan) .Where(!string.IsNullOrEmpty(pPhone), u => u.Phone == pPhone) .Where(!string.IsNullOrEmpty(pEmail), u => u.Email == pEmail) .Where(!string.IsNullOrEmpty(pZipCode), u => u.ZipCode == pZipCode) .Where(!string.IsNullOrEmpty(pProvince), u => u.Province == pProvince) .Where(!string.IsNullOrEmpty(pCity), u => u.City == pCity) .Where(!string.IsNullOrEmpty(pAddress), u => u.Address == pAddress) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .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 baseCustomers; } /// /// 获取往来单位 /// /// /// [HttpGet("BaseCustomer/detail")] public async Task Get([FromQuery] QueryeBaseCustomerInput input) { return (await _baseCustomerRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取往来单位列表 /// /// /// [HttpGet("BaseCustomer/list")] public async Task> List([FromQuery] BaseCustomerInput input) { return await _baseCustomerRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加往来单位 /// /// /// [HttpPost("BaseCustomer/add")] public async Task Add(AddBaseCustomerInput input) { var baseCustomer = input.Adapt(); baseCustomer.CustCode = await SerialUtil.GetSerial(EnumSerialType.客户编号); baseCustomer.CustTypeName = baseCustomer.CustType.ToString(); //验证 await CheckExisit(baseCustomer); baseCustomer.CreatedUserId = baseCustomer.UpdatedUserId = SysHelper.GetUserId(); baseCustomer.CreatedUserName = baseCustomer.UpdatedUserName = SysHelper.GetUserName(); baseCustomer.CreatedTime = baseCustomer.UpdatedTime = SysHelper.GetNowTime(); await _baseCustomerRep.InsertAsync(baseCustomer); } /// /// 删除往来单位 /// /// /// [HttpPost("BaseCustomer/delete")] public async Task Delete(DeleteBaseCustomerInput input) { var baseCustomer = await _baseCustomerRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _baseCustomerRep.DeleteAsync(baseCustomer); } /// /// 更新往来单位 /// /// /// [HttpPost("BaseCustomer/edit")] public async Task Update(UpdateBaseCustomerInput input) { var isExist = await _baseCustomerRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var baseCustomer = input.Adapt(); //验证 await CheckExisit(baseCustomer,true); baseCustomer.UpdatedUserId = SysHelper.GetUserId(); baseCustomer.UpdatedUserName = SysHelper.GetUserName(); baseCustomer.UpdatedTime = SysHelper.GetNowTime(); await _baseCustomerRep.UpdateAsync(baseCustomer,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入往来单位功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("BaseCustomer/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) { _baseCustomerRep.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 _custCode = await SerialUtil.GetSerial(EnumSerialType.客户编号); var addItem = new BaseCustomer() { CustCode = _custCode,// CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _CustChinaName = "";//客户中文名称 var _CustEnglishName = "";//客户英文名称 var _MnemonicCode = "";//助记码 var _CustType = "";//类型 var _LinkMan = "";//联系人 var _Phone = "";//电话 var _Email = "";//电子邮件 var _ZipCode = "";//邮编 var _Province = "";//省份 var _City = "";//城市 var _Address = "";//地址 var _IsDisabled = "";//是否禁用 #endregion #region 取值 _CustChinaName = row["客户中文名称"]?.ToString() ; _CustEnglishName = row["客户英文名称"]?.ToString() ; _MnemonicCode = row["助记码"]?.ToString() ; _CustType = row["类型"]?.ToString() ; _LinkMan = row["联系人"]?.ToString() ; _Phone = row["电话"]?.ToString() ; _Email = row["电子邮件"]?.ToString() ; _ZipCode = row["邮编"]?.ToString() ; _Province = row["省份"]?.ToString() ; _City = row["城市"]?.ToString() ; _Address = row["地址"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_CustChinaName)) { throw Oops.Oh($"第{index}行[客户中文名称]{_CustChinaName}不能为空!"); } if(!string.IsNullOrEmpty(_CustChinaName)) { addItem.CustChinaName = (string)_CustChinaName; } if(!string.IsNullOrEmpty(_CustEnglishName)) { addItem.CustEnglishName = (string)_CustEnglishName; } if(!string.IsNullOrEmpty(_MnemonicCode)) { addItem.MnemonicCode = (string)_MnemonicCode; } if (string.IsNullOrEmpty(_CustType)) { throw Oops.Oh($"第{index}行[类型]{_CustType}不能为空!"); } if(!string.IsNullOrEmpty(_CustType)) { Admin.NET.Core.BaseCustomerTypeEnum enumCustType = default(Admin.NET.Core.BaseCustomerTypeEnum); if(!Enum.TryParse(_CustType, out enumCustType)&&!string.IsNullOrEmpty(_CustType)) { throw Oops.Oh($"第{index}行[类型]{_CustType}值不正确!"); } else { addItem.CustType = enumCustType; addItem.CustTypeName = addItem.CustType.ToString(); } } if(!string.IsNullOrEmpty(_LinkMan)) { addItem.LinkMan = (string)_LinkMan; } if(!string.IsNullOrEmpty(_Phone)) { addItem.Phone = (string)_Phone; } if(!string.IsNullOrEmpty(_Email)) { addItem.Email = (string)_Email; } if(!string.IsNullOrEmpty(_ZipCode)) { addItem.ZipCode = (string)_ZipCode; } if(!string.IsNullOrEmpty(_Province)) { addItem.Province = (string)_Province; } if(!string.IsNullOrEmpty(_City)) { addItem.City = (string)_City; } if(!string.IsNullOrEmpty(_Address)) { addItem.Address = (string)_Address; } if(!string.IsNullOrEmpty(_IsDisabled)) { if(!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否")) { throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!"); } else { bool outIsDisabled = _IsDisabled.Equals("是") ? true : false; addItem.IsDisabled = outIsDisabled; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载往来单位的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("BaseCustomer/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\BaseCustomer{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(BaseCustomer input, bool isEdit = false) { bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _baseCustomerRep.AnyAsync(u => u.CustChinaName.Equals(input.CustChinaName) , false); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _baseCustomerRep.AnyAsync(u => u.Id != input.Id && u.CustChinaName.Equals(input.CustChinaName) , false); } if (isExist) throw Oops.Oh(ErrorCode.E0001); } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //数据是否重复 var existExcelItem = inputs.GroupBy(g => new { g.CustChinaName }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.CustChinaName }).FirstOrDefault(); if (existExcelItem != null) { var item = existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,客户中文名称[{item.CustChinaName}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _baseCustomerRep.DetachedEntities.FirstOrDefaultAsync(w => inputs.Select(s => "" + s.CustChinaName ) .Contains("" + w.CustChinaName )); if (existDBItem != null) { var item = existDBItem.Adapt(); throw Oops.Oh($"系统中,客户中文名称[{item.CustChinaName}]已存在"); } } #endregion } }