// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! using Admin.NET.Core.Service; using Microsoft.AspNetCore.Http; using Furion.DatabaseAccessor; using Furion.FriendlyException; using Mapster; using SqlSugar; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Furion.DynamicApiController; using Furion.DependencyInjection; using Admin.NET.Core; using FZCZTB.NET.MD.CutomerMd.Extend; using cylsg.utility; namespace FZCZTB.Net.CustomerSYSTem; /// /// 企业资料服务 🧩 /// [ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] public class FBS_CusExtendService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _fBS_CusExtendRep; private readonly ISqlSugarClient _sqlSugarClient; private readonly SysDictTypeService _sysDictTypeService; private readonly FBS_EnterpriseTypeService _EnterpriseTypeService; public FBS_CusExtendService(SqlSugarRepository fBS_CusExtendRep, ISqlSugarClient sqlSugarClient, SysDictTypeService sysDictTypeService, FBS_EnterpriseTypeService fBS_EnterpriseTypeService ) { _fBS_CusExtendRep = fBS_CusExtendRep; _sqlSugarClient = sqlSugarClient; _sysDictTypeService = sysDictTypeService; _EnterpriseTypeService = fBS_EnterpriseTypeService; } /// /// /// /// [DisplayName("页面其他初始化资料")] [ApiDescriptionSettings(Name = "GetParam"), HttpGet] public async Task GetParam() { return new FBS_CusExtendParam() { EnterpriseTypes = await _EnterpriseTypeService.GetTreeData(), StepsTypeItems = CommonHelper.GetEnumItemsWithAttributes() }; } /// /// 分页查询企业资料 🔖 /// /// /// [DisplayName("分页查询企业资料")] [ApiDescriptionSettings(Name = "Page"), HttpPost] public async Task> Page(PageFBS_CusExtendInput input) { input.Keyword = input.Keyword?.Trim(); var query = _fBS_CusExtendRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.EnterpriseType.Contains(input.Keyword) || u.TransactionCode.Contains(input.Keyword) || u.BusinessLicense.Contains(input.Keyword) || u.EnterpriseName.Contains(input.Keyword) || u.UnifiedSocialCreditCode.Contains(input.Keyword) || u.RegisteredCapital.Contains(input.Keyword) || u.LegalRepresentativeName.Contains(input.Keyword) || u.LegalRepresentativeIdCard.Contains(input.Keyword) || u.LegalRepresentativeIdNumber.Contains(input.Keyword) || u.LegalRepresentativePhone.Contains(input.Keyword) || u.Residence.Contains(input.Keyword) || u.EnterprisePhone.Contains(input.Keyword) || u.MainBusiness.Contains(input.Keyword) || u.EnterpriseEmail.Contains(input.Keyword) || u.OperatorName.Contains(input.Keyword) || u.OperatorIdCard.Contains(input.Keyword) || u.OperatorIdNumber.Contains(input.Keyword) || u.OperatorPhone.Contains(input.Keyword) || u.BankName.Contains(input.Keyword) || u.BankAccount.Contains(input.Keyword)) .WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseType), u => u.EnterpriseType.Contains(input.EnterpriseType.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.TransactionCode), u => u.TransactionCode.Contains(input.TransactionCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.BusinessLicense), u => u.BusinessLicense.Contains(input.BusinessLicense.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseName), u => u.EnterpriseName.Contains(input.EnterpriseName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.UnifiedSocialCreditCode), u => u.UnifiedSocialCreditCode.Contains(input.UnifiedSocialCreditCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RegisteredCapital), u => u.RegisteredCapital.Contains(input.RegisteredCapital.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeName), u => u.LegalRepresentativeName.Contains(input.LegalRepresentativeName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeIdCard), u => u.LegalRepresentativeIdCard.Contains(input.LegalRepresentativeIdCard.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeIdNumber), u => u.LegalRepresentativeIdNumber.Contains(input.LegalRepresentativeIdNumber.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativePhone), u => u.LegalRepresentativePhone.Contains(input.LegalRepresentativePhone.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Residence), u => u.Residence.Contains(input.Residence.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.EnterprisePhone), u => u.EnterprisePhone.Contains(input.EnterprisePhone.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MainBusiness), u => u.MainBusiness.Contains(input.MainBusiness.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseEmail), u => u.EnterpriseEmail.Contains(input.EnterpriseEmail.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OperatorName), u => u.OperatorName.Contains(input.OperatorName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OperatorIdCard), u => u.OperatorIdCard.Contains(input.OperatorIdCard.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OperatorIdNumber), u => u.OperatorIdNumber.Contains(input.OperatorIdNumber.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OperatorPhone), u => u.OperatorPhone.Contains(input.OperatorPhone.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.BankName), u => u.BankName.Contains(input.BankName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.BankAccount), u => u.BankAccount.Contains(input.BankAccount.Trim())) .WhereIF(input.CustomerId != null, u => u.CustomerId == input.CustomerId) .WhereIF(input.EstablishmentTimeRange?.Length == 2, u => u.EstablishmentTime >= input.EstablishmentTimeRange[0] && u.EstablishmentTime <= input.EstablishmentTimeRange[1]) .WhereIF(input.steps != null, u => u.steps == input.steps) .Select(); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// /// 获取企业资料详情 ℹ️ /// /// /// [DisplayName("获取企业资料详情")] [ApiDescriptionSettings(Name = "Detail"), HttpGet] public async Task Detail([FromQuery] QueryByIdFBS_CusExtendInput input) { return await _fBS_CusExtendRep.GetFirstAsync(u => u.Id == input.Id); } /// /// 增加企业资料 ➕ /// /// /// [DisplayName("增加企业资料")] [ApiDescriptionSettings(Name = "Add"), HttpPost] public async Task Add(AddFBS_CusExtendInput input) { var entity = input.Adapt(); return await _fBS_CusExtendRep.InsertAsync(entity) ? entity.Id : 0; } /// /// 更新企业资料 ✏️ /// /// /// [DisplayName("更新企业资料")] [ApiDescriptionSettings(Name = "Update"), HttpPost] public async Task Update(UpdateFBS_CusExtendInput input) { var entity = input.Adapt(); await _fBS_CusExtendRep.AsUpdateable(entity) .ExecuteCommandAsync(); } /// /// 删除企业资料 ❌ /// /// /// [DisplayName("删除企业资料")] [ApiDescriptionSettings(Name = "Delete"), HttpPost] public async Task Delete(DeleteFBS_CusExtendInput input) { var entity = await _fBS_CusExtendRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); //await _fBS_CusExtendRep.FakeDeleteAsync(entity); //假删除 await _fBS_CusExtendRep.DeleteAsync(entity); //真删除 } /// /// 批量删除企业资料 ❌ /// /// /// [DisplayName("批量删除企业资料")] [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] public async Task BatchDelete([Required(ErrorMessage = "主键列表不能为空")]List input) { var exp = Expressionable.Create(); foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); var list = await _fBS_CusExtendRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); // return await _fBS_CusExtendRep.FakeDeleteAsync(list); //假删除 return await _fBS_CusExtendRep.DeleteAsync(list); //真删除 } /// /// 导出企业资料记录 🔖 /// /// /// [DisplayName("导出企业资料记录")] [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] public async Task Export(PageFBS_CusExtendInput input) { var list = (await Page(input)).Items?.Adapt>() ?? new(); if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); //var stepsDictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "CusExtendStep" }).Result.ToDictionary(x => x.Value, x => x.Label); //list.ForEach(e => { // e.stepsDictLabel = stepsDictMap.GetValueOrDefault(e.steps ?? CusExtendStep.UNExamine, e.steps); //}); return ExcelHelper.ExportTemplate(list, "企业资料导出记录"); } /// /// 下载企业资料数据导入模板 ⬇️ /// /// [DisplayName("下载企业资料数据导入模板")] [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] public IActionResult DownloadTemplate() { return ExcelHelper.ExportTemplate(new List(), "企业资料导入模板"); } private static readonly object _fBS_CusExtendImportLock = new object(); /// /// 导入企业资料记录 💾 /// /// [DisplayName("导入企业资料记录")] [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] public IActionResult ImportData([Required] IFormFile file) { lock (_fBS_CusExtendImportLock) { var stepsDictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "CusExtendStep" }).Result.ToDictionary(x => x.Label!, x => x.Value); var stream = ExcelHelper.ImportData(file, (list, markerErrorAction) => { _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => { //// 映射字典值 //foreach(var item in pageItems) { // if (string.IsNullOrWhiteSpace(item.stepsDictLabel)) continue; // item.steps = stepsDictMap.GetValueOrDefault(item.stepsDictLabel); // if (item.steps == null) item.Error = "审核步骤字典映射失败"; //} // 校验并过滤必填基本类型为null的字段 var rows = pageItems.Where(x => { if (!string.IsNullOrWhiteSpace(x.Error)) return false; if (x.CustomerId == null){ x.Error = "用户ID不能为空"; return false; } if (!string.IsNullOrWhiteSpace(x.Error)) return false; if (x.steps == null){ x.Error = "审核步骤不能为空"; return false; } return true; }).Adapt>(); var storageable = _fBS_CusExtendRep.Context.Storageable(rows) .SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseType), "企业类型 不能为空") .SplitError(it => it.Item.EnterpriseType?.Length > 255, "企业类型 长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.TransactionCode), "交易主体code不能为空") .SplitError(it => it.Item.TransactionCode?.Length > 255, "交易主体code长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.BusinessLicense), "营业执照文件路径不能为空") .SplitError(it => it.Item.BusinessLicense?.Length > 255, "营业执照文件路径长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseName), "企业名称不能为空") .SplitError(it => it.Item.EnterpriseName?.Length > 255, "企业名称长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.UnifiedSocialCreditCode), "统一社会信用代码不能为空") .SplitError(it => it.Item.UnifiedSocialCreditCode?.Length > 255, "统一社会信用代码长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.RegisteredCapital), "注册资金不能为空") .SplitError(it => it.Item.RegisteredCapital?.Length > 255, "注册资金长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeName), "法定代表人姓名不能为空") .SplitError(it => it.Item.LegalRepresentativeName?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeIdCard), "法定代表人身份证文件路径不能为空") .SplitError(it => it.Item.LegalRepresentativeIdCard?.Length > 255, "法定代表人身份证文件路径长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeIdNumber), "法定代表人姓名不能为空") .SplitError(it => it.Item.LegalRepresentativeIdNumber?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativePhone), "法定代表人姓名不能为空") .SplitError(it => it.Item.LegalRepresentativePhone?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Residence), "企业住所不能为空") .SplitError(it => it.Item.Residence?.Length > 255, "企业住所长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterprisePhone), "企业联系电话不能为空") .SplitError(it => it.Item.EnterprisePhone?.Length > 255, "企业联系电话长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseEmail), "企业邮箱不能为空") .SplitError(it => it.Item.EnterpriseEmail?.Length > 255, "企业邮箱长度不能超过255个字符") .SplitError(it => it.Item.OperatorName?.Length > 255, "业务经办人姓名长度不能超过255个字符") .SplitError(it => it.Item.OperatorIdCard?.Length > 255, "业务经办人身份证文件路径或标识长度不能超过255个字符") .SplitError(it => it.Item.OperatorIdNumber?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => it.Item.OperatorPhone?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.BankName), "法定代表人姓名不能为空") .SplitError(it => it.Item.BankName?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitError(it => string.IsNullOrWhiteSpace(it.Item.BankAccount), "法定代表人姓名不能为空") .SplitError(it => it.Item.BankAccount?.Length > 255, "法定代表人姓名长度不能超过255个字符") .SplitInsert(_ => true) .ToStorage(); storageable.AsInsertable.ExecuteCommand();// 不存在插入 storageable.AsUpdateable.ExecuteCommand();// 存在更新 // 标记错误信息 markerErrorAction.Invoke(storageable, pageItems, rows); }); }); return stream; } } }